| (*===-- llvm_executionengine.ml - LLVM Ocaml Interface ----------*- C++ -*-===* |
| * |
| * The LLVM Compiler Infrastructure |
| * |
| * This file is distributed under the University of Illinois Open Source |
| * License. See LICENSE.TXT for details. |
| * |
| *===----------------------------------------------------------------------===*) |
| |
| |
| exception Error of string |
| |
| external register_exns: exn -> unit |
| = "llvm_register_ee_exns" |
| |
| |
| module GenericValue = struct |
| type t |
| |
| external of_float: Llvm.lltype -> float -> t |
| = "llvm_genericvalue_of_float" |
| external of_pointer: 'a -> t |
| = "llvm_genericvalue_of_pointer" |
| external of_int32: Llvm.lltype -> int32 -> t |
| = "llvm_genericvalue_of_int32" |
| external of_int: Llvm.lltype -> int -> t |
| = "llvm_genericvalue_of_int" |
| external of_nativeint: Llvm.lltype -> nativeint -> t |
| = "llvm_genericvalue_of_nativeint" |
| external of_int64: Llvm.lltype -> int64 -> t |
| = "llvm_genericvalue_of_int64" |
| |
| external as_float: Llvm.lltype -> t -> float |
| = "llvm_genericvalue_as_float" |
| external as_pointer: t -> 'a |
| = "llvm_genericvalue_as_pointer" |
| external as_int32: t -> int32 |
| = "llvm_genericvalue_as_int32" |
| external as_int: t -> int |
| = "llvm_genericvalue_as_int" |
| external as_nativeint: t -> nativeint |
| = "llvm_genericvalue_as_nativeint" |
| external as_int64: t -> int64 |
| = "llvm_genericvalue_as_int64" |
| end |
| |
| |
| module ExecutionEngine = struct |
| type t |
| |
| (* FIXME: Ocaml is not running this setup code unless we use 'val' in the |
| interface, which causes the emission of a stub for each function; |
| using 'external' in the module allows direct calls into |
| ocaml_executionengine.c. This is hardly fatal, but it is unnecessary |
| overhead on top of the two stubs that are already invoked for each |
| call into LLVM. *) |
| let _ = register_exns (Error "") |
| |
| external create: Llvm.llmodule -> t |
| = "llvm_ee_create" |
| external create_interpreter: Llvm.llmodule -> t |
| = "llvm_ee_create_interpreter" |
| external create_jit: Llvm.llmodule -> int -> t |
| = "llvm_ee_create_jit" |
| external dispose: t -> unit |
| = "llvm_ee_dispose" |
| external add_module: Llvm.llmodule -> t -> unit |
| = "llvm_ee_add_module" |
| external remove_module: Llvm.llmodule -> t -> Llvm.llmodule |
| = "llvm_ee_remove_module" |
| external find_function: string -> t -> Llvm.llvalue option |
| = "llvm_ee_find_function" |
| external run_function: Llvm.llvalue -> GenericValue.t array -> t -> |
| GenericValue.t |
| = "llvm_ee_run_function" |
| external run_static_ctors: t -> unit |
| = "llvm_ee_run_static_ctors" |
| external run_static_dtors: t -> unit |
| = "llvm_ee_run_static_dtors" |
| external run_function_as_main: Llvm.llvalue -> string array -> |
| (string * string) array -> t -> int |
| = "llvm_ee_run_function_as_main" |
| external free_machine_code: Llvm.llvalue -> t -> unit |
| = "llvm_ee_free_machine_code" |
| |
| external target_data: t -> Llvm_target.TargetData.t |
| = "LLVMGetExecutionEngineTargetData" |
| |
| (* The following are not bound. Patches are welcome. |
| |
| get_target_data: t -> lltargetdata |
| add_global_mapping: llvalue -> llgenericvalue -> t -> unit |
| clear_all_global_mappings: t -> unit |
| update_global_mapping: llvalue -> llgenericvalue -> t -> unit |
| get_pointer_to_global_if_available: llvalue -> t -> llgenericvalue |
| get_pointer_to_global: llvalue -> t -> llgenericvalue |
| get_pointer_to_function: llvalue -> t -> llgenericvalue |
| get_pointer_to_function_or_stub: llvalue -> t -> llgenericvalue |
| get_global_value_at_address: llgenericvalue -> t -> llvalue option |
| store_value_to_memory: llgenericvalue -> llgenericvalue -> lltype -> unit |
| initialize_memory: llvalue -> llgenericvalue -> t -> unit |
| recompile_and_relink_function: llvalue -> t -> llgenericvalue |
| get_or_emit_global_variable: llvalue -> t -> llgenericvalue |
| disable_lazy_compilation: t -> unit |
| lazy_compilation_enabled: t -> bool |
| install_lazy_function_creator: (string -> llgenericvalue) -> t -> unit |
| |
| *) |
| end |
| |
| external initialize_native_target : unit -> bool |
| = "llvm_initialize_native_target" |