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