![深入理解LLVM:代码生成](https://wfqqreader-1252317822.image.myqcloud.com/cover/721/52803721/b_52803721.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4 LLVM在线工具
如果读者不想构建LLVM,也可以使用在线工具Complier Explorer(https://godbolt.org)学习LLVM各种功能和代码变化。该在线工具可以直观地比较优化前后的代码变化情况,支持多种语言作为输入,也支持LLVM IR、LLVM MIR(Machine IR)作为输入,该工具可以选择不同的编译器进行编译。
1)Compiler Explorer初始界面如图1-2所示,可以选择不同的编程语言。
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0020-01.jpg?sign=1738867727-YYhygAGjV85V5S2BId5UCHYkDeRvWJFh-0-11fb429ac71f458b8a6c1d49af4d3b0b)
图1-2 输入代码并选择编程语言
2)选择不同的编译器,并为编译器添加不同的编译选项,例如选择Clang版本,添加命令行参数-emit-llvm -S用于生成LLVM IR,如图1-3所示。
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0020-02.jpg?sign=1738867727-2ErRRYCaP8Gdi17BuM4RKDXGta5aZCn8-0-bc3f671d0d46b430de1da21f6bfa9031)
图1-3 选择编译器并添加编译选项
3)本书主要关注代码生成,对应的命令行入口是llc。llc使用LLVM IR作为输入,如果要生成BPF后端代码,可以在编译选项中填入-march=bpf,如图1-4所示。
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0021-01.jpg?sign=1738867727-T3miXdZzGQgdwRi1eFtPkEJ4Wkr69Gkj-0-3aee83954b2cdab145e79633894d87a5)
图1-4 配置编译选项
选择Add new视图下的LLVM Opt Pipeline选项(见图1-5),可以展示Clang编译过程使用的Pass(参见附录C)。
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0021-02.jpg?sign=1738867727-INpGJdEq3rvBltlh24kvtBzPfumHAtB5-0-16e65f7065c2bea174bb27fedc2026c5)
图1-5 选择LLVM Opt Pipeline
得到的结果如图1-6所示,在LLVM Opt Pipeline视图中,第一列是所有Pass,右侧两列是某一Pass的输入和输出。如果IR经过某个Pass处理后发生变化,在LLVM Opt Pipeline中使用高亮的绿色表示变化,右侧两列会提示变化的情况。(因印刷缘故,绿色、粉色都变成浅灰色,请读者注意。而在实际网页中,粉底色表示删除、绿色表示添加。)
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0022-01.jpg?sign=1738867727-ycIu0ghfu3Vdh5zW7qlHbvuzsUzyriB0-0-90e35703c4848a40354d7ee560563054)
图1-6 输出所有涉及的Pass