llvm-clang下载cmake下载Clangclang 是一个以 LLVM 为后端的编译前端。编译前端主要负责 parse 源码、检查错误并生成抽象语法树 Abstract Syntax Tree (AST)。相较于其他编译器生成的 ASTclang 生成的 AST 更加接近 C 源码所以我们可以更加准确地在源码中进行查找和定位。并且clang 还提供了丰富的库和 API让我们能在 AST 上很方便地做遍历搜索和修改等操作。我们在 vscode 上用的代码自动补全工具 clangd或 vim 的 YouCompleteMe就是用 clang 来实现的。# 查看编译的步骤 $ clang -ccc-print-phases main.m 0: input, “main.m”, objective-c 1: preprocessor, {0}, objective-c-cpp-output 2: compiler, {1}, ir 3: backend, {2}, assembler 4: assembler, {3}, object 5: linker, {4}, image 6: bind-arch, “x86_64”, {5}, image # 查看编译结果 $ clang -rewrite-objc main.m # 查看操作内部命令可以使用 -### 命令 $ clang -### main.m -o main预处理完成后就会进行词法分析这里会把代码切成一个个 Token比如大小括号等于号还有字符串等。clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m。然后是语法分析验证语法是否正确然后将所有节点组成抽象语法树 AST。clang -fmodules -fsyntax-only -Xclang -ast-dump main.m完成这些步骤后就可以开始 IR(intermediate representation)中间代码的生成了CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IRIR 是编译过程的前端的输出后端的输入。clang -S -fobjc-arc -emit-llvm main.m -o main.ll这里 LLVM 会去做些优化工作在 Xcode 的编译设置里也可以设置优化级别-01-03-0s还可以写些自己的 Pass官方有比较完整的 Pass 教程Writing an LLVM Pass — LLVM 5 documentation 。clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.llPass 是 LLVM 优化工作的一个节点一个节点做些事一起加起来就构成了 LLVM 完整的优化和转化。如果开启了 bitcode 苹果会做进一步的优化有新的后端架构还是可以用这份优化过的 bitcode 去生成。clang -emit-llvm -c main.m -o main.bc生成汇编。clang -S -fobjc-arc main.m -o main.s生成目标文件。clang -fmodules -c main.m -o main.o一般什么时候会用到 Clang需要基于编译器的 AST 对源码做精确的编辑自动纠正不符合 coding style 的源码需要引入自定义的编译错误和警告禁止用裸指针创建共享指针声明了变量但是没有使用基于 C/C 源码的代码生成(code generation)自动生成数据结构的序列化方法反射方法Clang ASTClang AST 的节点是由几种没有共同基类的类来组成建模的其中比较常用的四种 class 是 Type, Decl, DeclContext, StmtC 跨平台编译总结-CSDN博客创作不易小小的支持一下吧
阅读完成 · 觉得有帮助?