Adding ocaml language bindings for the vmcore and bitwriter libraries. These are
[oota-llvm.git] / test / Bindings / Ocaml / vmcore.ml
1 (* RUN: %ocamlc llvm.cma llvm_bitwriter.cma %s -o %t
2  * RUN: ./%t %t.bc
3  * RUN: llvm-dis < %t.bc > %t.ll
4  *)
5
6 (* Note: It takes several seconds for ocamlc to link an executable with
7          libLLVMCore.a, so it's better to write a big test than a bunch of
8          little ones. *)
9
10 open Llvm
11 open Llvm_bitwriter
12
13
14 (* Tiny unit test framework *)
15 let exit_status = ref 0
16 let case_num = ref 0
17
18 let all_done () =
19   prerr_endline "";
20   exit !exit_status
21
22 let group name =
23   prerr_endline "";
24   case_num := 0;
25   prerr_string ("  " ^ name ^ "... ")
26
27 let insist cond =
28   incr case_num;
29   prerr_char ' ';
30   if not cond then begin
31      exit_status := 10;
32      prerr_char '!'
33   end;
34   prerr_int !case_num
35
36 let suite name f =
37   prerr_endline (name ^ ":");
38   f ()
39
40
41 (*===-- Fixture -----------------------------------------------------------===*)
42
43 let filename = Sys.argv.(1)
44 let m = create_module filename
45
46
47 (*===-- Types -------------------------------------------------------------===*)
48
49 let test_types () =
50   (* RUN: grep {Ty01.*void} < %t.ll
51    *)
52   group "void";
53   insist (add_type_name "Ty01" void_type m);
54   insist (Void_type == classify_type void_type);
55
56   (* RUN: grep {Ty02.*i1} < %t.ll
57    *)
58   group "i1";
59   insist (add_type_name "Ty02" i1_type m);
60   insist (Integer_type == classify_type i1_type);
61
62   (* RUN: grep {Ty03.*i32} < %t.ll
63    *)
64   group "i32";
65   insist (add_type_name "Ty03" i32_type m);
66
67   (* RUN: grep {Ty04.*i42} < %t.ll
68    *)
69   group "i42";
70   let ty = make_integer_type 42 in
71   insist (add_type_name "Ty04" ty m);
72
73   (* RUN: grep {Ty05.*float} < %t.ll
74    *)
75   group "float";
76   insist (add_type_name "Ty05" float_type m);
77   insist (Float_type == classify_type float_type);
78
79   (* RUN: grep {Ty06.*double} < %t.ll
80    *)
81   group "double";
82   insist (add_type_name "Ty06" double_type m);
83   insist (Double_type == classify_type double_type);
84
85   (* RUN: grep {Ty07.*i32.*i1, double} < %t.ll
86    *)
87   group "function";
88   let ty = make_function_type i32_type [| i1_type; double_type |] false in
89   insist (add_type_name "Ty07" ty m);
90   insist (Function_type = classify_type ty);
91   insist (not (is_var_arg ty));
92   insist (i32_type == return_type ty);
93   insist (double_type == (param_types ty).(1));
94   
95   (* RUN: grep {Ty08.*\.\.\.} < %t.ll
96    *)
97   group "vararg";
98   let ty = make_function_type void_type [| i32_type |] true in
99   insist (add_type_name "Ty08" ty m);
100   insist (is_var_arg ty);
101   
102   (* RUN: grep {Ty09.*\\\[7 x i8\\\]} < %t.ll
103    *)
104   group "array";
105   let ty = make_array_type i8_type 7 in
106   insist (add_type_name "Ty09" ty m);
107   insist (7 = array_length ty);
108   insist (i8_type == element_type ty);
109   insist (Array_type == classify_type ty);
110   
111   (* RUN: grep {Ty10.*float\*} < %t.ll
112    *)
113   group "pointer";
114   let ty = make_pointer_type float_type in
115   insist (add_type_name "Ty10" ty m);
116   insist (float_type == element_type ty);
117   insist (Pointer_type == classify_type ty);
118   
119   (* RUN: grep {Ty11.*\<4 x i16\>} < %t.ll
120    *)
121   group "vector";
122   let ty = make_vector_type i16_type 4 in
123   insist (add_type_name "Ty11" ty m);
124   insist (i16_type == element_type ty);
125   insist (4 = vector_size ty);
126   
127   (* RUN: grep {Ty12.*opaque} < %t.ll
128    *)
129   group "opaque";
130   let ty = make_opaque_type () in
131   insist (add_type_name "Ty12" ty m);
132   insist (ty == ty);
133   insist (ty <> make_opaque_type ())
134
135
136 (*===-- Global Values -----------------------------------------------------===*)
137
138 let test_global_values () =
139   let (++) x f = f x; x in
140   let zero32 = make_null i32_type in
141
142   (* RUN: grep {GVal01} < %t.ll
143    *)
144   group "naming";
145   let g = define_global "TEMPORARY" zero32 m in
146   prerr_endline "";
147   prerr_endline (value_name g);
148   insist ("TEMPORARY" = value_name g);
149   set_value_name "GVal01" g;
150   insist ("GVal01" = value_name g);
151
152   (* RUN: grep {GVal02.*linkonce} < %t.ll
153    *)
154   group "linkage";
155   let g = define_global "GVal02" zero32 m ++
156           set_linkage Link_once_linkage in
157   insist (Link_once_linkage = linkage g);
158
159   (* RUN: grep {GVal03.*Hanalei} < %t.ll
160    *)
161   group "section";
162   let g = define_global "GVal03" zero32 m ++
163           set_section "Hanalei" in
164   insist ("Hanalei" = section g);
165   
166   (* RUN: grep {GVal04.*hidden} < %t.ll
167    *)
168   group "visibility";
169   let g = define_global "GVal04" zero32 m ++
170           set_visibility Hidden_visibility in
171   insist (Hidden_visibility = visibility g);
172   
173   (* RUN: grep {GVal05.*align 128} < %t.ll
174    *)
175   group "alignment";
176   let g = define_global "GVal05" zero32 m ++
177           set_alignment 128 in
178   insist (128 = alignment g)
179
180
181 (*===-- Global Variables --------------------------------------------------===*)
182
183 let test_global_variables () =
184   let (++) x f = f x; x in
185   let fourty_two32 = make_int_constant i32_type 42 false in
186
187   (* RUN: grep {GVar01.*external} < %t.ll
188    *)
189   group "declarations";
190   let g = declare_global i32_type "GVar01" m in
191   insist (is_declaration g);
192   
193   (* RUN: grep {GVar02.*42} < %t.ll
194    * RUN: grep {GVar03.*42} < %t.ll
195    *)
196   group "definitions";
197   let g = define_global "GVar02" fourty_two32 m in
198   let g2 = declare_global i32_type "GVar03" m ++
199            set_initializer fourty_two32 in
200   insist (not (is_declaration g));
201   insist (not (is_declaration g2));
202   insist ((global_initializer g) == (global_initializer g2));
203
204   (* RUN: grep {GVar04.*thread_local} < %t.ll
205    *)
206   group "threadlocal";
207   let g = define_global "GVar04" fourty_two32 m ++
208           set_thread_local true in
209   insist (is_thread_local g);
210
211   (* RUN: grep -v {GVar05} < %t.ll
212    *)
213   let g = define_global "GVar05" fourty_two32 m in
214   delete_global g
215
216
217 (*===-- Writer ------------------------------------------------------------===*)
218
219 let test_writer () =
220   group "writer";
221   insist (write_bitcode_file m filename);
222   
223   dispose_module m
224
225
226 (*===-- Driver ------------------------------------------------------------===*)
227
228 let _ =
229   suite "types"            test_types;
230   suite "global values"    test_global_values;
231   suite "global variables" test_global_variables;
232   suite "writer"           test_writer;
233   all_done ()