10a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar(* RUN: rm -rf %t.builddir
20a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: mkdir -p %t.builddir
30a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: cp %s %t.builddir
40a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * RUN: %ocamlopt -warn-error A llvm.cmxa llvm_bitreader.cmxa llvm_bitwriter.cmxa %t.builddir/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
20bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
21bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  test (Llvm_bitwriter.write_bitcode_file m fn);
22bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
23bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  Llvm.dispose_module m;
24bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  
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;
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
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;
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
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;
57da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
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;
64da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  
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