llvm 编译器学习笔记

Clang
c/c++ 编译器, 这里生成的clang并不是一个单独的前端,集成了中后端汇编器的所有功能,和gcc存在区别,clang不需要依赖其他二进制可以单独完成从源文件到目标文件的所有功能

lld
llvm自己开发的链接器,在早期版本,llvm没有自己的链接器,是默认使用gnu binutils,后续开发了自己的链接器lld,现在版本已经默认使用lld。
我们可以看到,产物中有4个lld,其中lld是唯一二进制,其他三个均是软连接。
我们无法运行lld,如果需要链接的话,就必须根据环境运行不同的软连接名称,当然使用clang进行链接的话,clang还是会自动去调用正确的链接器

opt:

中端优化器,被clang集成, 但是可以用它来调试单独的某个pass

llc:

微观意义上的llvm编译器,具有IR->目标文件的所有功能, 集成了汇编器的功能,可以用来调试IR后的llvm逻辑

llvm-mc:

名义上的llvm汇编器,其实具备了双向的功能,可以从汇编语言生成机器码,也可以类似反汇编从机器码生成汇编,另外还有一个与gcc as名字类似的 llvm-as(2者功能完全不一样)(接受LLVM的汇编码(.ll)输出bitcode(.bc)),实际的clang并不会隐式调用其中任何一个二进制

llvm-objdump/objcopy/xxxx: 对标gnu binutils


调试前端
Clang与gcc类似,本身其实是一个driver,内部通过cc1运行前端,如果你直接gdb –args clang xxxx,调试的其实是driver的代码,所以需要调试前端的话,与gcc操作其实是一样的
clang test.c -### 打出cc1命令再进行gdb
调试中后端
因为llvm IR的完全解耦,我们需要调试后端的话,我们不需要从.c->.s,可以直接从IR开始调试,利用clang –emit-llvm –S命令生成IR,gdb调试opt/llc进行中后端代码的调试,这样启动会快一点,并且你可以手动构造特殊场景的IR进行调试,而不必揣测如何通过C代码去生成
如果是打印pass,就用-emit-llvm, -mllvm

 

备注:LLVM 9 及以前,clang分llvmclang, lld, compiler-rt 4个独立的代码仓库。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值