summaryrefslogtreecommitdiffstats
path: root/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c
diff options
context:
space:
mode:
authorPeter Zotov <whitequark@whitequark.org>2014-10-25 18:50:02 +0000
committerPeter Zotov <whitequark@whitequark.org>2014-10-25 18:50:02 +0000
commit3944e6e223c90e6c7dc3b54fba2b009d06856cfc (patch)
treed318e77253c779e5477853860ec20eaca2f1f77c /llvm/bindings/ocaml/executionengine/executionengine_ocaml.c
parentd1531a23494e5d9ead23f6640cd39e4ee7f90b39 (diff)
downloadbcm5719-llvm-3944e6e223c90e6c7dc3b54fba2b009d06856cfc.tar.gz
bcm5719-llvm-3944e6e223c90e6c7dc3b54fba2b009d06856cfc.zip
[OCaml] Unbreak Llvm_executionengine.initialize_native_target.
First, return true on success, as it is the OCaml convention. Second, also initialize the native assembly printer, which is, despite the name, required for MCJIT operation. Since this function did not initialize the assembly printer earlier and no function to initialize native assembly printer was available elsewhere, it is safe to break its interface: it means that it simply could not be used successfully before. llvm-svn: 220620
Diffstat (limited to 'llvm/bindings/ocaml/executionengine/executionengine_ocaml.c')
-rw-r--r--llvm/bindings/ocaml/executionengine/executionengine_ocaml.c30
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));
}
OpenPOWER on IntegriCloud