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

3
我正在编写LLVM IR代码,我能在另一个.ll文件中调用函数吗?
例如: 在a.ll文件中,有一个名为foo()的函数; 我能够在b.ll中使用这个函数,并直接调用它吗?如果可以,我该如何包含a.ll文件?
谢谢。
2个回答

5

在调用函数foo的ll文件中,您需要添加foo函数的声明,然后像往常一样将链接的ll文件转换为可执行文件。

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

example 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
}

非常感谢。但是如果我在a.ll中有一个使用b.ll中的foo()函数的foo2()函数,我可以使用C++ API parseIRFile来提取foo2()函数,并在C++代码中运行它吗?如果可以,怎么做?谢谢。 - He Yucheng

0

我尝试了上述过程,但a.out文件生成的结果不是可执行文件。它一开始会给出Permission denied错误,在添加正确的权限后会显示:

-bash: ./a.out:无法执行二进制文件

对于我来说有效的是采取相同的两个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位码文件创建可执行二进制文件即可,接下来的两个步骤就是这样做的。(请注意,我正在使用LLVM 8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接