Dav*_*aux 10 autotools llvm llvm-clang
我想使用autotools构建系统将软件编译为LLVM bitcode; 也就是说,我希望最后获得的可执行文件是LLVM bitcode,而不是实际的机器代码.
(目标是能够在整个程序上运行LLVM bitcode分析工具.)
我已经尝试过CC="clang -emit-llvm -use-gold-plugins"
为configure
脚本指定和变种,但无济于事.总会出现问题(例如,包构建.a
静态库,链接器拒绝这些库).
在我看来,正确的方法是LLVM bitcode应该是一个交叉编译目标.要设置--host=
,但没有这样的标准目标(即使Knuth的MMIX有目标).
到目前为止,我已经使用过kludges,例如手动编译CC="clang -emit-llvm -use-gold-plugins"
和运行链接线(使用llvm-ld
或llvm-link
).这适用于简单的包,例如grep
.
我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a
文件或中间目标时.
有一些这样的方法。但对于不使用中间静态库的简单构建,您可以做一些更简单的事情。您需要的物品清单是
关键是在编译时和链接时为 clang 或 Dragonegg(前端)启用“-flto”。对于 clang 来说这很简单:
CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm
Run Code Online (Sandbox Code Playgroud)
如果需要,添加额外的“-plugin-opt”选项来指定 llvm 特定的 codegen 选项:
-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim
Run Code Online (Sandbox Code Playgroud)
转储的整个问题字节码将与您的最终可执行文件一起放置。
使用龙蛋时还需要两件事。
首先,dragonegg 不知道 llvm gold 插件的位置,它需要在链接器标志中指定,如下所示-Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...
其次,dragonegg 只能转储 IR 而不能转储字节码。为此,您需要一个包装脚本。我在这里创建了一个。对我来说效果很好。
归档时间: |
|
查看次数: |
1073 次 |
最近记录: |