[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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Peter Zotov 2014-10-25 18:50:02 +00:00
parent 60d3f5918d
commit 0ce2ef8c2d
2 changed files with 19 additions and 14 deletions

View File

@ -32,7 +32,9 @@ void llvm_initialize(void) {
/* unit -> bool */ /* unit -> bool */
CAMLprim value llvm_initialize_native_target(value Unit) { 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 /* 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) { static void llvm_raise(value Prototype, char *Message) {
CAMLparam1(Prototype); CAMLparam1(Prototype);
CAMLlocal1(CamlMessage); CAMLlocal1(CamlMessage);
CamlMessage = copy_string(Message); CamlMessage = copy_string(Message);
LLVMDisposeMessage(Message); LLVMDisposeMessage(Message);
raise_with_arg(Prototype, CamlMessage); raise_with_arg(Prototype, CamlMessage);
abort(); /* NOTREACHED */ abort(); /* NOTREACHED */
#ifdef CAMLnoreturn #ifdef CAMLnoreturn
@ -258,14 +260,14 @@ CAMLprim value llvm_ee_run_function(LLVMValueRef F, value Args,
unsigned NumArgs; unsigned NumArgs;
LLVMGenericValueRef Result, *GVArgs; LLVMGenericValueRef Result, *GVArgs;
unsigned I; unsigned I;
NumArgs = Wosize_val(Args); NumArgs = Wosize_val(Args);
GVArgs = (LLVMGenericValueRef*) malloc(NumArgs * sizeof(LLVMGenericValueRef)); GVArgs = (LLVMGenericValueRef*) malloc(NumArgs * sizeof(LLVMGenericValueRef));
for (I = 0; I != NumArgs; ++I) for (I = 0; I != NumArgs; ++I)
GVArgs[I] = Genericvalue_val(Field(Args, I)); GVArgs[I] = Genericvalue_val(Field(Args, I));
Result = LLVMRunFunction(EE, F, NumArgs, GVArgs); Result = LLVMRunFunction(EE, F, NumArgs, GVArgs);
free(GVArgs); free(GVArgs);
return alloc_generic_value(Result); 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; int I, NumArgs, NumEnv, EnvSize, Result;
const char **CArgs, **CEnv; const char **CArgs, **CEnv;
char *CEnvBuf, *Pos; char *CEnvBuf, *Pos;
NumArgs = Wosize_val(Args); NumArgs = Wosize_val(Args);
NumEnv = Wosize_val(Env); NumEnv = Wosize_val(Env);
/* Build the environment. */ /* Build the environment. */
CArgs = (const char **) malloc(NumArgs * sizeof(char*)); CArgs = (const char **) malloc(NumArgs * sizeof(char*));
for (I = 0; I != NumArgs; ++I) for (I = 0; I != NumArgs; ++I)
CArgs[I] = String_val(Field(Args, I)); CArgs[I] = String_val(Field(Args, I));
/* Compute the size of the environment string buffer. */ /* Compute the size of the environment string buffer. */
for (I = 0, EnvSize = 0; I != NumEnv; ++I) { 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), 0))) + 1;
EnvSize += strlen(String_val(Field(Field(Env, I), 1))) + 1; EnvSize += strlen(String_val(Field(Field(Env, I), 1))) + 1;
} }
/* Build the environment. */ /* Build the environment. */
CEnv = (const char **) malloc((NumEnv + 1) * sizeof(char*)); CEnv = (const char **) malloc((NumEnv + 1) * sizeof(char*));
CEnvBuf = (char*) malloc(EnvSize); 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)); *Value = String_val(Field(Field(Env, I), 1));
int NameLen = strlen(Name), int NameLen = strlen(Name),
ValueLen = strlen(Value); ValueLen = strlen(Value);
CEnv[I] = Pos; CEnv[I] = Pos;
memcpy(Pos, Name, NameLen); memcpy(Pos, Name, NameLen);
Pos += NameLen; Pos += NameLen;
@ -325,13 +327,13 @@ CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F,
*Pos++ = '\0'; *Pos++ = '\0';
} }
CEnv[NumEnv] = NULL; CEnv[NumEnv] = NULL;
Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv); Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv);
free(CArgs); free(CArgs);
free(CEnv); free(CEnv);
free(CEnvBuf); free(CEnvBuf);
CAMLreturn(Val_int(Result)); CAMLreturn(Val_int(Result));
} }

View File

@ -19,6 +19,9 @@ let i32_type = Llvm.i32_type context
let i64_type = Llvm.i64_type context let i64_type = Llvm.i64_type context
let double_type = Llvm.double_type context let double_type = Llvm.double_type context
let () =
assert (Llvm_executionengine.initialize_native_target ())
let bomb msg = let bomb msg =
prerr_endline msg; prerr_endline msg;
exit 2 exit 2