1b405bbe6648d24b0cb5b03dc43c3997ac4f50a9bErick Tryzelaar(* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_bitreader.cmxa llvm_bitwriter.cmxa %s -o %t
22a7d731828ab87bba42f7ecac8db509646cd2cddBob Wilson * RUN: %t %t.bc
3b4f6095bae5edfe9d6cabfe4802e6f6187e073f2Nick Lewycky * RUN: llvm-dis < %t.bc
4874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar * XFAIL: vg_leak
5bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *)
6bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
7bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen(* Note that this takes a moment to link, so it's best to keep the number of
8bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen   individual tests low. *)
9bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaarlet context = Llvm.global_context ()
115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
12bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenlet test x = if not x then exit 1 else ()
13bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
14bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenlet _ =
15bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  let fn = Sys.argv.(1) in
165371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  let m = Llvm.create_module context "ocaml_test_module" in
17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  test (Llvm_bitwriter.write_bitcode_file m fn);
19bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
20bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  Llvm.dispose_module m;
21bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* parse_bitcode *)
23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin
24da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file fn in
25da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    begin try
265371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar      let m = Llvm_bitreader.parse_bitcode context mb in
27da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      Llvm.dispose_module m
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with x ->
297a653cb24d4dda283d34c984e81514ac1547796eGordon Henriksen      Llvm.MemoryBuffer.dispose mb;
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      raise x
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    end
32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
33da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
34da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* MemoryBuffer.of_file *)
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  test begin try
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file (fn ^ ".bogus") in
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    Llvm.MemoryBuffer.dispose mb;
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    false
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  with Llvm.IoError _ ->
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    true
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
4316609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  (* get_module *)
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    let mb = Llvm.MemoryBuffer.of_file fn in
4616609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar    let m = begin try
4716609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      Llvm_bitreader.get_module context mb
48da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with x ->
49da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      Llvm.MemoryBuffer.dispose mb;
50da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      raise x
51da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    end in
5216609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar    Llvm.dispose_module m
53da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
54da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
55da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  (* corrupt the bitcode *)
56da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  let fn = fn ^ ".txt" in
57da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  begin let oc = open_out fn in
58da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    output_string oc "not a bitcode file\n";
59da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    close_out oc
60da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end;
61da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
6216609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar  (* test get_module exceptions *)
63da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  test begin
64da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    try
65da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      let mb = Llvm.MemoryBuffer.of_file fn in
6616609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      let m = begin try
6716609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar        Llvm_bitreader.get_module context mb
68da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      with x ->
69da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen        Llvm.MemoryBuffer.dispose mb;
70da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen        raise x
71da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      end in
7216609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar      Llvm.dispose_module m;
73da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      false
74da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    with Llvm_bitreader.Error _ ->
75da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      true
76da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  end
77