Clang frontend

  Clang將源碼轉換爲LLVM IR 比特碼(bitcode)的流程以下:html

  

詞法分析(Lexical analysis):

  詞法分析將代碼分解成單詞和記號,刪除註釋,空格,和製表符,根據include/clang/Basic/TokenKinds.def將保留字轉化爲編譯器的內部表示。函數

  此外,詞法分析器還進行編譯預處理,宏展開。-E選項能夠只進行預處理。佈局

  $ clang -E test.c -o test2.c && cat test2.c

語法分析(Syntactic analysis):

  根據詞法分析產生的單詞和記號的物理佈局將其進行組合,轉化爲抽象語法樹(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的客戶端。

相關文章
相關標籤/搜索