-->

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

2019-09-18 23:38发布

问题:

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

回答1:

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
}


回答2:

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)