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的客户端。