C++跨平台编译总结之clang二

llvm-clang下载

cmake下载

Clang

clang 是一个以 LLVM 为后端的编译前端。编译前端主要负责 parse 源码、检查错误,并生成抽象语法树 Abstract Syntax Tree (AST)。相较于其他编译器生成的 AST,clang 生成的 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 IR,IR 是编译过程的前端的输出后端的输入。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.ll

  • Pass 是 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 AST

Clang AST 的节点是由几种没有共同基类的类来组成(建模)的,其中比较常用的四种 class 是 Type, Decl, DeclContext, Stmt

C++ 跨平台编译总结-CSDN博客


创作不易,小小的支持一下吧!

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

创作不易,小小的支持一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值