【发布时间】:2016-07-07 13:16:11
【问题描述】:
我正在编写 LLVM IR 代码,我可以在另一个 .ll 文件中调用函数吗?
例如: 在.ll 文件中,有一个函数 foo(); 我可以在 b.ll 中使用这个函数吗,就像调用 foo 一样?如果是这样,我怎样才能包含 a.ll
谢谢
【问题讨论】:
标签: llvm llvm-clang llvm-ir llvm-c++-api llvm-3.0
我正在编写 LLVM IR 代码,我可以在另一个 .ll 文件中调用函数吗?
例如: 在.ll 文件中,有一个函数 foo(); 我可以在 b.ll 中使用这个函数吗,就像调用 foo 一样?如果是这样,我怎样才能包含 a.ll
谢谢
【问题讨论】:
标签: llvm llvm-clang llvm-ir llvm-c++-api llvm-3.0
您需要在调用它的ll文件中添加函数foo的声明,然后像往常一样转换链接ll文件以生成可执行文件
llvm-link a.ll b.ll -o a.out
示例 全部
declare i32 @foo(i32)
define i32 @main() {
start:
%0 = call i32 @foo(i32 0)
ret i32 %0
}
b.ll
define i32 @foo(i32) {
start:
ret i32 %0
}
【讨论】:
我尝试了上述过程,但生成的a.out 文件不是可执行文件。它最初给出Permission denied 错误,在添加适当的权限后说:
-bash: ./a.out: cannot execute binary file
采用相同的两个 llvm 文件,即 a.ll 和 b.ll 对我有用的是:
llvm-link-8 -S a.ll b.ll > hello.ll
llc-8 -filetype=obj hello.ll
clang hello.o
以下 3 个命令创建了一个可以正常执行的可执行文件。第一个命令创建一个名为 hello.ll 的 LLVM 位代码文件,该文件链接 a.ll 和 b.ll。之后,它只是一个从 llvm 位码文件创建可执行二进制文件的过程。接下来的 2 个步骤就是这样做的。 (注意我使用的是 LLVM 8)
【讨论】: