137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines(*===-- llvm_executionengine.ml - LLVM OCaml Interface --------*- OCaml -*-===*
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 Henriksenexception Error of string
112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslet () = Callback.register_exception "Llvm_executionengine.Error" (Error "")
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal initialize : unit -> bool
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_initialize"
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestype llexecutionengine
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestype llcompileroptions = {
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  opt_level: int;
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  code_model: Llvm_target.CodeModel.t;
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  no_framepointer_elim: bool;
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  enable_fast_isel: bool;
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslet default_compiler_options = {
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  opt_level = 0;
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  code_model = Llvm_target.CodeModel.JITDefault;
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  no_framepointer_elim = false;
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  enable_fast_isel = false }
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal create : ?options:llcompileroptions -> Llvm.llmodule -> llexecutionengine
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_create"
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal dispose : llexecutionengine -> unit
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_dispose"
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal add_module : Llvm.llmodule -> llexecutionengine -> unit
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_add_module"
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal remove_module : Llvm.llmodule -> llexecutionengine -> unit
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_remove_module"
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal run_static_ctors : llexecutionengine -> unit
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_run_static_ctors"
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal run_static_dtors : llexecutionengine -> unit
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_run_static_dtors"
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesexternal data_layout : llexecutionengine -> Llvm_target.DataLayout.t
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_get_data_layout"
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarexternal add_global_mapping_ : Llvm.llvalue -> nativeint -> llexecutionengine -> unit
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  = "llvm_ee_add_global_mapping"
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarexternal get_global_value_address_ : string -> llexecutionengine -> nativeint
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  = "llvm_ee_get_global_value_address"
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarexternal get_function_address_ : string -> llexecutionengine -> nativeint
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  = "llvm_ee_get_function_address"
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslet add_global_mapping llval ptr ee =
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  add_global_mapping_ llval (Ctypes.raw_address_of_ptr (Ctypes.to_voidp ptr)) ee
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslet get_global_value_address name typ ee =
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  let vptr = get_global_value_address_ name ee in
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if Nativeint.to_int vptr <> 0 then
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    let open Ctypes in !@ (coerce (ptr void) (ptr typ) (ptr_of_raw_address vptr))
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  else
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    raise (Error ("Value " ^ name ^ " not found"))
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslet get_function_address name typ ee =
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  let fptr = get_function_address_ name ee in
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if Nativeint.to_int fptr <> 0 then
66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    let open Ctypes in coerce (ptr void) typ (ptr_of_raw_address fptr)
67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  else
68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    raise (Error ("Function " ^ name ^ " not found"))
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines(* The following are not bound. Patches are welcome.
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestarget_machine : llexecutionengine -> Llvm_target.TargetMachine.t
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines *)
73