我希望clang将我的C/C++
代码编译为LLVM
字节码而不是二进制可执行文件。我怎样才能做到这一点?如果我得到LLVM
字节码,我怎么能把它进一步编译成二进制可执行文件。
基本上我想在编译成二进制可执行文件之前将一些自己的代码添加到LLVM
字节码中。
答案 0 :(得分:171)
给出一些C / C ++文件foo.c
:
> clang -S -emit-llvm foo.c
生成foo.ll
这是一个LLVM IR文件。
-emit-llvm
选项也可以通过-cc1
直接传递给编译器前端,而不是驱动程序:
> clang -cc1 foo.c -emit-llvm
使用IR生成foo.ll
。 -cc1
添加了一些很酷的选项,例如-ast-print
。查看-cc1 --help
了解详情。
要进一步将LLVM IR编译为汇编,请使用llc
工具:
> llc foo.ll
使用程序集生成foo.s
(默认为运行它的计算机体系结构)。 llc
是LLVM工具之一 - here is its documentation。
答案 1 :(得分:20)
使用
clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
答案 2 :(得分:18)
如果您有多个源文件,您可能实际上想要使用link-time-optimization为整个程序输出一个bitcode文件。给出的其他答案将使您最终得到每个源文件的bitcode文件。
相反,您希望使用link-time-optimization
进行编译clang -flto -c program1.c -o program1.o
clang -flto -c program2.c -o program2.o
并且对于最后的链接步骤,添加参数-Wl,-plugin-opt = also-emit-llvm
clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program
这为提供了一个已编译的程序和与之对应的bitcode(program.bc)。然后,您可以以任何方式修改program.bc,并随时通过
重新编译修改后的程序clang program.bc -o program
虽然请注意,您需要再次在此步骤中包含任何必要的链接器标志(对于外部库等)。
请注意,您需要使用黄金链接器才能工作。如果要强制clang使用特定链接器,请在计算机某处名为“fakebin”的特殊目录中为名为“ld”的链接器创建符号链接,并添加选项
-B/home/jeremy/fakebin
以上任何连接步骤。
答案 3 :(得分:11)
您是否阅读过clang
documentation?您可能正在寻找-emit-llvm
。
答案 4 :(得分:10)
如果您有多个文件并且不想输入每个文件,我建议您按照这些简单的步骤操作(我使用<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
checkPage();
});
function checkPage(event) {
$("span").text("X: " + event.pageX + ", Y: " + event.pageY);
}
</script>
</head>
<body>
<p>The mouse pointer position is at: <span></span></p>
<p>This is a paragraph.</p>
</body>
</html>
但您可以使用任何其他版本):
生成所有clang-3.8
个文件
.ll
将它们链接到一个
clang-3.8 -S -emit-llvm *.c
(可选)优化代码(可能是一些别名分析)
llvm-link-3.8 -S -v -o single.ll *.ll
生成程序集(生成opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
文件)
optimised.s
创建可执行文件(名为llc-3.8 optimised.ll
)
a.out