1(*===-- llvm_executionengine.ml - LLVM OCaml Interface ----------*- C++ -*-===*
2 *
3 *                     The LLVM Compiler Infrastructure
4 *
5 * This file is distributed under the University of Illinois Open Source
6 * License. See LICENSE.TXT for details.
7 *
8 *===----------------------------------------------------------------------===*)
9
10
11exception Error of string
12
13external register_exns: exn -> unit
14  = "llvm_register_ee_exns"
15
16
17module CodeModel = struct
18  type t =
19    | Default
20    | JIT_default
21    | Small
22    | Kernel
23    | Medium
24    | Large
25end
26
27module GenericValue = struct
28  type t
29
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"
42
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"
55end
56
57
58module ExecutionEngine = struct
59  type t
60
61  type compileroptions = {
62    opt_level: int;
63    code_model: CodeModel.t;
64    no_framepointer_elim: bool;
65    enable_fast_isel: bool;
66  }
67
68  let default_compiler_options = {
69    opt_level = 0;
70    code_model = CodeModel.JIT_default;
71    no_framepointer_elim = false;
72    enable_fast_isel = false }
73
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
79            call into LLVM. *)
80  let _ = register_exns (Error "")
81
82  external create: Llvm.llmodule -> t
83    = "llvm_ee_create"
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
91    = "llvm_ee_dispose"
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 ->
99                         GenericValue.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"
110
111  external data_layout : t -> Llvm_target.DataLayout.t
112    = "llvm_ee_get_data_layout"
113
114  (* The following are not bound. Patches are welcome.
115
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
131
132   *)
133end
134
135external initialize_native_target : unit -> bool
136                                  = "llvm_initialize_native_target"
137