1*9880d681SAndroid Build Coastguard Worker(* RUN: cp %s %T/diagnostic_handler.ml 2*9880d681SAndroid Build Coastguard Worker * RUN: %ocamlc -g -w +A -package llvm.bitreader -linkpkg %T/diagnostic_handler.ml -o %t 3*9880d681SAndroid Build Coastguard Worker * RUN: %t %t.bc | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker * RUN: %ocamlopt -g -w +A -package llvm.bitreader -linkpkg %T/diagnostic_handler.ml -o %t 5*9880d681SAndroid Build Coastguard Worker * RUN: %t %t.bc | FileCheck %s 6*9880d681SAndroid Build Coastguard Worker * XFAIL: vg_leak 7*9880d681SAndroid Build Coastguard Worker *) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerlet context = Llvm.global_context () 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerlet diagnostic_handler d = 12*9880d681SAndroid Build Coastguard Worker Printf.printf 13*9880d681SAndroid Build Coastguard Worker "Diagnostic handler called: %s\n" (Llvm.Diagnostic.description d); 14*9880d681SAndroid Build Coastguard Worker match Llvm.Diagnostic.severity d with 15*9880d681SAndroid Build Coastguard Worker | Error -> Printf.printf "Diagnostic severity is Error\n" 16*9880d681SAndroid Build Coastguard Worker | Warning -> Printf.printf "Diagnostic severity is Warning\n" 17*9880d681SAndroid Build Coastguard Worker | Remark -> Printf.printf "Diagnostic severity is Remark\n" 18*9880d681SAndroid Build Coastguard Worker | Note -> Printf.printf "Diagnostic severity is Note\n" 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerlet test x = if not x then exit 1 else () 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerlet _ = 23*9880d681SAndroid Build Coastguard Worker Llvm.set_diagnostic_handler context (Some diagnostic_handler); 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker (* corrupt the bitcode *) 26*9880d681SAndroid Build Coastguard Worker let fn = Sys.argv.(1) ^ ".txt" in 27*9880d681SAndroid Build Coastguard Worker begin let oc = open_out fn in 28*9880d681SAndroid Build Coastguard Worker output_string oc "not a bitcode file\n"; 29*9880d681SAndroid Build Coastguard Worker close_out oc 30*9880d681SAndroid Build Coastguard Worker end; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker test begin 33*9880d681SAndroid Build Coastguard Worker try 34*9880d681SAndroid Build Coastguard Worker let mb = Llvm.MemoryBuffer.of_file fn in 35*9880d681SAndroid Build Coastguard Worker let m = begin try 36*9880d681SAndroid Build Coastguard Worker (* CHECK: Diagnostic handler called: Invalid bitcode signature 37*9880d681SAndroid Build Coastguard Worker * CHECK: Diagnostic severity is Error 38*9880d681SAndroid Build Coastguard Worker *) 39*9880d681SAndroid Build Coastguard Worker Llvm_bitreader.get_module context mb 40*9880d681SAndroid Build Coastguard Worker with x -> 41*9880d681SAndroid Build Coastguard Worker Llvm.MemoryBuffer.dispose mb; 42*9880d681SAndroid Build Coastguard Worker raise x 43*9880d681SAndroid Build Coastguard Worker end in 44*9880d681SAndroid Build Coastguard Worker Llvm.dispose_module m; 45*9880d681SAndroid Build Coastguard Worker false 46*9880d681SAndroid Build Coastguard Worker with Llvm_bitreader.Error _ -> 47*9880d681SAndroid Build Coastguard Worker true 48*9880d681SAndroid Build Coastguard Worker end 49