10a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar(* RUN: rm -rf %t.builddir
20a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: mkdir -p %t.builddir
30a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: cp %s %t.builddir
40a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: %ocamlopt -warn-error A llvm.cmxa llvm_target.cmxa llvm_executionengine.cmxa %t.builddir/executionengine.ml -o %t
58a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar * RUN: %t
6874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar * XFAIL: vg_leak
72e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *)
82e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
92e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenopen Llvm
102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenopen Llvm_executionengine
117c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaaropen Llvm_target
122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen(* Note that this takes a moment to link, so it's best to keep the number of
142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen   individual tests low. *)
152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
16b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet context = global_context ()
17b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet i8_type = Llvm.i8_type context
18b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet i32_type = Llvm.i32_type context
19b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet i64_type = Llvm.i64_type context
20b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet double_type = Llvm.double_type context
21b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet bomb msg =
232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  prerr_endline msg;
242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  exit 2
252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet define_main_fn m retval =
272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let fn =
282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    let str_arr_type = pointer_type (pointer_type i8_type) in
292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    define_function "main" (function_type i32_type [| i32_type;
302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                      str_arr_type;
312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                      str_arr_type |]) m in
325371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let b = builder_at_end (global_context ()) (entry_block fn) in
332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ignore (build_ret (const_int i32_type retval) b);
342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  fn
352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet define_plus m =
372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let fn = define_function "plus" (function_type i32_type [| i32_type;
382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                             i32_type |]) m in
395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let b = builder_at_end (global_context ()) (entry_block fn) in
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let add = build_add (param fn 0) (param fn 1) "sum" b in
412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ignore (build_ret add b)
422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet test_genericvalue () =
442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let tu = (1, 2) in
452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let ptrgv = GenericValue.of_pointer tu in
462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  assert (tu = GenericValue.as_pointer ptrgv);
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let fpgv = GenericValue.of_float double_type 2. in
492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  assert (2. = GenericValue.as_float double_type fpgv);
502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let intgv = GenericValue.of_int i32_type 3 in
522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  assert (3  = GenericValue.as_int intgv);
532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
5478d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  let i32gv = GenericValue.of_int32 i32_type (Int32.of_int 4) in
5578d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  assert ((Int32.of_int 4) = GenericValue.as_int32 i32gv);
562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
5778d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  let nigv = GenericValue.of_nativeint i32_type (Nativeint.of_int 5) in
5878d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  assert ((Nativeint.of_int 5) = GenericValue.as_nativeint nigv);
592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
6078d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  let i64gv = GenericValue.of_int64 i64_type (Int64.of_int 6) in
6178d34664e7935a3c0e8f0fc7a345b94314a1b3b8Gordon Henriksen  assert ((Int64.of_int 6) = GenericValue.as_int64 i64gv)
622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet test_executionengine () =
642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* create *)
655371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let m = create_module (global_context ()) "test_module" in
662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let main = define_main_fn m 42 in
672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
685371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let m2 = create_module (global_context ()) "test_module2" in
692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  define_plus m2;
702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
7116609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  let ee = ExecutionEngine.create m in
7216609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  ExecutionEngine.add_module m2 ee;
732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* run_static_ctors *)
752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ExecutionEngine.run_static_ctors ee;
762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* run_function_as_main *)
782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let res = ExecutionEngine.run_function_as_main main [|"test"|] [||] ee in
792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if 42 != res then bomb "main did not return 42";
802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* free_machine_code *)
822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ExecutionEngine.free_machine_code main ee;
832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* find_function *)
852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  match ExecutionEngine.find_function "dne" ee with
862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  | Some _ -> raise (Failure "find_function 'dne' failed")
872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  | None ->
882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  match ExecutionEngine.find_function "plus" ee with
902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  | None -> raise (Failure "find_function 'plus' failed")
912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  | Some plus ->
922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* run_function *)
942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  let res = ExecutionEngine.run_function plus
952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                         [| GenericValue.of_int i32_type 2;
962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                            GenericValue.of_int i32_type 2 |]
972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                         ee in
982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if 4 != GenericValue.as_int res then bomb "plus did not work";
992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
10016609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  (* remove_module *)
10116609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  Llvm.dispose_module (ExecutionEngine.remove_module m2 ee);
1022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
1032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* run_static_dtors *)
1042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ExecutionEngine.run_static_dtors ee;
1057c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
10604deb4957ab253c02bce9d982d69396954744a41Peter Zotov  (* Show that the data layout binding links and runs.*)
10704deb4957ab253c02bce9d982d69396954744a41Peter Zotov  let dl = ExecutionEngine.data_layout ee in
1087c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
1097c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar  (* Demonstrate that a garbage pointer wasn't returned. *)
11004deb4957ab253c02bce9d982d69396954744a41Peter Zotov  let ty = DataLayout.intptr_type context dl in
1117c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar  if ty != i32_type && ty != i64_type then bomb "target_data did not work";
1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  
1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  (* dispose *)
1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ExecutionEngine.dispose ee
1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenlet _ =
1172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  test_genericvalue ();
1182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  test_executionengine ()
119