blob: b7992508bf9424ad8faa1908d1857dbb7fed1ce8 [file] [log] [blame]
Sylvestre Ledru493cd8c2013-11-01 00:26:01 +00001/*===-- executionengine_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
Gordon Henriksen2a8cd892007-12-23 16:59:28 +00002|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
Chris Lattner6787a452007-12-29 22:59:10 +00005|* This file is distributed under the University of Illinois Open Source *|
6|* License. See LICENSE.TXT for details. *|
Gordon Henriksen2a8cd892007-12-23 16:59:28 +00007|* *|
8|*===----------------------------------------------------------------------===*|
9|* *|
Sylvestre Ledru493cd8c2013-11-01 00:26:01 +000010|* This file glues LLVM's OCaml interface to its C interface. These functions *|
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000011|* are by and large transparent wrappers to the corresponding C functions. *|
12|* *|
13|* Note that these functions intentionally take liberties with the CAMLparamX *|
14|* macros, since most of the parameters are not GC heap objects. *|
15|* *|
16\*===----------------------------------------------------------------------===*/
17
Peter Zotov662538a2014-10-29 08:15:54 +000018#include <string.h>
19#include <assert.h>
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000020#include "llvm-c/ExecutionEngine.h"
Bob Wilsona1d3e662009-06-24 21:09:18 +000021#include "llvm-c/Target.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000022#include "caml/alloc.h"
23#include "caml/custom.h"
24#include "caml/fail.h"
25#include "caml/memory.h"
Peter Zotov662538a2014-10-29 08:15:54 +000026#include "caml/callback.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000027
Peter Zotov1b254f92014-10-30 08:29:29 +000028void llvm_raise(value Prototype, char *Message);
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000029
Peter Zotov662538a2014-10-29 08:15:54 +000030/* unit -> bool */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000031CAMLprim value llvm_ee_initialize(value Unit) {
Peter Zotov662538a2014-10-29 08:15:54 +000032 LLVMLinkInMCJIT();
33
34 return Val_bool(!LLVMInitializeNativeTarget() &&
35 !LLVMInitializeNativeAsmParser() &&
36 !LLVMInitializeNativeAsmPrinter());
37}
38
Peter Zotovd1531a22014-10-25 18:49:56 +000039/* llmodule -> llcompileroption -> ExecutionEngine.t */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000040CAMLprim LLVMExecutionEngineRef llvm_ee_create(value OptRecordOpt, LLVMModuleRef M) {
41 value OptRecord;
Peter Zotovd1531a22014-10-25 18:49:56 +000042 LLVMExecutionEngineRef MCJIT;
43 char *Error;
Peter Zotov662538a2014-10-29 08:15:54 +000044 struct LLVMMCJITCompilerOptions Options;
45
46 LLVMInitializeMCJITCompilerOptions(&Options, sizeof(Options));
Peter Zotovb1f54ff2014-10-31 09:05:36 +000047 if (OptRecordOpt != Val_int(0)) {
48 OptRecord = Field(OptRecordOpt, 0);
49 Options.OptLevel = Int_val(Field(OptRecord, 0));
50 Options.CodeModel = Int_val(Field(OptRecord, 1));
51 Options.NoFramePointerElim = Int_val(Field(OptRecord, 2));
52 Options.EnableFastISel = Int_val(Field(OptRecord, 3));
53 Options.MCJMM = NULL;
54 }
Peter Zotov662538a2014-10-29 08:15:54 +000055
Peter Zotovd1531a22014-10-25 18:49:56 +000056 if (LLVMCreateMCJITCompilerForModule(&MCJIT, M, &Options,
57 sizeof(Options), &Error))
Peter Zotov662538a2014-10-29 08:15:54 +000058 llvm_raise(*caml_named_value("Llvm_executionengine.Error"), Error);
Peter Zotovd1531a22014-10-25 18:49:56 +000059 return MCJIT;
60}
61
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000062/* ExecutionEngine.t -> unit */
63CAMLprim value llvm_ee_dispose(LLVMExecutionEngineRef EE) {
64 LLVMDisposeExecutionEngine(EE);
65 return Val_unit;
66}
67
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000068/* llmodule -> ExecutionEngine.t -> unit */
Erick Tryzelaar3e64c262010-03-03 23:51:30 +000069CAMLprim value llvm_ee_add_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000070 LLVMAddModule(EE, M);
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000071 return Val_unit;
72}
73
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000074/* llmodule -> ExecutionEngine.t -> llmodule */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000075CAMLprim value llvm_ee_remove_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000076 LLVMModuleRef RemovedModule;
77 char *Error;
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000078 if (LLVMRemoveModule(EE, M, &RemovedModule, &Error))
Peter Zotov662538a2014-10-29 08:15:54 +000079 llvm_raise(*caml_named_value("Llvm_executionengine.Error"), Error);
Peter Zotovb1f54ff2014-10-31 09:05:36 +000080 return Val_unit;
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000081}
82
83/* ExecutionEngine.t -> unit */
84CAMLprim value llvm_ee_run_static_ctors(LLVMExecutionEngineRef EE) {
85 LLVMRunStaticConstructors(EE);
86 return Val_unit;
87}
88
89/* ExecutionEngine.t -> unit */
90CAMLprim value llvm_ee_run_static_dtors(LLVMExecutionEngineRef EE) {
91 LLVMRunStaticDestructors(EE);
92 return Val_unit;
93}
94
Peter Zotov8a1a3bf2013-11-15 02:51:44 +000095extern value llvm_alloc_data_layout(LLVMTargetDataRef TargetData);
Peter Zotovd52cf172013-11-11 14:47:11 +000096
Peter Zotov8a1a3bf2013-11-15 02:51:44 +000097/* ExecutionEngine.t -> Llvm_target.DataLayout.t */
98CAMLprim value llvm_ee_get_data_layout(LLVMExecutionEngineRef EE) {
99 value DataLayout;
100 LLVMTargetDataRef OrigDataLayout;
Peter Zotov8a1a3bf2013-11-15 02:51:44 +0000101 char* TargetDataCStr;
Peter Zotov662538a2014-10-29 08:15:54 +0000102
103 OrigDataLayout = LLVMGetExecutionEngineTargetData(EE);
Peter Zotov8a1a3bf2013-11-15 02:51:44 +0000104 TargetDataCStr = LLVMCopyStringRepOfTargetData(OrigDataLayout);
105 DataLayout = llvm_alloc_data_layout(LLVMCreateTargetData(TargetDataCStr));
106 LLVMDisposeMessage(TargetDataCStr);
107
108 return DataLayout;
Peter Zotovd52cf172013-11-11 14:47:11 +0000109}
Peter Zotovb1f54ff2014-10-31 09:05:36 +0000110
111/* Llvm.llvalue -> int64 -> llexecutionengine -> unit */
112CAMLprim value llvm_ee_add_global_mapping(LLVMValueRef Global, value Ptr,
113 LLVMExecutionEngineRef EE) {
114 LLVMAddGlobalMapping(EE, Global, (void*) (Int64_val(Ptr)));
115 return Val_unit;
116}
117
Peter Zotovaf6535b2014-12-24 01:52:51 +0000118CAMLprim value llvm_ee_get_global_value_address(value Name,
119 LLVMExecutionEngineRef EE) {
120 return caml_copy_int64((int64_t) LLVMGetGlobalValueAddress(EE, String_val(Name)));
121}
122
123CAMLprim value llvm_ee_get_function_address(value Name,
124 LLVMExecutionEngineRef EE) {
125 return caml_copy_int64((int64_t) LLVMGetFunctionAddress(EE, String_val(Name)));
Peter Zotovb1f54ff2014-10-31 09:05:36 +0000126}