[OCaml] Unbreak Llvm_executionengine.initialize_native_target.
[oota-llvm.git] / bindings / ocaml / executionengine / executionengine_ocaml.c
index bc2b08196b6d1f12a9b57248ce065720df2f418d..8388233a35637f9ee3da91cf220f781add263300 100644 (file)
@@ -1,4 +1,4 @@
-/*===-- executionengine_ocaml.c - LLVM Ocaml Glue ---------------*- C++ -*-===*\
+/*===-- executionengine_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 |*                                                                            *|
 |*                     The LLVM Compiler Infrastructure                       *|
 |*                                                                            *|
@@ -7,7 +7,7 @@
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
-|* This file glues LLVM's ocaml interface to its C interface. These functions *|
+|* This file glues LLVM's OCaml interface to its C interface. These functions *|
 |* are by and large transparent wrappers to the corresponding C functions.    *|
 |*                                                                            *|
 |* Note that these functions intentionally take liberties with the CAMLparamX *|
 /* Force the LLVM interpreter and JIT to be linked in. */
 void llvm_initialize(void) {
   LLVMLinkInInterpreter();
-  LLVMLinkInJIT();
+  LLVMLinkInMCJIT();
 }
 
 /* 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
@@ -75,6 +77,9 @@ static struct custom_operations generic_value_ops = {
   custom_hash_default,
   custom_serialize_default,
   custom_deserialize_default
+#ifdef custom_compare_ext_default
+  , custom_compare_ext_default
+#endif
 };
 
 static value alloc_generic_value(LLVMGenericValueRef Ref) {
@@ -91,7 +96,7 @@ CAMLprim value llvm_genericvalue_of_float(LLVMTypeRef Ty, value N) {
 }
 
 /* 'a -> t */
-CAMLprim value llvm_genericvalue_of_value(value V) {
+CAMLprim value llvm_genericvalue_of_pointer(value V) {
   CAMLparam1(V);
   CAMLreturn(alloc_generic_value(LLVMCreateGenericValueOfPointer(Op_val(V))));
 }
@@ -130,7 +135,7 @@ CAMLprim value llvm_genericvalue_as_float(LLVMTypeRef Ty, value GenVal) {
 }
 
 /* t -> 'a */
-CAMLprim value llvm_genericvalue_as_value(value GenVal) {
+CAMLprim value llvm_genericvalue_as_pointer(value GenVal) {
   return Val_op(LLVMGenericValueToPointer(Genericvalue_val(GenVal)));
 }
 
@@ -187,24 +192,32 @@ llvm_ee_create_interpreter(LLVMModuleRef M) {
   return Interp;
 }
 
-/* llmodule -> ExecutionEngine.t */
+/* llmodule -> int -> ExecutionEngine.t */
 CAMLprim LLVMExecutionEngineRef
-llvm_ee_create_jit(LLVMModuleRef M) {
+llvm_ee_create_jit(LLVMModuleRef M, value OptLevel) {
   LLVMExecutionEngineRef JIT;
   char *Error;
-  if (LLVMCreateJITCompilerForModule(&JIT, M, 3, &Error))
+  if (LLVMCreateJITCompilerForModule(&JIT, M, Int_val(OptLevel), &Error))
     llvm_raise(llvm_ee_error_exn, Error);
   return JIT;
 }
 
-/* llmodule -> ExecutionEngine.t */
+/* llmodule -> llcompileroption -> ExecutionEngine.t */
 CAMLprim LLVMExecutionEngineRef
-llvm_ee_create_fast_jit(LLVMModuleRef M) {
-  LLVMExecutionEngineRef JIT;
+llvm_ee_create_mcjit(LLVMModuleRef M, value OptRecord) {
+  LLVMExecutionEngineRef MCJIT;
   char *Error;
-  if (LLVMCreateJITCompiler(&JIT, M, 0, &Error))
+  struct LLVMMCJITCompilerOptions Options = {
+         .OptLevel = Int_val(Field(OptRecord, 0)),
+         .CodeModel = Int_val(Field(OptRecord, 1)),
+         .NoFramePointerElim = Int_val(Field(OptRecord, 2)),
+         .EnableFastISel = Int_val(Field(OptRecord, 3)),
+         .MCJMM = NULL
+  };
+  if (LLVMCreateMCJITCompilerForModule(&MCJIT, M, &Options,
+                                      sizeof(Options), &Error))
     llvm_raise(llvm_ee_error_exn, Error);
-  return JIT;
+  return MCJIT;
 }
 
 /* ExecutionEngine.t -> unit */
@@ -214,14 +227,14 @@ CAMLprim value llvm_ee_dispose(LLVMExecutionEngineRef EE) {
 }
 
 /* llmodule -> ExecutionEngine.t -> unit */
-CAMLprim value llvm_ee_add_mp(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
+CAMLprim value llvm_ee_add_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
   LLVMAddModule(EE, M);
   return Val_unit;
 }
 
 /* llmodule -> ExecutionEngine.t -> llmodule */
-CAMLprim LLVMModuleRef llvm_ee_remove_mp(LLVMModuleRef M,
-                                         LLVMExecutionEngineRef EE) {
+CAMLprim LLVMModuleRef llvm_ee_remove_module(LLVMModuleRef M,
+                                             LLVMExecutionEngineRef EE) {
   LLVMModuleRef RemovedModule;
   char *Error;
   if (LLVMRemoveModule(EE, M, &RemovedModule, &Error))
@@ -236,7 +249,7 @@ CAMLprim value llvm_ee_find_function(value Name, LLVMExecutionEngineRef EE) {
   LLVMValueRef Found;
   if (LLVMFindFunction(EE, String_val(Name), &Found))
     CAMLreturn(Val_unit);
-  Option = alloc(1, 1);
+  Option = alloc(1, 0);
   Field(Option, 0) = Val_op(Found);
   CAMLreturn(Option);
 }
@@ -247,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);
 }
@@ -280,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);
@@ -304,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;
@@ -314,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));
 }
 
@@ -331,3 +344,18 @@ CAMLprim value llvm_ee_free_machine_code(LLVMValueRef F,
   return Val_unit;
 }
 
+extern value llvm_alloc_data_layout(LLVMTargetDataRef TargetData);
+
+/* ExecutionEngine.t -> Llvm_target.DataLayout.t */
+CAMLprim value llvm_ee_get_data_layout(LLVMExecutionEngineRef EE) {
+  value DataLayout;
+  LLVMTargetDataRef OrigDataLayout;
+  OrigDataLayout = LLVMGetExecutionEngineTargetData(EE);
+
+  char* TargetDataCStr;
+  TargetDataCStr = LLVMCopyStringRepOfTargetData(OrigDataLayout);
+  DataLayout = llvm_alloc_data_layout(LLVMCreateTargetData(TargetDataCStr));
+  LLVMDisposeMessage(TargetDataCStr);
+
+  return DataLayout;
+}