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

 

posted @ 2017-09-05 14:10  glob  阅读(813)  评论(0编辑  收藏  举报