为某些C/C ++文件
foo.c
:
:> clang -S -emit-llvm foo.c
produces
foo.ll
是LLVM IR文件。
也可以将选项直接传递给编译器前端,而不是通过
-emit-llvm
:
-cc1
生产IR。
> clang -cc1 foo.c -emit-llvm
添加了一些很酷的选项,例如foo.ll
。查看-cc1
以获取更多详细信息。
要进一步编译LLVM IR以组装,请使用
-ast-print
工具:-cc1 --help
用汇编(默认为您运行的机器架构)生产
llc
)。 > llc foo.ll
。
如果您有多个源文件,则实际上您可能想使用链接时间优化来为整个程序输出一个比特码文件。 给出的其他答案将使您最终为每个源文件提供一个比特码文件。 Instead,您想与链接时间优化编译
foo.s
对于最后的链接步骤,添加参数-wl,-plugin-opt =也添加emit-llvm
llc
tive tive this tove and the tovetovercompered程序和与之相对应的比特码(program.bc)。 然后,您可以以任何方式修改程序。
clang -flto -c program1.c -o program1.o
clang -flto -c program2.c -o program2.o
clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program
在上面的任何链接步骤中。
如果您有多个文件,并且不想键入每个文件,我建议您遵循以下简单步骤(我正在使用
clang program.bc -o program
,但您可以使用任何其他版本):
收集所有
-B/home/jeremy/fakebin
文件
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
diD您阅读
clang-3.8 optimised.s
文档clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
。
首先,让我们理解什么是什么: clang是一个clang
-emit-llvm
给定一些C/C ++文件或任何clang支持的源代码,
front-end, what does it mean by front-end
:
为什么我们给标志> clang -S -emit-llvm eg.c
和
-S
?他们是什么意思?-s =>告诉编译器生成汇编代码后停止并不创建对象文件。
-emit-llvm =>这告诉我们生成llvmir
-emit-llvm
我们将面临错误
> clang -emit-llvm eg.c
因此,答案是是的,我们需要使用两个标志来生成ir
基本命令的一些是
命令
输出文件
输出类型
clang: error: -emit-llvm cannot be used when linking
clang -S hello.c
组装代码
hello.s
clang -emit-llvm -c hello.c
hello.bc
clang -S -emit-llvm hello.c
LLVMBITCODE(二进制格式) | ||
---|---|---|
lllvm ir(人类可读) |