| (* RUN: rm -rf %t && mkdir -p %t && cp %s %t/diagnostic_handler.ml | |
| * RUN: %ocamlc -g -w +A -package llvm.bitreader -linkpkg %t/diagnostic_handler.ml -o %t/executable | |
| * RUN: %t/executable %t/bitcode.bc | FileCheck %s | |
| * RUN: %ocamlopt -g -w +A -package llvm.bitreader -linkpkg %t/diagnostic_handler.ml -o %t/executable | |
| * RUN: %t/executable %t/bitcode.bc | FileCheck %s | |
| * XFAIL: vg_leak | |
| *) | |
| let context = Llvm.global_context () | |
| let diagnostic_handler d = | |
| Printf.printf | |
| "Diagnostic handler called: %s\n" (Llvm.Diagnostic.description d); | |
| match Llvm.Diagnostic.severity d with | |
| | Error -> Printf.printf "Diagnostic severity is Error\n" | |
| | Warning -> Printf.printf "Diagnostic severity is Warning\n" | |
| | Remark -> Printf.printf "Diagnostic severity is Remark\n" | |
| | Note -> Printf.printf "Diagnostic severity is Note\n" | |
| let test x = if not x then exit 1 else () | |
| let _ = | |
| Llvm.set_diagnostic_handler context (Some diagnostic_handler); | |
| (* corrupt the bitcode *) | |
| let fn = Sys.argv.(1) ^ ".txt" in | |
| begin let oc = open_out fn in | |
| output_string oc "not a bitcode file\n"; | |
| close_out oc | |
| end; | |
| test begin | |
| try | |
| let mb = Llvm.MemoryBuffer.of_file fn in | |
| let m = begin try | |
| (* CHECK: Diagnostic handler called: Invalid bitcode signature | |
| * CHECK: Diagnostic severity is Error | |
| *) | |
| Llvm_bitreader.get_module context mb | |
| with x -> | |
| Llvm.MemoryBuffer.dispose mb; | |
| raise x | |
| end in | |
| Llvm.dispose_module m; | |
| false | |
| with Llvm_bitreader.Error _ -> | |
| true | |
| end |