blob: a5e62aca8a4e102e9d0b185ef3a818da877c4e67 [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>
Jeroen Ketema52aadc82016-03-31 08:39:42 +000020#include "llvm-c/Core.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000021#include "llvm-c/ExecutionEngine.h"
Bob Wilsona1d3e662009-06-24 21:09:18 +000022#include "llvm-c/Target.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000023#include "caml/alloc.h"
24#include "caml/custom.h"
25#include "caml/fail.h"
26#include "caml/memory.h"
Peter Zotov662538a2014-10-29 08:15:54 +000027#include "caml/callback.h"
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000028
Peter Zotov1b254f92014-10-30 08:29:29 +000029void llvm_raise(value Prototype, char *Message);
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000030
Peter Zotov662538a2014-10-29 08:15:54 +000031/* unit -> bool */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000032CAMLprim value llvm_ee_initialize(value Unit) {
Peter Zotov662538a2014-10-29 08:15:54 +000033 LLVMLinkInMCJIT();
34
35 return Val_bool(!LLVMInitializeNativeTarget() &&
36 !LLVMInitializeNativeAsmParser() &&
37 !LLVMInitializeNativeAsmPrinter());
38}
39
Peter Zotovd1531a22014-10-25 18:49:56 +000040/* llmodule -> llcompileroption -> ExecutionEngine.t */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000041CAMLprim LLVMExecutionEngineRef llvm_ee_create(value OptRecordOpt, LLVMModuleRef M) {
42 value OptRecord;
Peter Zotovd1531a22014-10-25 18:49:56 +000043 LLVMExecutionEngineRef MCJIT;
44 char *Error;
Peter Zotov662538a2014-10-29 08:15:54 +000045 struct LLVMMCJITCompilerOptions Options;
46
47 LLVMInitializeMCJITCompilerOptions(&Options, sizeof(Options));
Peter Zotovb1f54ff2014-10-31 09:05:36 +000048 if (OptRecordOpt != Val_int(0)) {
49 OptRecord = Field(OptRecordOpt, 0);
50 Options.OptLevel = Int_val(Field(OptRecord, 0));
51 Options.CodeModel = Int_val(Field(OptRecord, 1));
52 Options.NoFramePointerElim = Int_val(Field(OptRecord, 2));
53 Options.EnableFastISel = Int_val(Field(OptRecord, 3));
54 Options.MCJMM = NULL;
55 }
Peter Zotov662538a2014-10-29 08:15:54 +000056
Peter Zotovd1531a22014-10-25 18:49:56 +000057 if (LLVMCreateMCJITCompilerForModule(&MCJIT, M, &Options,
58 sizeof(Options), &Error))
Peter Zotov662538a2014-10-29 08:15:54 +000059 llvm_raise(*caml_named_value("Llvm_executionengine.Error"), Error);
Peter Zotovd1531a22014-10-25 18:49:56 +000060 return MCJIT;
61}
62
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000063/* ExecutionEngine.t -> unit */
64CAMLprim value llvm_ee_dispose(LLVMExecutionEngineRef EE) {
65 LLVMDisposeExecutionEngine(EE);
66 return Val_unit;
67}
68
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000069/* llmodule -> ExecutionEngine.t -> unit */
Erick Tryzelaar3e64c262010-03-03 23:51:30 +000070CAMLprim value llvm_ee_add_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000071 LLVMAddModule(EE, M);
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000072 return Val_unit;
73}
74
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000075/* llmodule -> ExecutionEngine.t -> llmodule */
Peter Zotovb1f54ff2014-10-31 09:05:36 +000076CAMLprim value llvm_ee_remove_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000077 LLVMModuleRef RemovedModule;
78 char *Error;
Erick Tryzelaar98b05d62010-03-02 23:59:00 +000079 if (LLVMRemoveModule(EE, M, &RemovedModule, &Error))
Peter Zotov662538a2014-10-29 08:15:54 +000080 llvm_raise(*caml_named_value("Llvm_executionengine.Error"), Error);
Peter Zotovb1f54ff2014-10-31 09:05:36 +000081 return Val_unit;
Gordon Henriksen2a8cd892007-12-23 16:59:28 +000082}
83
84/* ExecutionEngine.t -> unit */
85CAMLprim value llvm_ee_run_static_ctors(LLVMExecutionEngineRef EE) {
86 LLVMRunStaticConstructors(EE);
87 return Val_unit;
88}
89
90/* ExecutionEngine.t -> unit */
91CAMLprim value llvm_ee_run_static_dtors(LLVMExecutionEngineRef EE) {
92 LLVMRunStaticDestructors(EE);
93 return Val_unit;
94}
95
Peter Zotov8a1a3bf2013-11-15 02:51:44 +000096extern value llvm_alloc_data_layout(LLVMTargetDataRef TargetData);
Peter Zotovd52cf172013-11-11 14:47:11 +000097
Peter Zotov8a1a3bf2013-11-15 02:51:44 +000098/* ExecutionEngine.t -> Llvm_target.DataLayout.t */
99CAMLprim value llvm_ee_get_data_layout(LLVMExecutionEngineRef EE) {
100 value DataLayout;
101 LLVMTargetDataRef OrigDataLayout;
Peter Zotov8a1a3bf2013-11-15 02:51:44 +0000102 char* TargetDataCStr;
Peter Zotov662538a2014-10-29 08:15:54 +0000103
104 OrigDataLayout = LLVMGetExecutionEngineTargetData(EE);
Peter Zotov8a1a3bf2013-11-15 02:51:44 +0000105 TargetDataCStr = LLVMCopyStringRepOfTargetData(OrigDataLayout);
106 DataLayout = llvm_alloc_data_layout(LLVMCreateTargetData(TargetDataCStr));
107 LLVMDisposeMessage(TargetDataCStr);
108
109 return DataLayout;
Peter Zotovd52cf172013-11-11 14:47:11 +0000110}
Peter Zotovb1f54ff2014-10-31 09:05:36 +0000111
112/* Llvm.llvalue -> int64 -> llexecutionengine -> unit */
113CAMLprim value llvm_ee_add_global_mapping(LLVMValueRef Global, value Ptr,
114 LLVMExecutionEngineRef EE) {
115 LLVMAddGlobalMapping(EE, Global, (void*) (Int64_val(Ptr)));
116 return Val_unit;
117}
118
Peter Zotovaf6535b2014-12-24 01:52:51 +0000119CAMLprim value llvm_ee_get_global_value_address(value Name,
120 LLVMExecutionEngineRef EE) {
121 return caml_copy_int64((int64_t) LLVMGetGlobalValueAddress(EE, String_val(Name)));
122}
123
124CAMLprim value llvm_ee_get_function_address(value Name,
125 LLVMExecutionEngineRef EE) {
126 return caml_copy_int64((int64_t) LLVMGetFunctionAddress(EE, String_val(Name)));
Peter Zotovb1f54ff2014-10-31 09:05:36 +0000127}