113 lines
4.1 KiB
C++
113 lines
4.1 KiB
C++
(*===-- 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"
|