/* llvalue -> string array -> (string * string) array -> ExecutionEngine.t -> int */ CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F, value Args, value Env, LLVMExecutionEngineRef EE) { CAMLparam2(Args, Env); int I, NumArgs, NumEnv, EnvSize, Result; const char **CArgs, **CEnv; char *CEnvBuf, *Pos; NumArgs = Wosize_val(Args); NumEnv = Wosize_val(Env); /* Build the environment. */ CArgs = (const char **) malloc(NumArgs * sizeof(char*)); for (I = 0; I != NumArgs; ++I) CArgs[I] = String_val(Field(Args, I)); /* Compute the size of the environment string buffer. */ for (I = 0, EnvSize = 0; I != NumEnv; ++I) { EnvSize += strlen(String_val(Field(Field(Env, I), 0))) + 1; EnvSize += strlen(String_val(Field(Field(Env, I), 1))) + 1; } /* Build the environment. */ CEnv = (const char **) malloc((NumEnv + 1) * sizeof(char*)); CEnvBuf = (char*) malloc(EnvSize); Pos = CEnvBuf; for (I = 0; I != NumEnv; ++I) { char *Name = String_val(Field(Field(Env, I), 0)), *Value = String_val(Field(Field(Env, I), 1)); int NameLen = strlen(Name), ValueLen = strlen(Value); CEnv[I] = Pos; memcpy(Pos, Name, NameLen); Pos += NameLen; *Pos++ = '='; memcpy(Pos, Value, ValueLen); Pos += ValueLen; *Pos++ = '\0'; } CEnv[NumEnv] = NULL; Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv); free(CArgs); free(CEnv); free(CEnvBuf); CAMLreturn(Val_int(Result)); }
SWIGEXPORT jint JNICALL Java_org_jllvm_bindings_ExecutionEngineJNI_LLVMRunFunctionAsMain(JNIEnv *jenv, jclass jcls, jlong jarg1, jlong jarg2, jlong jarg3, jlong jarg4, jlong jarg5) { jint jresult = 0 ; LLVMExecutionEngineRef arg1 = (LLVMExecutionEngineRef) 0 ; LLVMValueRef arg2 = (LLVMValueRef) 0 ; unsigned int arg3 ; char **arg4 = (char **) 0 ; char **arg5 = (char **) 0 ; int result; (void)jenv; (void)jcls; arg1 = *(LLVMExecutionEngineRef *)&jarg1; arg2 = *(LLVMValueRef *)&jarg2; arg3 = (unsigned int)jarg3; arg4 = *(char ***)&jarg4; arg5 = *(char ***)&jarg5; result = (int)LLVMRunFunctionAsMain(arg1,arg2,arg3,(char const *const *)arg4,(char const *const *)arg5); jresult = (jint)result; return jresult; }