Reputation: 31
I am writing LLVM IR code, can I call a function in another .ll file?
For example: In a.ll file, there is a function foo(); Can I use this function in b.ll, like just call foo? If so, how can I include a.ll
Thanks
Upvotes: 3
Views: 2597
Reputation: 2311
I tried the above procedure but the a.out
file produced is not an executable. It initially gives a Permission denied
error and after adding the appropriate permissions says:
-bash: ./a.out: cannot execute binary file
Taking the same two llvm files i.e a.ll
and b.ll
what works for me is:
llvm-link-8 -S a.ll b.ll > hello.ll
llc-8 -filetype=obj hello.ll
clang hello.o
The following 3 commands creates an executable which executes fine. The first command creates an LLVM bitcode file called hello.ll
which links a.ll
and b.ll
. After that it is simply a process of creating an executable binary from an llvm bitcode file. which the next 2 steps do. (Note that I am using LLVM 8)
Upvotes: 0
Reputation: 1161
You need to add declaration of function foo in the ll file in which you are calling it, then as usual convert link ll files to generate executable
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
}
Upvotes: 5