1*9880d681SAndroid Build Coastguard Worker(* RUN: cp %s %T/target.ml 2*9880d681SAndroid Build Coastguard Worker * RUN: %ocamlc -g -w +A -package llvm.target -package llvm.all_backends -linkpkg %T/target.ml -o %t 3*9880d681SAndroid Build Coastguard Worker * RUN: %ocamlopt -g -w +A -package llvm.target -package llvm.all_backends -linkpkg %T/target.ml -o %t 4*9880d681SAndroid Build Coastguard Worker * RUN: %t %t.bc 5*9880d681SAndroid Build Coastguard Worker * XFAIL: vg_leak 6*9880d681SAndroid Build Coastguard Worker *) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker(* Note: It takes several seconds for ocamlopt to link an executable with 9*9880d681SAndroid Build Coastguard Worker libLLVMCore.a, so it's better to write a big test than a bunch of 10*9880d681SAndroid Build Coastguard Worker little ones. *) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workeropen Llvm 13*9880d681SAndroid Build Coastguard Workeropen Llvm_target 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerlet () = Llvm_all_backends.initialize () 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerlet context = global_context () 18*9880d681SAndroid Build Coastguard Workerlet i32_type = Llvm.i32_type context 19*9880d681SAndroid Build Coastguard Workerlet i64_type = Llvm.i64_type context 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker(* Tiny unit test framework - really just to help find which line is busted *) 22*9880d681SAndroid Build Coastguard Workerlet print_checkpoints = false 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerlet _ = 25*9880d681SAndroid Build Coastguard Worker Printexc.record_backtrace true 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerlet assert_equal a b = 28*9880d681SAndroid Build Coastguard Worker if a <> b then failwith "assert_equal" 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker(*===-- Fixture -----------------------------------------------------------===*) 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerlet filename = Sys.argv.(1) 34*9880d681SAndroid Build Coastguard Workerlet m = create_module context filename 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerlet target = Target.by_triple (Target.default_triple ()) 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerlet machine = TargetMachine.create (Target.default_triple ()) target 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker(*===-- Data Layout -------------------------------------------------------===*) 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerlet test_target_data () = 43*9880d681SAndroid Build Coastguard Worker let module DL = DataLayout in 44*9880d681SAndroid Build Coastguard Worker let layout = "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-n32-S32" in 45*9880d681SAndroid Build Coastguard Worker let dl = DL.of_string layout in 46*9880d681SAndroid Build Coastguard Worker let sty = struct_type context [| i32_type; i64_type |] in 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker assert_equal (DL.as_string dl) layout; 49*9880d681SAndroid Build Coastguard Worker assert_equal (DL.byte_order dl) Endian.Little; 50*9880d681SAndroid Build Coastguard Worker assert_equal (DL.pointer_size dl) 4; 51*9880d681SAndroid Build Coastguard Worker assert_equal (DL.intptr_type context dl) i32_type; 52*9880d681SAndroid Build Coastguard Worker assert_equal (DL.qualified_pointer_size 0 dl) 4; 53*9880d681SAndroid Build Coastguard Worker assert_equal (DL.qualified_intptr_type context 0 dl) i32_type; 54*9880d681SAndroid Build Coastguard Worker assert_equal (DL.size_in_bits sty dl) (Int64.of_int 96); 55*9880d681SAndroid Build Coastguard Worker assert_equal (DL.store_size sty dl) (Int64.of_int 12); 56*9880d681SAndroid Build Coastguard Worker assert_equal (DL.abi_size sty dl) (Int64.of_int 12); 57*9880d681SAndroid Build Coastguard Worker assert_equal (DL.stack_align sty dl) 4; 58*9880d681SAndroid Build Coastguard Worker assert_equal (DL.preferred_align sty dl) 8; 59*9880d681SAndroid Build Coastguard Worker assert_equal (DL.preferred_align_of_global (declare_global sty "g" m) dl) 8; 60*9880d681SAndroid Build Coastguard Worker assert_equal (DL.element_at_offset sty (Int64.of_int 1) dl) 0; 61*9880d681SAndroid Build Coastguard Worker assert_equal (DL.offset_of_element sty 1 dl) (Int64.of_int 4) 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker(*===-- Target ------------------------------------------------------------===*) 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerlet test_target () = 67*9880d681SAndroid Build Coastguard Worker let module T = Target in 68*9880d681SAndroid Build Coastguard Worker ignore (T.succ target); 69*9880d681SAndroid Build Coastguard Worker ignore (T.name target); 70*9880d681SAndroid Build Coastguard Worker ignore (T.description target); 71*9880d681SAndroid Build Coastguard Worker ignore (T.has_jit target); 72*9880d681SAndroid Build Coastguard Worker ignore (T.has_target_machine target); 73*9880d681SAndroid Build Coastguard Worker ignore (T.has_asm_backend target) 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker(*===-- Target Machine ----------------------------------------------------===*) 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerlet test_target_machine () = 79*9880d681SAndroid Build Coastguard Worker let module TM = TargetMachine in 80*9880d681SAndroid Build Coastguard Worker assert_equal (TM.target machine) target; 81*9880d681SAndroid Build Coastguard Worker assert_equal (TM.triple machine) (Target.default_triple ()); 82*9880d681SAndroid Build Coastguard Worker assert_equal (TM.cpu machine) ""; 83*9880d681SAndroid Build Coastguard Worker assert_equal (TM.features machine) ""; 84*9880d681SAndroid Build Coastguard Worker ignore (TM.data_layout machine); 85*9880d681SAndroid Build Coastguard Worker TM.set_verbose_asm true machine; 86*9880d681SAndroid Build Coastguard Worker let pm = PassManager.create () in 87*9880d681SAndroid Build Coastguard Worker TM.add_analysis_passes pm machine 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker(*===-- Code Emission -----------------------------------------------------===*) 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerlet test_code_emission () = 93*9880d681SAndroid Build Coastguard Worker TargetMachine.emit_to_file m CodeGenFileType.ObjectFile filename machine; 94*9880d681SAndroid Build Coastguard Worker try 95*9880d681SAndroid Build Coastguard Worker TargetMachine.emit_to_file m CodeGenFileType.ObjectFile 96*9880d681SAndroid Build Coastguard Worker "/nonexistent/file" machine; 97*9880d681SAndroid Build Coastguard Worker failwith "must raise" 98*9880d681SAndroid Build Coastguard Worker with Llvm_target.Error _ -> 99*9880d681SAndroid Build Coastguard Worker (); 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker let buf = TargetMachine.emit_to_memory_buffer m CodeGenFileType.ObjectFile 102*9880d681SAndroid Build Coastguard Worker machine in 103*9880d681SAndroid Build Coastguard Worker Llvm.MemoryBuffer.dispose buf 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker(*===-- Driver ------------------------------------------------------------===*) 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerlet _ = 109*9880d681SAndroid Build Coastguard Worker test_target_data (); 110*9880d681SAndroid Build Coastguard Worker test_target (); 111*9880d681SAndroid Build Coastguard Worker test_target_machine (); 112*9880d681SAndroid Build Coastguard Worker test_code_emission (); 113*9880d681SAndroid Build Coastguard Worker dispose_module m 114