3

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

He Yucheng
  • 31
  • 3

2 Answers2

5

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
}
Chirag Patel
  • 1,141
  • 1
  • 11
  • 23
  • Thank you very much. But if I have a function foo2() in a.ll which use foo() in b.ll, can I use C++ API parseIRFile to extract the foo2() function, and make it run in c++ code? If so, how? Thanks. – He Yucheng Jul 08 '16 at 13:30
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)

Abhiroop Sarkar
  • 2,251
  • 1
  • 26
  • 45