diff --git a/bindings/ocaml/executionengine/executionengine_ocaml.c b/bindings/ocaml/executionengine/executionengine_ocaml.c index 49e64f39266..8388233a356 100644 --- a/bindings/ocaml/executionengine/executionengine_ocaml.c +++ b/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)); } diff --git a/test/Bindings/Ocaml/executionengine.ml b/test/Bindings/Ocaml/executionengine.ml index 84604ddbaec..1abd7c4e6a6 100644 --- a/test/Bindings/Ocaml/executionengine.ml +++ b/test/Bindings/Ocaml/executionengine.ml @@ -19,6 +19,9 @@ let i32_type = Llvm.i32_type context let i64_type = Llvm.i64_type context let double_type = Llvm.double_type context +let () = + assert (Llvm_executionengine.initialize_native_target ()) + let bomb msg = prerr_endline msg; exit 2