diff options
Diffstat (limited to 'llvm/bindings/ocaml/executionengine/executionengine_ocaml.c')
-rw-r--r-- | llvm/bindings/ocaml/executionengine/executionengine_ocaml.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c b/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c index 49e64f39266..8388233a356 100644 --- a/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c +++ b/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c @@ -32,7 +32,9 @@ void llvm_initialize(void) { /* unit -> bool */ CAMLprim value llvm_initialize_native_target(value Unit) { - return Val_bool(LLVMInitializeNativeTarget()); + return Val_bool(!LLVMInitializeNativeTarget() && + !LLVMInitializeNativeAsmParser() && + !LLVMInitializeNativeAsmPrinter()); } /* Can't use the recommended caml_named_value mechanism for backwards @@ -48,10 +50,10 @@ CAMLprim value llvm_register_ee_exns(value Error) { static void llvm_raise(value Prototype, char *Message) { CAMLparam1(Prototype); CAMLlocal1(CamlMessage); - + CamlMessage = copy_string(Message); LLVMDisposeMessage(Message); - + raise_with_arg(Prototype, CamlMessage); abort(); /* NOTREACHED */ #ifdef CAMLnoreturn @@ -258,14 +260,14 @@ CAMLprim value llvm_ee_run_function(LLVMValueRef F, value Args, unsigned NumArgs; LLVMGenericValueRef Result, *GVArgs; unsigned I; - + NumArgs = Wosize_val(Args); GVArgs = (LLVMGenericValueRef*) malloc(NumArgs * sizeof(LLVMGenericValueRef)); for (I = 0; I != NumArgs; ++I) GVArgs[I] = Genericvalue_val(Field(Args, I)); - + Result = LLVMRunFunction(EE, F, NumArgs, GVArgs); - + free(GVArgs); return alloc_generic_value(Result); } @@ -291,21 +293,21 @@ CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F, 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); @@ -315,7 +317,7 @@ CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F, *Value = String_val(Field(Field(Env, I), 1)); int NameLen = strlen(Name), ValueLen = strlen(Value); - + CEnv[I] = Pos; memcpy(Pos, Name, NameLen); Pos += NameLen; @@ -325,13 +327,13 @@ CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F, *Pos++ = '\0'; } CEnv[NumEnv] = NULL; - + Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv); - + free(CArgs); free(CEnv); free(CEnvBuf); - + CAMLreturn(Val_int(Result)); } |