[LLVMdev] using external functions from llvm

Nick Lewycky nicholas at mxc.ca
Thu Aug 19 22:37:08 PDT 2010

Alec Benzer wrote:
> The blog post I linked to implied that adding a symbol in the form
> lle_X_FUNCTIONNAME would allow you to call a function called
> FUNCTIONNAME. Is this not the case?

It is not. I haven't read the blog post, but I recognize the lle_X_ 
format as part of the internals of the llvm interpreter. If you were 
modifying the internals of the interpreter, then this might work.

If you want to JIT (or even use the interpreter with libffi) and call 
functions declared in your program, you write your function *normally*. 
No renaming, certainly no GenericValue cruft. Please see the tutorial at 
llvm.org/docs/tutorial/, in particular chapter 4 where they demo doing 
exactly this.


> On Thu, Aug 19, 2010 at 6:46 PM, <o.j.sivart at gmail.com
> <mailto:o.j.sivart at gmail.com>> wrote:
>     You are adding the symbol as "lle_X_create_number_object" yet your
>     error message implies you have tried to lookup and use
>     "create_number_object". Can you provide the code for the lookup?
>     On 20/08/2010, at 8:07 AM, Alec Benzer wrote:
>>     Is there documentation somewhere on how to call external functions
>>     from llvm? The only guide I found was this:
>>     http://www.gearleaf.com/blog/post/44, and it doesn't seem to be
>>     working for me.
>>     I have a function:
>>     llvm::GenericValue lle_X_create_number_object(llvm::FunctionType*
>>     ft, const std::vector<llvm::GenericValue>& args)
>>     {
>>       llvm_object_structure* result = new llvm_object_structure;
>>       result->typeIdx = TypeSystem::number;
>>       result->data = reinterpret_cast<unsigned char*>(new
>>     double(args[0].DoubleVal));
>>       llvm::GenericValue gv;
>>       gv.PointerVal = reinterpret_cast<void*>(result);
>>       return gv;
>>     }
>>     defined in an extern "C" block. I add it as a symbol with:
>>     llvm::sys::DynamicLibrary::AddSymbol("lle_X_create_number_object",(void*)lle_X_create_number_object);
>>     yet when attempting to call it I still get: "LLVM ERROR: Program
>>     used external function 'create_number_object' which could not be
>>     resolved!"
>>     _______________________________________________
>>     LLVM Developers mailing list
>>     LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>     http://llvm.cs.uiuc.edu
>>     http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

More information about the llvm-dev mailing list