1c527d7e5a814b834aaece6e67d2447b9d2d2be5eErick Tryzelaar(* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_analysis.cmxa %s -o %t
27b3dc63390c7884273f0cb4098a19505871fd5cfErick Tryzelaar * RUN: %t
3bf7ea373ecb90a933592061eda4a3dca45e84b25Daniel Dunbar * XFAIL: vg_leak
43ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen *)
53ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen
63ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksenopen Llvm
73ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksenopen Llvm_analysis
83ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen
93ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen(* Note that this takes a moment to link, so it's best to keep the number of
103ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen   individual tests low. *)
113ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen
1293ac6ab49c58d81cc332c9a9af74f0442d4acaa8Erick Tryzelaarlet context = global_context ()
1393ac6ab49c58d81cc332c9a9af74f0442d4acaa8Erick Tryzelaar
143ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksenlet test x = if not x then exit 1 else ()
153ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen
163ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksenlet bomb msg =
173ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  prerr_endline msg;
183ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  exit 2
193ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen
203ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksenlet _ =
2193ac6ab49c58d81cc332c9a9af74f0442d4acaa8Erick Tryzelaar  let fty = function_type (void_type context) [| |] in
2293ac6ab49c58d81cc332c9a9af74f0442d4acaa8Erick Tryzelaar  let m = create_module context "valid_m" in
233ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  let fn = define_function "valid_fn" fty m in
2493ac6ab49c58d81cc332c9a9af74f0442d4acaa8Erick Tryzelaar  let at_entry = builder_at_end context (entry_block fn) in
253ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  ignore (build_ret_void at_entry);
263ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
273ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
283ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  (* Test that valid constructs verify. *)
2963a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  begin match verify_module m with
303ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen    Some msg -> bomb "valid module failed verification!"
3163a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  | None -> ()
3263a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  end;
333ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
343ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  if not (verify_function fn) then bomb "valid function failed verification!";
353ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
363ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
373ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  (* Test that invalid constructs do not verify.
383ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen     A basic block can contain only one terminator instruction. *)
393ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  ignore (build_ret_void at_entry);
403ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
4163a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  begin match verify_module m with
423ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen    Some msg -> ()
4363a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  | None -> bomb "invalid module passed verification!"
4463a180bab88d10a5577e8427d77a2b2e65e9446eGordon Henriksen  end;
453ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
463ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  if verify_function fn then bomb "invalid function passed verification!";
473ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
483ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
493ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  dispose_module m
503ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  
513ed72368453d39942c9a3e0f41242485d9f3cfdfGordon Henriksen  (* Don't bother to test assert_valid_{module,function}. *)
52