Clang將源碼轉換爲LLVM IR 比特碼(bitcode)的流程以下:html
詞法分析將代碼分解成單詞和記號,刪除註釋,空格,和製表符,根據include/clang/Basic/TokenKinds.def將保留字轉化爲編譯器的內部表示。函數
此外,詞法分析器還進行編譯預處理,宏展開。-E選項能夠只進行預處理。佈局
$ clang -E test.c -o test2.c && cat test2.c
根據詞法分析產生的單詞和記號的物理佈局將其進行組合,轉化爲抽象語法樹(AST, Abstract Syntax Tree)。spa
AST的節點主要包括三個類:Decl,Stmt,Type。例如:IfStmt繼承自Stmt,FunctionDecl繼承自Decl,完整的繼承關係能夠查看http://clang.llvm.org/doxygen/classclang_1_1Stmt.html。命令行
Clang在生成AST節點時,還會進行類型檢查(type check),這是語義分析的內容。code
經過下述命令行能夠查看AST:htm
$ clang -fsyntax-only -Xclang -ast-view test.c
將Clang AST序列化到pch文件中能夠避免每次編譯處理相同的頭文件,從而節省編譯時間。經過下列命令能夠生成pch文件:blog
$ clang -x c-header test.h -o test.h.pch
經過下列命令使用生成的pch文件:
繼承
$ clang -include test.h test.c -o test
語義分析(Semantic analysis):get
語義分析經過符號表來保證代碼不會違反語言的類型系統(type system),符號表保存着標識符和其類型的映射關係。
語義分析中有一個基類很是重要,DeclContext保存着每一個函數域的全部Decl節點。
要查看聲明的內容(只會顯示TranslationUnitDecl和FunctionDecl中的結果),能夠使用如下指令:
$ clang -fsyntax-only -Xclang -print-decl-contexts test.c
生成IR(LLVM IR generator):
語義分析完成後,ParseAST函數調用方法HandleTranslationUnit,觸發將要使用AST的客戶端。