我想使用自动工具构建系统LLVM位码编译软件; 也就是说,我想在结束时获得为LLVM位码,而不是实际的机器代码的可执行程序。
(我们的目标是能够在整个程序运行LLVM位码分析工具。)
我已经试过指定CC="clang -emit-llvm -use-gold-plugins"
及其变体的configure
脚本,但无济于事。 总有一些东西去错了(例如包构建.a
静态库,它是由链接拒绝)。
在我看来,正确的方式做这将是LLVM位码应该是一个交叉编译的目标。 要与设置--host=
,但不存在这样的标准目标(即使存在用于Knuth的MMIX一个对象)。
到目前为止我使用组装机,诸如与编译CC="clang -emit-llvm -use-gold-plugins"
并运行连接线(使用llvm-ld
或llvm-link
)手动。 这适用于简单的软件包,如grep
。
我想这是稳健和大多数奏效的方法,如果不是全部,配置脚本,当有中间包括.a
文件,或中间目标。
还有一些类似的方法这样 。 但对于简单的建立在不使用中间静态库,那么你可以做简单的东西。 的事情,你会需要的是列表
- LLVM,配置了黄金插件支持。 参阅本
- 铛
- 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,而不是字节码。 您需要为目的的包装脚本。 我创建了一个在这里 。 对我来说工作正常。