将自动化软件构建到LLVM bitcode

时间:2013-05-01 20:13:35

标签: llvm autotools 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文件或中间目标时。

1 个答案:

答案 0 :(得分:3)

有一些方法,如this。但对于不使用中间静态库的简单构建,您可以做一些更简单的事情。您需要的东西是

  1. llvm,配置了黄金插件支持。请参阅this
  2. dragonegg,如果你需要Fortran的前端,去等等。
  3. 关键是在编译时和链接时为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而不是字节码。您需要一个用于此目的的包装脚本。我创建了一个here。对我来说很好。