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