LLVM IR: How to call a function in another .ll file

2.3k Views Asked by At

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

2

There are 2 best solutions below

1
Chirag Patel On

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
}
0
Abhiroop Sarkar On

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)