2165533c13796899147a1fe860fd012d9ac92e8b
[oota-llvm.git] / bindings / ocaml / executionengine / llvm_executionengine.ml
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
11 exception Error of string
12
13 external register_exns: exn -> unit
14   = "llvm_register_ee_exns"
15
16
17 module CodeModel = struct
18   type t =
19     | Default
20     | JIT_default
21     | Small
22     | Kernel
23     | Medium
24     | Large
25 end
26
27 module 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"
55 end
56
57
58 module 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    *)
133 end
134
135 external initialize_native_target : unit -> bool
136                                   = "llvm_initialize_native_target"