X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=test%2FBindings%2FOcaml%2Fexecutionengine.ml;h=3109081a71edfbcd31dbad2ef1f8f9e02f42a1f8;hp=f7a49bb284c0c4364b438d4db4a3939c16900872;hb=2e643bbeae14daf966b093598b7e4c0b580fa485;hpb=874f021bc16aaf4619fd818da150f1b63e408c80 diff --git a/test/Bindings/Ocaml/executionengine.ml b/test/Bindings/Ocaml/executionengine.ml index f7a49bb284c..3109081a71e 100644 --- a/test/Bindings/Ocaml/executionengine.ml +++ b/test/Bindings/Ocaml/executionengine.ml @@ -1,6 +1,9 @@ -(* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_target.cmxa llvm_executionengine.cmxa %s -o %t +(* RUN: rm -rf %t.builddir + * RUN: mkdir -p %t.builddir + * RUN: cp %s %t.builddir + * RUN: %ocamlopt -warn-error A llvm.cmxa llvm_target.cmxa llvm_executionengine.cmxa %t.builddir/executionengine.ml -o %t * RUN: %t - * XFAIL: vg_leak + * XFAIL: vg_leak hexagon *) open Llvm @@ -16,6 +19,9 @@ 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_native_target ()) + let bomb msg = prerr_endline msg; exit 2 @@ -41,75 +47,88 @@ let test_genericvalue () = let tu = (1, 2) in let ptrgv = GenericValue.of_pointer tu in assert (tu = GenericValue.as_pointer ptrgv); - + let fpgv = GenericValue.of_float double_type 2. in assert (2. = GenericValue.as_float double_type fpgv); - + let intgv = GenericValue.of_int i32_type 3 in assert (3 = GenericValue.as_int intgv); - + let i32gv = GenericValue.of_int32 i32_type (Int32.of_int 4) in assert ((Int32.of_int 4) = GenericValue.as_int32 i32gv); - + let nigv = GenericValue.of_nativeint i32_type (Nativeint.of_int 5) in assert ((Nativeint.of_int 5) = GenericValue.as_nativeint nigv); - + let i64gv = GenericValue.of_int64 i64_type (Int64.of_int 6) in assert ((Int64.of_int 6) = GenericValue.as_int64 i64gv) -let test_executionengine () = +let test_executionengine engine = (* create *) let m = create_module (global_context ()) "test_module" in let main = define_main_fn m 42 in - + let m2 = create_module (global_context ()) "test_module2" in define_plus m2; - - let ee = ExecutionEngine.create m in + + let ee = + match engine with + | `Interpreter -> ExecutionEngine.create_interpreter m + | `JIT -> ExecutionEngine.create_jit m 0 + | `MCJIT -> ExecutionEngine.create_mcjit m ExecutionEngine.default_compiler_options + in ExecutionEngine.add_module m2 ee; - + (* run_static_ctors *) ExecutionEngine.run_static_ctors ee; - + (* run_function_as_main *) let res = ExecutionEngine.run_function_as_main main [|"test"|] [||] ee in if 42 != res then bomb "main did not return 42"; - + (* free_machine_code *) ExecutionEngine.free_machine_code main ee; - + (* find_function *) match ExecutionEngine.find_function "dne" ee with | Some _ -> raise (Failure "find_function 'dne' failed") | None -> - + match ExecutionEngine.find_function "plus" ee with | None -> raise (Failure "find_function 'plus' failed") | Some plus -> - - (* run_function *) - let res = ExecutionEngine.run_function plus - [| GenericValue.of_int i32_type 2; - GenericValue.of_int i32_type 2 |] - ee in - if 4 != GenericValue.as_int res then bomb "plus did not work"; - + + begin match engine with + | `MCJIT -> () (* Currently can only invoke 0-ary functions *) + | `JIT -> () (* JIT is now a shim around MCJIT, jokes on you *) + | _ -> + (* run_function *) + let res = ExecutionEngine.run_function plus + [| GenericValue.of_int i32_type 2; + GenericValue.of_int i32_type 2 |] + ee in + if 4 != GenericValue.as_int res then bomb "plus did not work"; + end; + (* remove_module *) Llvm.dispose_module (ExecutionEngine.remove_module m2 ee); - + (* run_static_dtors *) ExecutionEngine.run_static_dtors ee; - (* Show that the target data binding links and runs.*) - let td = ExecutionEngine.target_data ee in + (* Show that the data layout binding links and runs.*) + let dl = ExecutionEngine.data_layout ee in (* Demonstrate that a garbage pointer wasn't returned. *) - let ty = intptr_type td in + let ty = DataLayout.intptr_type context dl in if ty != i32_type && ty != i64_type then bomb "target_data did not work"; - + (* dispose *) ExecutionEngine.dispose ee -let _ = +let () = test_genericvalue (); - test_executionengine () + test_executionengine `Interpreter; + test_executionengine `JIT; + test_executionengine `MCJIT; + ()