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