1

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

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

谢谢

4

2 回答 2

4

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

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

示例 a.all

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
}
于 2016-07-08T09:15:23.120 回答
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.llwhich linksa.llb.ll. 之后,它只是一个从 llvm 位码文件创建可执行二进制文件的过程。接下来的 2 个步骤就是这样做的。(请注意,我使用的是 LLVM 8)

于 2019-06-22T13:36:07.210 回答