![深入理解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=1739284901-K4JJqBidfxA7GQj3oeWLYk2V9qCjg04A-0-6e7241134f12839ab9d776d75a0e37e4)
图1-2 输入代码并选择编程语言
2)选择不同的编译器,并为编译器添加不同的编译选项,例如选择Clang版本,添加命令行参数-emit-llvm -S用于生成LLVM IR,如图1-3所示。
![](https://epubservercos.yuewen.com/1A9101/31372409403249606/epubprivate/OEBPS/Images/0020-02.jpg?sign=1739284901-kXXoj06eqJvVuC3WcF1MN2cSVHVGQO4U-0-488b25b535b352bbdc10397e70d2cd64)
图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=1739284901-h9XfE4YwW4avoQc7V8lBOoW1DLtbDltc-0-0282ff53c4d13a297054df812b8f0cac)
图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=1739284901-rV2VLHzmNrtQTt0gurdgP0gIdvGX81oU-0-00bfbe50ed8dd0c8bf388ae71ba54054)
图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=1739284901-gmC9Z1btILA9FVqaRQrgDFMHC5QR6HdT-0-2409bbc319f26b59e880a1f3e919cd54)
图1-6 输出所有涉及的Pass