LLVM 的編譯框架基本流程探索(Clang)

2021-09-26 05:22:43 字數 2476 閱讀 5345

內容如下

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&

set llvm_path=e:\workspace\llvm-project-master\llvm\out\install\x64-release\bin&

set path=%path%;%clang_path%;%llvm_path%;

關閉之前的cmd,shift + 滑鼠右鍵開啟cmd 執行指令碼,結果如下

進入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...