1 (*===-- llvm_executionengine.ml - LLVM OCaml Interface ----------*- C++ -*-===*
3 * The LLVM Compiler Infrastructure
5 * This file is distributed under the University of Illinois Open Source
6 * License. See LICENSE.TXT for details.
8 *===----------------------------------------------------------------------===*)
11 exception Error of string
13 external register_exns: exn -> unit
14 = "llvm_register_ee_exns"
17 module CodeModel = struct
27 module GenericValue = struct
30 external of_float: Llvm.lltype -> float -> t
31 = "llvm_genericvalue_of_float"
32 external of_pointer: 'a -> t
33 = "llvm_genericvalue_of_pointer"
34 external of_int32: Llvm.lltype -> int32 -> t
35 = "llvm_genericvalue_of_int32"
36 external of_int: Llvm.lltype -> int -> t
37 = "llvm_genericvalue_of_int"
38 external of_nativeint: Llvm.lltype -> nativeint -> t
39 = "llvm_genericvalue_of_nativeint"
40 external of_int64: Llvm.lltype -> int64 -> t
41 = "llvm_genericvalue_of_int64"
43 external as_float: Llvm.lltype -> t -> float
44 = "llvm_genericvalue_as_float"
45 external as_pointer: t -> 'a
46 = "llvm_genericvalue_as_pointer"
47 external as_int32: t -> int32
48 = "llvm_genericvalue_as_int32"
49 external as_int: t -> int
50 = "llvm_genericvalue_as_int"
51 external as_nativeint: t -> nativeint
52 = "llvm_genericvalue_as_nativeint"
53 external as_int64: t -> int64
54 = "llvm_genericvalue_as_int64"
58 module ExecutionEngine = struct
61 type compileroptions = {
63 code_model: CodeModel.t;
64 no_framepointer_elim: bool;
65 enable_fast_isel: bool;
68 let default_compiler_options = {
70 code_model = CodeModel.JIT_default;
71 no_framepointer_elim = false;
72 enable_fast_isel = false }
74 (* FIXME: Ocaml is not running this setup code unless we use 'val' in the
75 interface, which causes the emission of a stub for each function;
76 using 'external' in the module allows direct calls into
77 ocaml_executionengine.c. This is hardly fatal, but it is unnecessary
78 overhead on top of the two stubs that are already invoked for each
80 let _ = register_exns (Error "")
82 external create: Llvm.llmodule -> t
84 external create_interpreter: Llvm.llmodule -> t
85 = "llvm_ee_create_interpreter"
86 external create_jit: Llvm.llmodule -> int -> t
87 = "llvm_ee_create_jit"
88 external create_mcjit: Llvm.llmodule -> compileroptions -> t
89 = "llvm_ee_create_mcjit"
90 external dispose: t -> unit
92 external add_module: Llvm.llmodule -> t -> unit
93 = "llvm_ee_add_module"
94 external remove_module: Llvm.llmodule -> t -> Llvm.llmodule
95 = "llvm_ee_remove_module"
96 external find_function: string -> t -> Llvm.llvalue option
97 = "llvm_ee_find_function"
98 external run_function: Llvm.llvalue -> GenericValue.t array -> t ->
100 = "llvm_ee_run_function"
101 external run_static_ctors: t -> unit
102 = "llvm_ee_run_static_ctors"
103 external run_static_dtors: t -> unit
104 = "llvm_ee_run_static_dtors"
105 external run_function_as_main: Llvm.llvalue -> string array ->
106 (string * string) array -> t -> int
107 = "llvm_ee_run_function_as_main"
108 external free_machine_code: Llvm.llvalue -> t -> unit
109 = "llvm_ee_free_machine_code"
111 external data_layout : t -> Llvm_target.DataLayout.t
112 = "llvm_ee_get_data_layout"
114 (* The following are not bound. Patches are welcome.
116 add_global_mapping: llvalue -> llgenericvalue -> t -> unit
117 clear_all_global_mappings: t -> unit
118 update_global_mapping: llvalue -> llgenericvalue -> t -> unit
119 get_pointer_to_global_if_available: llvalue -> t -> llgenericvalue
120 get_pointer_to_global: llvalue -> t -> llgenericvalue
121 get_pointer_to_function: llvalue -> t -> llgenericvalue
122 get_pointer_to_function_or_stub: llvalue -> t -> llgenericvalue
123 get_global_value_at_address: llgenericvalue -> t -> llvalue option
124 store_value_to_memory: llgenericvalue -> llgenericvalue -> lltype -> unit
125 initialize_memory: llvalue -> llgenericvalue -> t -> unit
126 recompile_and_relink_function: llvalue -> t -> llgenericvalue
127 get_or_emit_global_variable: llvalue -> t -> llgenericvalue
128 disable_lazy_compilation: t -> unit
129 lazy_compilation_enabled: t -> bool
130 install_lazy_function_creator: (string -> llgenericvalue) -> t -> unit
135 external initialize_native_target : unit -> bool
136 = "llvm_initialize_native_target"