1 (* RUN: rm -rf %t && mkdir -p %t && cp %s %t/executionengine.ml
2 * RUN: %ocamlc -g -w +A -thread -package ctypes.foreign,llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
4 * RUN: %ocamlopt -g -w +A -thread -package ctypes.foreign,llvm.executionengine -linkpkg %t/executionengine.ml -o %t/executable
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 fty = function_type
i32_type [||] in
32 let fn = define_function
"getglobal" fty m
in
33 let b = builder_at_end
(global_context
()) (entry_block
fn) in
34 let g = build_call
fty pg
[||] "" b in
35 ignore
(build_ret
g b);
39 let fn = define_function
"plus" (function_type
i32_type [| i32_type;
41 let b = builder_at_end
(global_context
()) (entry_block
fn) in
42 let add = build_add
(param
fn 0) (param
fn 1) "sum" b in
43 ignore
(build_ret
add b);
46 let test_executionengine () =
50 let m = create_module
(global_context
()) "test_module" in
54 ignore
(define_plus m);
56 (* declare global variable *)
57 ignore
(define_global
"globvar" (const_int
i32_type 23) m);
60 let m2 = create_module
(global_context
()) "test_module2" in
63 (* add global mapping *)
64 (* BROKEN: see PR20656 *)
65 (* let g = declare_function "g" (function_type i32_type [||]) m2 in
66 let cg = coerce (Foreign.funptr (void @-> returning int32_t)) (ptr void)
68 add_global_mapping g cg ee;
71 let cg'
= get_pointer_to_global
g (ptr void
) ee in
72 if 0 <> ptr_compare
cg cg'
then bomb "int pointers to g differ";
75 let getglobal = define_getglobal m2 g in*)
77 (* run_static_ctors *)
80 (* get a handle on globvar *)
81 let varh = get_global_value_address
"globvar" int32_t
ee in
82 if 23l <> varh then bomb "get_global_value_address didn't work";
85 let cplusty = Foreign.funptr
(int32_t
@-> int32_t
@-> returning int32_t
) in
86 let cplus = get_function_address
"plus" cplusty ee in
87 if 4l <> cplus 2l 2l then bomb "plus didn't work";
90 (* let cgetglobalty = Foreign.funptr (void @-> returning int32_t) in
91 let cgetglobal = get_pointer_to_global getglobal cgetglobalty ee in
92 if 42l <> cgetglobal () then bomb "getglobal didn't work"; *)
98 (* run_static_dtors *)
101 (* Show that the data layout binding links and runs.*)
102 let dl = data_layout
ee in
104 (* Demonstrate that a garbage pointer wasn't returned. *)
105 let ty = DataLayout.intptr_type
context dl in
106 if ty != i32_type && ty != i64_type then bomb "target_data did not work";
112 test_executionengine ();