Clang frontend
Clang将源码转换为LLVM IR 比特码(bitcode)的流程如下:
词法分析(Lexical analysis):
词法分析将代码分解成单词和记号,删除注释,空格,和制表符,根据include/clang/Basic/TokenKinds.def将保留字转化为编译器的内部表示。
此外,词法分析器还进行编译预处理,宏展开。-E选项可以只进行预处理。
$ clang -E test.c -o test2.c && cat test2.c
语法分析(Syntactic analysis):
根据词法分析产生的单词和记号的物理布局将其进行组合,转化为抽象语法树(AST, Abstract Syntax Tree)。
AST的节点主要包括三个类:Decl,Stmt,Type。例如:IfStmt继承自Stmt,FunctionDecl继承自Decl,完整的继承关系可以查看http://clang.llvm.org/doxygen/classclang_1_1Stmt.html。
Clang在生成AST节点时,还会进行类型检查(type check),这是语义分析的内容。
通过下述命令行可以查看AST:
$ clang -fsyntax-only -Xclang -ast-view test.c
将Clang AST序列化到pch文件中可以避免每次编译处理相同的头文件,从而节省编译时间。通过下列命令可以生成pch文件:
$ clang -x c-header test.h -o test.h.pch
通过下列命令使用生成的pch文件:
$ clang -include test.h test.c -o test
语义分析(Semantic analysis):
语义分析通过符号表来保证代码不会违反语言的类型系统(type system),符号表保存着标识符和其类型的映射关系。
语义分析中有一个基类非常重要,DeclContext保存着每个函数域的所有Decl节点。
要查看声明的内容(只会显示TranslationUnitDecl和FunctionDecl中的结果),可以使用以下指令:
$ clang -fsyntax-only -Xclang -print-decl-contexts test.c
生成IR(LLVM IR generator):
语义分析完成后,ParseAST函数调用方法HandleTranslationUnit,触发将要使用AST的客户端。
作者:glob
出处:http://www.cnblogs.com/adera/
欢迎访问我的个人博客:https://blog.globs.site/
本文版权归作者和博客园共有,转载请注明出处。