12e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen(*===-- llvm_executionengine.ml - LLVM Ocaml Interface ----------*- C++ -*-===*
22e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *
32e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *                     The LLVM Compiler Infrastructure
42e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *
5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner * This file is distributed under the University of Illinois Open Source
6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner * License. See LICENSE.TXT for details.
72e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *
82e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *===----------------------------------------------------------------------===*)
92e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenexception Error of string
122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenexternal register_exns: exn -> unit
142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  = "llvm_register_ee_exns"
152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenmodule GenericValue = struct
182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  type t
192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_float: Llvm.lltype -> float -> t
212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_of_float"
222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_pointer: 'a -> t
239c7c566efe4b942ed8597156bf66e9abf98c79b5Erick Tryzelaar    = "llvm_genericvalue_of_pointer"
242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_int32: Llvm.lltype -> int32 -> t
252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_of_int32"
262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_int: Llvm.lltype -> int -> t
272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_of_int"
282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_nativeint: Llvm.lltype -> nativeint -> t
292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_of_nativeint"
302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external of_int64: Llvm.lltype -> int64 -> t
312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_of_int64"
322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_float: Llvm.lltype -> t -> float
342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_as_float"
352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_pointer: t -> 'a
369c7c566efe4b942ed8597156bf66e9abf98c79b5Erick Tryzelaar    = "llvm_genericvalue_as_pointer"
372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_int32: t -> int32
382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_as_int32"
392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_int: t -> int
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_as_int"
412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_nativeint: t -> nativeint
422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_as_nativeint"
432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external as_int64: t -> int64
442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_genericvalue_as_int64"
452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenend
462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenmodule ExecutionEngine = struct
492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  type t
502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* FIXME: Ocaml is not running this setup code unless we use 'val' in the
522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen            interface, which causes the emission of a stub for each function;
532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen            using 'external' in the module allows direct calls into 
542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen            ocaml_executionengine.c. This is hardly fatal, but it is unnecessary
552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen            overhead on top of the two stubs that are already invoked for each 
562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen            call into LLVM. *)
572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let _ = register_exns (Error "")
582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
5916609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  external create: Llvm.llmodule -> t
602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_create"
6116609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  external create_interpreter: Llvm.llmodule -> t
622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_create_interpreter"
630dd27da1841ca50d00aad3465f4f9b6a646fd64eErick Tryzelaar  external create_jit: Llvm.llmodule -> int -> t
642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_create_jit"
652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external dispose: t -> unit
662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_dispose"
6716609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  external add_module: Llvm.llmodule -> t -> unit
689c7c566efe4b942ed8597156bf66e9abf98c79b5Erick Tryzelaar    = "llvm_ee_add_module"
6916609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  external remove_module: Llvm.llmodule -> t -> Llvm.llmodule
709c7c566efe4b942ed8597156bf66e9abf98c79b5Erick Tryzelaar    = "llvm_ee_remove_module"
712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external find_function: string -> t -> Llvm.llvalue option
722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_find_function"
732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external run_function: Llvm.llvalue -> GenericValue.t array -> t ->
742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                         GenericValue.t
752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_run_function"
762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external run_static_ctors: t -> unit
772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_run_static_ctors"
782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external run_static_dtors: t -> unit
792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_run_static_dtors"
802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external run_function_as_main: Llvm.llvalue -> string array ->
812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                 (string * string) array -> t -> int
822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_run_function_as_main"
832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  external free_machine_code: Llvm.llvalue -> t -> unit
842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    = "llvm_ee_free_machine_code"
857c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
86791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow  external target_data: t -> Llvm_target.DataLayout.t
8728ce1cc183582e4061f1e5ba4fb443d99a4915aeMicah Villmow    = "LLVMGetExecutionEngineTargetData"
882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* The following are not bound. Patches are welcome.
902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_target_data: t -> lltargetdata
922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  add_global_mapping: llvalue -> llgenericvalue -> t -> unit
932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  clear_all_global_mappings: t -> unit
942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  update_global_mapping: llvalue -> llgenericvalue -> t -> unit
952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_pointer_to_global_if_available: llvalue -> t -> llgenericvalue
962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_pointer_to_global: llvalue -> t -> llgenericvalue
972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_pointer_to_function: llvalue -> t -> llgenericvalue
982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_pointer_to_function_or_stub: llvalue -> t -> llgenericvalue
992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_global_value_at_address: llgenericvalue -> t -> llvalue option
1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  store_value_to_memory: llgenericvalue -> llgenericvalue -> lltype -> unit
1012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  initialize_memory: llvalue -> llgenericvalue -> t -> unit
1022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  recompile_and_relink_function: llvalue -> t -> llgenericvalue
1032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  get_or_emit_global_variable: llvalue -> t -> llgenericvalue
1042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  disable_lazy_compilation: t -> unit
1052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  lazy_compilation_enabled: t -> bool
1062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  install_lazy_function_creator: (string -> llgenericvalue) -> t -> unit
1072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
1082e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen   *)
1092e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenend
11046262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar
11146262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaarexternal initialize_native_target : unit -> bool
11246262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar                                  = "llvm_initialize_native_target"
113