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