1 (* RUN: rm -rf %t && mkdir -p %t && cp %s %t/executionengine.ml
2 * RUN: %ocamlc -g -w +A -package llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
4 * RUN: %ocamlopt -g -w +A -package llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
6 * REQUIRES: native, object-emission
11 open Llvm_executionengine
14 (* Note that this takes a moment to link, so it's best to keep the number of
15 individual tests low. *)
17 let context = global_context
()
18 let i8_type = Llvm.i8_type context
19 let i32_type = Llvm.i32_type context
20 let i64_type = Llvm.i64_type context
21 let double_type = Llvm.double_type context
24 assert (Llvm_executionengine.initialize
())
30 let define_getglobal m pg
=
31 let fn = define_function
"getglobal" (function_type
i32_type [||]) m
in
32 let b = builder_at_end
(global_context
()) (entry_block
fn) in
33 let g = build_call pg
[||] "" b in
34 ignore
(build_ret
g b);
38 let fn = define_function
"plus" (function_type
i32_type [| i32_type;
40 let b = builder_at_end
(global_context
()) (entry_block
fn) in
41 let add = build_add
(param
fn 0) (param
fn 1) "sum" b in
42 ignore
(build_ret
add b);
45 let test_executionengine () =
49 let m = create_module
(global_context
()) "test_module" in
53 ignore
(define_plus m);
55 (* declare global variable *)
56 ignore
(define_global
"globvar" (const_int
i32_type 23) m);
59 let m2 = create_module
(global_context
()) "test_module2" in
62 (* add global mapping *)
63 (* BROKEN: see PR20656 *)
64 (* let g = declare_function "g" (function_type i32_type [||]) m2 in
65 let cg = coerce (Foreign.funptr (void @-> returning int32_t)) (ptr void)
67 add_global_mapping g cg ee;
70 let cg'
= get_pointer_to_global
g (ptr void
) ee in
71 if 0 <> ptr_compare
cg cg'
then bomb "int pointers to g differ";
74 let getglobal = define_getglobal m2 g in*)
76 (* run_static_ctors *)
79 (* get a handle on globvar *)
80 let varh = get_global_value_address
"globvar" int32_t
ee in
81 if 23l <> varh then bomb "get_global_value_address didn't work";
84 let cplusty = Foreign.funptr
(int32_t
@-> int32_t
@-> returning int32_t
) in
85 let cplus = get_function_address
"plus" cplusty ee in
86 if 4l <> cplus 2l 2l then bomb "plus didn't work";
89 (* let cgetglobalty = Foreign.funptr (void @-> returning int32_t) in
90 let cgetglobal = get_pointer_to_global getglobal cgetglobalty ee in
91 if 42l <> cgetglobal () then bomb "getglobal didn't work"; *)
97 (* run_static_dtors *)
100 (* Show that the data layout binding links and runs.*)
101 let dl = data_layout
ee in
103 (* Demonstrate that a garbage pointer wasn't returned. *)
104 let ty = DataLayout.intptr_type
context dl in
105 if ty != i32_type && ty != i64_type then bomb "target_data did not work";
111 test_executionengine ();