如何使Clang编译到LLVMIR

问题描述 投票:0回答:6
我想在将我自己的一些代码添加到LLVM比特码之前,然后将其编译到二进制可执行文件中。

为某些C/C ++文件

foo.c

c clang llvm bitcode
6个回答
273
投票
> 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
是LLVM工具之一-CONTISTIONTIATION


如果您有多个源文件,则实际上您可能想使用链接时间优化来为整个程序输出一个比特码文件。 给出的其他答案将使您最终为每个源文件提供一个比特码文件。 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


30
投票
注意,您需要使用黄金链接器才能起作用。 如果您想强迫Clang使用特定的链接器,请在计算机上某个地方的特殊目录中为该链接器创建一个名为“ fakebin”的链接器的符号链接,然后添加选项

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


29
投票

(可选)优化您的代码(也许是一些别名分析)

clang-3.8 -S -emit-llvm *.c

  1. 代理程序集(生成一个

    llvm-link-3.8 -S -v -o single.ll *.ll
    
    文件)

    opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
    
  2. 创建可执行文件(命名

    optimised.s
  3. llc-3.8 optimised.ll
  4. 
    
  5. 使用
  6. a.out

    
    diD您阅读

    clang-3.8 optimised.s
    
    文档
  7. ?您可能正在寻找
  8. clang -emit-llvm -o foo.bc -c foo.c clang -o foo foo.bc

    
    首先,让我们理解什么是什么:

    clang是一个
    clang
  9. -emit-llvm
前端=源 - > ast->ir

24
投票
现在你的问题

给定一些C/C ++文件或任何clang支持的源代码,

front-end, what does it mean by front-end

14
投票

为什么我们给标志> clang -S -emit-llvm eg.c

-S?他们是什么意思?
-s =>告诉编译器生成汇编代码后停止并不创建对象文件。

-emit-llvm =>这告诉我们生成llvmir

0
投票
现在,问题来了:我们需要给两个旗帜吗? 如果我们只使用命令

-emit-llvm

我们将面临错误
> clang -emit-llvm eg.c

表示,我们不能将flag -emit -llvm用于链接目的,只为了汇编目的,我们应该使用。

因此,答案是是的,我们需要使用两个标志来生成ir
基本命令的一些是


命令

输出文件
输出类型

clang: error: -emit-llvm cannot be used when linking

clang -S hello.c

组装代码

hello.s

clang -emit-llvm -c hello.chello.bcclang -S -emit-llvm hello.c
LLVMBITCODE(二进制格式)
lllvm ir(人类可读)

    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.