[LLVMdev] Having JIT resolve extern "C" functions declared in executible

John McCall rjmccall at apple.com
Thu Jul 2 02:06:19 PDT 2009

On Jul 2, 2009, at 1:05 AM, Carter Cheng wrote:
> I am having some difficulties getting the LLVM JIT to resolve extern  
> "C" functions which I have defined in source file and invoking them  
> via EE::runFunction() after generating a Function prototype for it.  
> Is this possible or do I need to generate a .so for my functions are  
> link against it?

If the JIT needs a pointer to a function, and that function has no  
body, it'll ask the ModuleProvider to materialize the function.  If  
the MP returns false, it'll just ask the dynamic linker for the  
function with that name.  If no such function is linked into your  
program, then the JIT will just give up.  So you have three options:

(1)  You can circumvent this entire process by giving the JIT an  
explicit pointer to the function using JIT::addGlobalMapping().   
Obviously this requires the function to be compiled and linked into  
your program.
(2)  You can compile and link the function into your program in such a  
way that the dynamic linker will find it.
(3)  You can give the JIT a custom module provider which somehow  
materializes IR for the given function.

The highest-performance option is probably #1, but #2 can be more  
convenient.  If the code is totally static, I see no reason to do #3  
unless you really need the IR (e.g. if you want to inline the function).

Is that what you were asking?


More information about the llvm-dev mailing list