我想使用autotools构建系统将软件编译成LLVM位码;也就是说,我希望最终获得的可执行文件是LLVM的位代码,而不是实际的机器代码. (目标是能够在整个程序中运行LLVM位码分析工具.) 我已经尝
(目标是能够在整个程序中运行LLVM位码分析工具.)
我已经尝试指定CC =“clang -emit-llvm -use-gold-plugins”和变体到配置脚本,没有用.总是出现了一些问题(例如,软件包构建了一个静态库,它被链接器拒绝).
在我看来,正确的方法是LLVM的位代码应该是一个交叉编译的目标.要设置为–host =,但没有这样的标准目标(即使有一个目标为Knuth的MMIX).
到目前为止,我已经使用了kludges,例如用CC =“clang -emit-llvm -use-gold-plugins”进行编译,并手动运行链接行(使用llvm-ld或llvm-link).这适用于简单的包,如grep.
我想要一个强大的方法,适用于大多数(如果不是全部)配置脚本,包括中间.a文件或中间目标.
有一些方法像 this.但对于简单的构建,中间静态库不被使用,那么你可以做一些更简单的事情.你需要的东西的列表是> llvm,配置了金插件支持.参见this
cl
> dragonegg,如果你需要前端Fortran,去等等
关键是在编译时和链接时间之间启用“-flto”作为clang或dragonegg(前端).这是笨蛋:
CC = clang CLINKER = clang CFLAGS = -flto -c CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm
如果需要,请添加其他“-plugin-opt”选项以指定特定于llvm的代码选项:
-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim
转载的整个问题字节码将与您的最终可执行文件一起使用.
使用dragonegg需要另外两件事情.
首先,dragonegg不知道llvm gold插件的位置,它需要在链接器标志中指定,如-Wl,-plugin = / path / to / LLVMgold.so,-plugin-opt = …
其次,dragonegg只能转储IR而不是字节码.您需要一个包装器脚本为此目的.我创造了一个here.对我来说很好.