我正在编写LLVM IR代码,我能在另一个.ll文件中调用函数吗?
例如: 在a.ll文件中,有一个名为foo()的函数; 我能够在b.ll中使用这个函数,并直接调用它吗?如果可以,我该如何包含a.ll文件?
谢谢。
例如: 在a.ll文件中,有一个名为foo()的函数; 我能够在b.ll中使用这个函数,并直接调用它吗?如果可以,我该如何包含a.ll文件?
谢谢。
在调用函数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.out
文件生成的结果不是可执行文件。它一开始会给出Permission denied
错误,在添加正确的权限后会显示:
-bash: ./a.out:无法执行二进制文件
对于我来说有效的是采取相同的两个llvm文件,即a.ll
和b.ll
:
llvm-link-8 -S a.ll b.ll > hello.ll
llc-8 -filetype=obj hello.ll
clang hello.o
hello.ll
的LLVM位码文件,它链接了a.ll
和b.ll
。之后只需从llvm位码文件创建可执行二进制文件即可,接下来的两个步骤就是这样做的。(请注意,我正在使用LLVM 8)