內容如下
set clang_exe=e:\workspace\llvm-project-master\clang\out\install\x64-release\bin&
set path=%path%;%clang_exe%;
上面那個testclangpro 是我建立的目錄,裡面放一些測試的例子。
在檔案視窗shift + 滑鼠右鍵 "在此處開啟命令列視窗" 執行當前設定的指令碼
當前環境變數設定成功。這是乙個cmd的環境變數,關閉此cmd視窗後自動清空當前設定的環境變數。
檢查clang.exe 是否能引用 輸入 clang --version
剛才建立的 testclangpro 資料夾下 建立檔案compstream.cpp ,盡量寫得簡單一些,後面ast語法樹可能還會用到,**如下:
#include int main()
, c++-cpp-output //預處理
2: compiler, , ir //解碼為 ir 格式
3: backend, , assembler //傳遞給後端生成彙編**
4: assembler, , object //彙編**生成目標檔案
5: linker, , image //連線成可執行檔案
以上clang的操作正好對應 gcc的幾個編譯流程
1、預處理:gcc -e project.c -o project.i //生成預處理檔案 (clang 0-2)
2、編譯: gcc -s project.i -o project.s //生成彙編檔案 (clang 3)
3、彙編: gcc -c project.s -o project.o //生成機器語言 (clang 4)
檔案 =》前端=》ir =》後端 =》可執行程式
那麼這個ir是個什麼東西?
簡而言之,前端實現語言識別,後端實現**平台適應。而ir則是鏈結前後端的通用約定。ir存在兩種檢視格式
1.可閱讀的格式
2.內部格式 (可通過exe的反彙編檢視,相當於彙編**,具體封裝不予深究)
新增llvm環境到 clangsetenvpath.cmd (llvm也是vs2019編譯安裝的)
set clang_path=e:\workspace\llvm-project-master\clang\out\install\x64-release\bin&關閉之前的cmd,shift + 滑鼠右鍵開啟cmd 執行指令碼,結果如下set llvm_path=e:\workspace\llvm-project-master\llvm\out\install\x64-release\bin&
set path=%path%;%clang_path%;%llvm_path%;
進入testclangpro下執行
上訴命令將生成ir的可讀格式,下面通過notepad++ 開啟。直接定位main語句。
ir檔案解析
; function attrs: noinline norecurse optnone uwtable
define dso_local i32 @main() #0
可能跟咱們預想中的**流程有差異,不過也不難理解,畢竟電腦不像人腦那麼智慧型
其他指令
clang -e src.cpp 輸出預處理結果
clang -fmodules -e xclang -dump-tokens src.cpp 關鍵字分析(詞法分析)
clang -fmodules -fsyntax-only -xclang -ast-dump src.cpp 語法分析
AQS框架基本流程
我們先來看一下這個併發框架的原理,在之後的文章中我們將乙個乙個的分析那些有用的實現。public final void acquire int arg 這個方法是獲取到資源的入口,首先他會嘗試來獲取arg個資源,如果沒有獲取成功,就會呼叫後面的方法將這次請求放到乙個同步佇列裡面,如果都失敗了,就會呼...
spring mvc框架及基本流程
原創 傳統原生的jsp servlet在開發上過程上雖然簡單明瞭,jsp頁面傳遞資料到servlet,servlet整理資料 邏輯開發 或者從資料庫提取資料接著再 到jsp頁面上,但是其似乎只能止步於此,我們都知道我們request和response都依賴於url,當我們想要通過針對圍繞url進行程...
開源編譯器框架 LLVM 6 0 0 來了
llvm開源編譯器框架的6.0.0版本已經發布。這個版本是過去六個月社群工作的結果,其中包括 retpoline spectre variant 2 漏洞緩解,顯著改進了windows的codeview除錯資訊,預設情況下globalisel在 o0的aarch64,多個x86微架構上的排程改進,c...