(* RUN: rm -rf %t && mkdir -p %t && cp %s %t/executionengine.ml
 * RUN: %ocamlc -g -w +A -package llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
 * RUN: %t/executable
 * RUN: %ocamlopt -g -w +A -package llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
 * RUN: %t/executable
 * REQUIRES: native
 * XFAIL: vg_leak
 *)

open Llvm
open Llvm_executionengine
open Llvm_target

(* Note that this takes a moment to link, so it's best to keep the number of
   individual tests low. *)

let context = global_context ()
let i8_type = Llvm.i8_type context
let i32_type = Llvm.i32_type context
let i64_type = Llvm.i64_type context
let double_type = Llvm.double_type context

let () =
  assert (Llvm_executionengine.initialize ())

let bomb msg =
  prerr_endline msg;
  exit 2

let define_getglobal m pg =
  let fn = define_function "getglobal" (function_type i32_type [||]) m in
  let b = builder_at_end (global_context ()) (entry_block fn) in
  let g = build_call pg [||] "" b in
  ignore (build_ret g b);
  fn

let define_plus m =
  let fn = define_function "plus" (function_type i32_type [| i32_type;
                                                             i32_type |]) m in
  let b = builder_at_end (global_context ()) (entry_block fn) in
  let add = build_add (param fn 0) (param fn 1) "sum" b in
  ignore (build_ret add b);
  fn

let test_executionengine () =
  let open Ctypes in

  (* create *)
  let m = create_module (global_context ()) "test_module" in
  let ee = create m in

  (* add plus *)
  ignore (define_plus m);

  (* declare global variable *)
  ignore (define_global "globvar" (const_int i32_type 23) m);

  (* add module *)
  let m2 = create_module (global_context ()) "test_module2" in
  add_module m2 ee;

  (* add global mapping *)
  (* BROKEN: see PR20656 *)
  (* let g = declare_function "g" (function_type i32_type [||]) m2 in
  let cg = coerce (Foreign.funptr (void @-> returning int32_t)) (ptr void)
                                  (fun () -> 42l) in
  add_global_mapping g cg ee;

  (* check g *)
  let cg' = get_pointer_to_global g (ptr void) ee in
  if 0 <> ptr_compare cg cg' then bomb "int pointers to g differ";

  (* add getglobal *)
  let getglobal = define_getglobal m2 g in*)

  (* run_static_ctors *)
  run_static_ctors ee;

  (* get a handle on globvar *)
  let varh    = get_global_value_address "globvar" int32_t ee in
  if 23l <> varh then bomb "get_global_value_address didn't work";

  (* call plus *)
  let cplusty = Foreign.funptr (int32_t @-> int32_t @-> returning int32_t) in
  let cplus   = get_function_address "plus" cplusty ee in
  if 4l <> cplus 2l 2l then bomb "plus didn't work";

  (* call getglobal *)
  (* let cgetglobalty = Foreign.funptr (void @-> returning int32_t) in
  let cgetglobal   = get_pointer_to_global getglobal cgetglobalty ee in
  if 42l <> cgetglobal () then bomb "getglobal didn't work"; *)

  (* remove_module *)
  remove_module m2 ee;
  dispose_module m2;

  (* run_static_dtors *)
  run_static_dtors ee;

  (* Show that the data layout binding links and runs.*)
  let dl = data_layout ee in

  (* Demonstrate that a garbage pointer wasn't returned. *)
  let ty = DataLayout.intptr_type context dl in
  if ty != i32_type && ty != i64_type then bomb "target_data did not work";

  (* dispose *)
  dispose ee

let () =
  test_executionengine ();
  Gc.compact ()
