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