137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines(* RUN: cp %s %T/bitreader.ml
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %ocamlc -g -warn-error A -package llvm.bitreader -package llvm.bitwriter -linkpkg %T/bitreader.ml -o %t
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %t %t.bc
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines * RUN: %ocamlopt -g -warn-error A -package llvm.bitreader -package llvm.bitwriter -linkpkg %T/bitreader.ml -o %t
52a7d731828ab87bba42f7ecac8db509646cd2cddBob Wilson * RUN: %t %t.bc
6b4f6095bae5edfe9d6cabfe4802e6f6187e073f2Nick Lewycky * RUN: llvm-dis < %t.bc
7874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar * XFAIL: vg_leak
8bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *)
9bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
10bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen(* Note that this takes a moment to link, so it's best to keep the number of
11bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen   individual tests low. *)
12bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
135371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaarlet context = Llvm.global_context ()
145371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
15bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenlet test x = if not x then exit 1 else ()
16bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenlet _ =
18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  let fn = Sys.argv.(1) in
195371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let m = Llvm.create_module context "ocaml_test_module" in
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
21bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  test (Llvm_bitwriter.write_bitcode_file m fn);
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
23bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  Llvm.dispose_module m;
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
25da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* parse_bitcode *)
26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin
27da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file fn in
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    begin try
295371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar      let m = Llvm_bitreader.parse_bitcode context mb in
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      Llvm.dispose_module m
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with x ->
327a653cb24d4dda283d34c984e81514ac1547796eGordon Henriksen      Llvm.MemoryBuffer.dispose mb;
33da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      raise x
34da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    end
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* MemoryBuffer.of_file *)
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  test begin try
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file (fn ^ ".bogus") in
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    Llvm.MemoryBuffer.dispose mb;
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    false
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  with Llvm.IoError _ ->
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    true
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4616609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  (* get_module *)
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin
48da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file fn in
4916609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar    let m = begin try
5016609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      Llvm_bitreader.get_module context mb
51da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with x ->
52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      Llvm.MemoryBuffer.dispose mb;
53da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      raise x
54da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    end in
5516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar    Llvm.dispose_module m
56da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
58da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* corrupt the bitcode *)
59da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  let fn = fn ^ ".txt" in
60da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin let oc = open_out fn in
61da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    output_string oc "not a bitcode file\n";
62da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    close_out oc
63da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  (* test get_module exceptions *)
66da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  test begin
67da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    try
68da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      let mb = Llvm.MemoryBuffer.of_file fn in
6916609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      let m = begin try
7016609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar        Llvm_bitreader.get_module context mb
71da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      with x ->
72da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen        Llvm.MemoryBuffer.dispose mb;
73da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen        raise x
74da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      end in
7516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      Llvm.dispose_module m;
76da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      false
77da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with Llvm_bitreader.Error _ ->
78da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      true
79da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end
80