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