| (* 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 |