clang常用語法介紹

weixin_33751566發表於2017-09-21

前言

clang提供了一些命令,讓我們可以對編譯的過程進行一些配置和檢視,下面我們就對一些常用的指令進行一個基本的介紹.

常用指令

  • 檢視編譯的步驟
    clang -ccc-print-phases main.m
    輸出結果
0: input, “main.m”, objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, “x86_64”, {5}, image
  • 檢視編譯結果 : clang -rewrite-objc main.m

  • 檢視操作內部命令,可以使用 -### 命令

clang -### main.m -o main

  • 想看清clang的全部過程,可以先通過-E檢視clang在預編譯處理這步做了什麼。

clang -E main.m

clang基本語法介紹

針對下面會用到的語法進行分析

  • -fmodules
    允許modules的語言特性

  • -fsyntax-only
    防止編譯器生成程式碼,只是語法級別的說明和修改

  • -Xclang <arg>
    clang編譯器傳遞引數

  • -dump-tokens
    執行前處理器,拆分內部程式碼段為各種token

  • -ast-dump
    構建抽象語法樹AST,然後對其進行拆解和除錯

  • -S
    只執行預處理和編譯步驟

  • -fobjc-arc
    為OC物件生成retainrelease的呼叫

  • -emit-llvm
    使用LLVM描述彙編和物件檔案

  • -o <file>
    輸出到目標檔案

  • -c
    只執行預處理,編譯和彙編步驟

其餘的就不多贅述了, 檢視更多的clang使用方法可以在終端輸入clang --hep檢視,也可以點選如下連結: clang options

程式碼編譯的執行步驟拆解

下面我們對iOS程式碼編譯的步驟進行一個簡單的拆解,看看內部是如何實現的.

預處理完成後就會進行詞法分析,這裡會把程式碼切成一個個 Token,比如大小括號,等於號還有字串等。
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

然後是語法分析,驗證語法是否正確,然後將所有節點組成抽象語法樹 AST 。
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

完成這些步驟後就可以開始IR(intermediate representation)中間程式碼的生成了,CodeGen 會負責將語法樹自頂向下遍歷逐步翻譯成 LLVM IR,IR 是編譯過程的前端的輸出後端的輸入。
clang -S -fobjc-arc -emit-llvm main.m -o main.ll

這裡 LLVM 會去做些優化工作,在 Xcode 的編譯設定裡也可以設定優化級別-01,-03,-0s,還可以寫些自己的 Pass,官方有比較完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll

Pass 是 LLVM 優化工作的一個節點,一個節點做些事,一起加起來就構成了 LLVM 完整的優化和轉化。
如果開啟了 bitcode 蘋果會做進一步的優化,有新的後端架構還是可以用這份優化過的 bitcode 去生成。
clang -emit-llvm -c main.m -o main.bc

生成彙編
clang -S -fobjc-arc main.m -o main.s

生成目標檔案
clang -fmodules -c main.m -o main.o

生成可執行檔案,這樣就能夠執行看到輸出結果

clang main.o -o main
執行./main
輸出starming rank 14

相關文章