1(* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_bitreader.cmxa llvm_bitwriter.cmxa %s -o %t 2 * RUN: %t %t.bc 3 * RUN: llvm-dis < %t.bc 4 * XFAIL: vg_leak 5 *) 6 7(* Note that this takes a moment to link, so it's best to keep the number of 8 individual tests low. *) 9 10let context = Llvm.global_context () 11 12let test x = if not x then exit 1 else () 13 14let _ = 15 let fn = Sys.argv.(1) in 16 let m = Llvm.create_module context "ocaml_test_module" in 17 18 test (Llvm_bitwriter.write_bitcode_file m fn); 19 20 Llvm.dispose_module m; 21 22 (* parse_bitcode *) 23 begin 24 let mb = Llvm.MemoryBuffer.of_file fn in 25 begin try 26 let m = Llvm_bitreader.parse_bitcode context mb in 27 Llvm.dispose_module m 28 with x -> 29 Llvm.MemoryBuffer.dispose mb; 30 raise x 31 end 32 end; 33 34 (* MemoryBuffer.of_file *) 35 test begin try 36 let mb = Llvm.MemoryBuffer.of_file (fn ^ ".bogus") in 37 Llvm.MemoryBuffer.dispose mb; 38 false 39 with Llvm.IoError _ -> 40 true 41 end; 42 43 (* get_module *) 44 begin 45 let mb = Llvm.MemoryBuffer.of_file fn in 46 let m = begin try 47 Llvm_bitreader.get_module context mb 48 with x -> 49 Llvm.MemoryBuffer.dispose mb; 50 raise x 51 end in 52 Llvm.dispose_module m 53 end; 54 55 (* corrupt the bitcode *) 56 let fn = fn ^ ".txt" in 57 begin let oc = open_out fn in 58 output_string oc "not a bitcode file\n"; 59 close_out oc 60 end; 61 62 (* test get_module exceptions *) 63 test begin 64 try 65 let mb = Llvm.MemoryBuffer.of_file fn in 66 let m = begin try 67 Llvm_bitreader.get_module context mb 68 with x -> 69 Llvm.MemoryBuffer.dispose mb; 70 raise x 71 end in 72 Llvm.dispose_module m; 73 false 74 with Llvm_bitreader.Error _ -> 75 true 76 end 77