<div dir="ltr"><div>Hi, I'm attempting to use MCJIT with the C interface with llvm-3.9.0, and it doesn't seem to work. This code is derived from Paul Smith's example code:<br><br>int main(int argc, char const* argv[]) {<br><br>  LLVMModuleRef mod = LLVMModuleCreateWithName("my_module");<br><br>  LLVMTypeRef param_types[] = {LLVMInt32Type(), LLVMInt32Type()};<br>  LLVMTypeRef ret_type = LLVMFunctionType(LLVMInt32Type(), param_types, 2, 0);<br>  LLVMValueRef sum = LLVMAddFunction(mod, "sum", ret_type);<br><br>  LLVMBasicBlockRef entry = LLVMAppendBasicBlock(sum, "entry");<br><br>  LLVMBuilderRef builder = LLVMCreateBuilder();<br>  LLVMPositionBuilderAtEnd(builder, entry);<br>  LLVMValueRef tmp = LLVMBuildAdd(builder, LLVMGetParam(sum, 0), LLVMGetParam(sum, 1), "tmp");<br>  LLVMBuildRet(builder, tmp);<br><br>  char* error = NULL;<br>  LLVMVerifyModule(mod, LLVMAbortProcessAction, &error);<br>  LLVMDisposeMessage(error);<br><br>  LLVMExecutionEngineRef engine;<br>  error = NULL;<br>  LLVMLinkInMCJIT();<br>  LLVMInitializeNativeTarget();<br>  LLVMInitializeNativeAsmPrinter();<br>  LLVMInitializeNativeAsmParser();<br><br>  if (LLVMCreateExecutionEngineForModule(&engine, mod, &error) != 0) {<br>    fprintf(stderr, "failed to create execution engine\n");<br>    abort();<br>  }<br>  if (error) {<br>    fprintf(stderr, "error: %s\n", error);<br>    LLVMDisposeMessage(error);<br>    exit(EXIT_FAILURE);<br>  }<br><br>  if (argc < 3) {<br>    fprintf(stderr, "usage: %s x y\n", argv[0]);<br>    exit(EXIT_FAILURE);<br>  }<br>  long long x = strtoll(argv[1], NULL, 10);<br>  long long y = strtoll(argv[2], NULL, 10);<br><br>  LLVMGenericValueRef args[] = {LLVMCreateGenericValueOfInt(LLVMInt32Type(), x, 0),<br>                                LLVMCreateGenericValueOfInt(LLVMInt32Type(), y, 0)};<br><br>  printf("args[0]: %d\n", (int)LLVMGenericValueToInt(args[0], 0));<br>  printf("args[1]: %d\n", (int)LLVMGenericValueToInt(args[1], 0));<br><br>  LLVMGenericValueRef res = LLVMRunFunction(engine, sum, 2, args);<br><br>  printf("result: %d\n", (int)LLVMGenericValueToInt(res, 0));<br><br>  LLVMDumpModule(mod);<br><br>  // Write out bitcode to file<br>  if (LLVMWriteBitcodeToFile(mod, "sum.bc") != 0) { fprintf(stderr, "error writing bitcode to file, skipping\n"); }<br><br>  LLVMDisposeBuilder(builder);<br>  LLVMDisposeExecutionEngine(engine);<br>}<br><br></div><div>Here's what I see when I run it:<br>$ ./capi_test 5 6<br>args[0]: 5<br>args[1]: 6<br>result: 5<br>; ModuleID = 'my_module'<br>source_filename = "my_module"<br>target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br><br>define i32 @sum(i32, i32) {<br>entry:<br>  %tmp = add i32 %0, %1<br>  ret i32 %tmp<br>}<br><br></div><div>It seems to fail to add, and always returns the first argument.<br></div><div>Any help greatly appreciated.<br><br></div><div>Toshi<br><br></div></div>