10a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar(* RUN: rm -rf %t.builddir
20a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: mkdir -p %t.builddir
30a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: cp %s %t.builddir
40a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: %ocamlopt -warn-error A llvm.cmxa llvm_analysis.cmxa %t.builddir/analysis.ml -o %t
58a78ff63c017796d699d297d5ab67064e8914542Erick Tryzelaar * RUN: %t
6874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar * XFAIL: vg_leak
7c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen *)
8c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen
9c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksenopen Llvm
10c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksenopen Llvm_analysis
11c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen
12c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen(* Note that this takes a moment to link, so it's best to keep the number of
13c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen   individual tests low. *)
14c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen
15b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaarlet context = global_context ()
16b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
17c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksenlet test x = if not x then exit 1 else ()
18c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen
19c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksenlet bomb msg =
20c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  prerr_endline msg;
21c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  exit 2
22c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen
23c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksenlet _ =
24b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  let fty = function_type (void_type context) [| |] in
25b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  let m = create_module context "valid_m" in
26c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  let fn = define_function "valid_fn" fty m in
27b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  let at_entry = builder_at_end context (entry_block fn) in
28c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  ignore (build_ret_void at_entry);
29c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
30c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
31c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  (* Test that valid constructs verify. *)
32c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  begin match verify_module m with
33c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen    Some msg -> bomb "valid module failed verification!"
34c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  | None -> ()
35c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  end;
36c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
37c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  if not (verify_function fn) then bomb "valid function failed verification!";
38c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
39c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
40c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  (* Test that invalid constructs do not verify.
41c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen     A basic block can contain only one terminator instruction. *)
42c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  ignore (build_ret_void at_entry);
43c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
44c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  begin match verify_module m with
45c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen    Some msg -> ()
46c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  | None -> bomb "invalid module passed verification!"
47c8d7194b481cbdf859e3ce8ad49cd40ec86b06feGordon Henriksen  end;
48c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
49c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  if verify_function fn then bomb "invalid function passed verification!";
50c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
51c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
52c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  dispose_module m
53c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  
54c0491ac8b6c24a7d0db8c0a60f76cfb1d66f84abGordon Henriksen  (* Don't bother to test assert_valid_{module,function}. *)
55