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