将自动化软件构建到LLVM bitcode

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-ldllvm-link).这适用于简单的包,例如grep.

我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a文件或中间目标时.

kul*_*a85 2

有一些这样的方法。但对于不使用中间静态库的简单构建,您可以做一些更简单的事情。您需要的物品清单是

  1. llvm,配置了黄金插件支持。参考这个
  2. Dragonegg,如果您需要 Fortran、Go 等前端。

关键是在编译时和链接时为 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 而不能转储字节码。为此,您需要一个包装脚本。我在这里创建了一个。对我来说效果很好。