10

我想使用自动工具构建系统将软件编译为 LLVM 位码;也就是说,我希望最后获得的可执行文件是 LLVM 位码,而不是实际的机器码。

(目标是能够在整个程序上运行 LLVM 位码分析工具。)

我已经尝试指定脚本CC="clang -emit-llvm -use-gold-plugins"和变体configure,但无济于事。总是有问题(例如,包构建.a静态库,链接器拒绝)。

在我看来,正确的做法是 LLVM 位码应该是交叉编译目标。设置--host=,但没有这样的标准目标(即使 Knuth 的 MMIX 有一个目标)。

到目前为止,我已经使用了 kludges,例如手动编译CC="clang -emit-llvm -use-gold-plugins"和运行链接线(使用llvm-ldor )。llvm-link这适用于简单的包,例如grep.

我想要一种健壮的方法,并且可以与大多数(如果不是全部)配置脚本一起使用,包括当有中间.a文件或中间目标时。

4

1 回答 1

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

如果需要,添加额外的 '-plugin-opt' 选项来指定 llvm 特定的 codegen 选项:

-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 而不能转储字节码。为此,您需要一个包装脚本。我在这里创建了一个。对我来说很好。

于 2014-02-07T00:25:38.880 回答