LLVM IR:如何在另一个.ll文件中调用函数

时间:2016-07-07 13:16:11

标签: llvm llvm-clang llvm-ir llvm-c++-api llvm-3.0

我正在编写LLVM IR代码,我可以在另一个.ll文件中调用函数吗?

例如: 在a.ll文件中,有一个函数foo(); 我可以在b.ll中使用此功能,就像调用foo一样吗?如果是这样,我怎么能包括a.ll

由于

2 个答案:

答案 0 :(得分:3)

你需要在你调用它的ll文件中添加函数foo的声明,然后像往常一样转换链接ll文件来生成可执行文件

 llvm-link a.ll b.ll -o a.out

示例 a.ll

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
}

答案 1 :(得分:0)

我尝试了上述过程,但是生成的a.out文件不是可执行文件。最初会出现Permission denied错误,并在添加适当的权限后显示:

-bash: ./a.out: cannot execute binary file

使用相同的两个llvm文件,即a.llb.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.llb.ll。在那之后,它仅仅是从llvm位代码文件创建可执行二进制文件的过程。接下来的2个步骤可以做到。 (请注意,我正在使用LLVM 8)