建立autotooled软件LLVM位码(Building autotooled software

2019-09-01 16:18发布

我想使用自动工具构建系统LLVM位码编译软件; 也就是说,我想在结束时获得为LLVM位码,而不是实际的机器代码的可执行程序。

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

我已经试过指定CC="clang -emit-llvm -use-gold-plugins"及其变体的configure脚本,但无济于事。 总有一些东西去错了(例如包构建.a静态库,它是由链接拒绝)。

在我看来,正确的方式做这将是LLVM位码应该是一个交叉编译的目标。 要与设置--host= ,但不存在这样的标准目标(即使存在用于Knuth的MMIX一个对象)。

到目前为止我使用组装机,诸如与编译CC="clang -emit-llvm -use-gold-plugins"并运行连接线(使用llvm-ldllvm-link )手动。 这适用于简单的软件包,如grep

我想这是稳健和大多数奏效的方法,如果不是全部,配置脚本,当有中间包括.a文件,或中间目标。

Answer 1:

还有一些类似的方法这样 。 但对于简单的建立在不使用中间静态库,那么你可以做简单的东西。 的事情,你会需要的是列表

  1. LLVM,配置了黄金插件支持。 参阅本
  2. dragonegg,如果你需要前端的FORTRAN,走,等

关键是要启用或者铛或dragonegg(前端)“-flto”,两者在编译时和链接时。 这是简单的铛:

CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm

如果需要,添加额外的“-plugin,选择”选项来指定特定LLVM-代码生成选项:

-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim

倾销的整个问题的字节码会与您的最终可执行坐在一起。

使用dragonegg当需要两个额外的东西。

首先,dragonegg不知道LLVM黄金插件的位置,它需要在连接器选项中指定这样的-Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...

其次,dragonegg只能够倾倒IR,而不是字节码。 您需要为目的的包装脚本。 我创建了一个在这里 。 对我来说工作正常。



文章来源: Building autotooled software to LLVM bitcode