[LLVMdev] LLVM-C: Calling functions contained in other libraries

F van der Meeren llvm-dev at code2develop.com
Thu Aug 12 10:43:23 PDT 2010


Hello,

I have a question concerning llvm-c.
I have set up a function that needs to invoke an external method, in a other library. It has the following signature: void* NSFullUserName(void);
The void* can be replaced with a i8*, that far I was able to get, but when my call is invoked, the engine gives me the following message:

LLVM ERROR: Tried to execute an unknown external function: i8* ()* NSFullUserName

I have dumped the module (without the clutter):

declare i8* @NSFullUserName()

define i8* @MyFunction() {
entrypoint:
  %myCall = call i8* @NSFullUserName()            ; <i8*> [#uses=1]
  ret i8* %myCall
}

Where am I going wrong here?

To add some code to my previous question:

LLVMTypeRef i8Ptr(void) {
    return LLVMPointerType(LLVMInt8Type(), 0);
}

LLVMValueRef d(LLVMModuleRef module) {
    LLVMValueRef result;
    LLVMBasicBlockRef block;
    LLVMBuilderRef builder = LLVMCreateBuilder();
    
    LLVMValueRef fullUsername = LLVMAddFunction(module, "NSFullUserName", LLVMFunctionType(LLVMPointerType(LLVMInt8Type(), 0), NULL, 0, 0));
    LLVMSetLinkage(fullUsername, LLVMExternalLinkage);
    
    result = LLVMAddFunction(module, "MyFunction", LLVMFunctionType(i8Ptr(), NULL, 0, 0));
    block = LLVMAppendBasicBlock(result, "entrypoint");
    LLVMPositionBuilderAtEnd(builder, block);
    
    LLVMValueRef returnVal = LLVMBuildCall(builder, fullUsername, NULL, 0, "myCall");
    LLVMBuildRet(builder, returnVal);
    
    LLVMDisposeBuilder(builder);
    return result;
}


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    char * error = NULL;
    LLVMExecutionEngineRef engine;
    LLVMModuleRef module = LLVMModuleCreateWithName("MyModule");
    
    LLVMValueRef toCall = d(module);
    
    LLVMDumpModule(module);
    
    LLVMLinkInInterpreter();
    LLVMCreateInterpreterForModule(&engine, module, &error);
    
    LLVMGenericValueRef result = LLVMRunFunction(engine, toCall, 0, NULL);
    
    LLVMDisposeModule(module);
    [pool drain];
    return 0;
}


Thank you,

Filip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100812/388c33da/attachment.html>


More information about the llvm-dev mailing list