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

相关文章
相关标签/搜索