1f9d07890SQiongsi Wu; Tests if the __llvm_gcov_ctr section contains a .ref pseudo-op 2f9d07890SQiongsi Wu; referring to the __llvm_covinit section. 3f9d07890SQiongsi Wu; RUN: llc < %s | FileCheck --check-prefixes=CHECK,CHECK-RW %s 4f9d07890SQiongsi Wu; RUN: llc -mxcoff-roptr < %s | FileCheck --check-prefixes=CHECK,CHECK-RO %s 5f9d07890SQiongsi Wu 6f9d07890SQiongsi Wutarget datalayout = "E-m:a-p:32:32-Fi32-i64:64-n32" 7f9d07890SQiongsi Wutarget triple = "powerpc-ibm-aix" 8f9d07890SQiongsi Wu 9f9d07890SQiongsi Wu; CHECK-RW: .csect __llvm_covinit[RW],3 10f9d07890SQiongsi Wu; CHECK-RO: .csect __llvm_covinit[RO],3 11f9d07890SQiongsi Wu; CHECK-NEXT: .align 3 # @__llvm_covinit_functions 12f9d07890SQiongsi Wu; CHECK-NEXT: L..__llvm_covinit_functions: 13f9d07890SQiongsi Wu; CHECK-NEXT: .vbyte 4, __llvm_gcov_writeout[DS] 14f9d07890SQiongsi Wu; CHECK-NEXT: .vbyte 4, __llvm_gcov_reset[DS] 15f9d07890SQiongsi Wu; CHECK: .csect __llvm_gcov_ctr_section[RW],3 16*b1a34b80SZaara Syeda; CHECK-NEXT: .lglobl __llvm_gcov_ctr # @_MergedGlobals 17*b1a34b80SZaara Syeda; CHECK-NEXT: .lglobl __llvm_gcov_ctr.1 18*b1a34b80SZaara Syeda; CHECK-NEXT: .align 3 19*b1a34b80SZaara Syeda; CHECK-NEXT: L.._MergedGlobals: 20*b1a34b80SZaara Syeda; CHECK-NEXT: __llvm_gcov_ctr: 21*b1a34b80SZaara Syeda; CHECK-NEXT: .space 8 22*b1a34b80SZaara Syeda; CHECK-NEXT: __llvm_gcov_ctr.1: 23*b1a34b80SZaara Syeda; CHECK-NEXT: .space 8 2415595683SZaara Syeda; CHECK: .csect __llvm_gcov_ctr_section[RW],3 25f9d07890SQiongsi Wu; CHECK-RW-NEXT: .ref __llvm_covinit[RW] 26f9d07890SQiongsi Wu; CHECK-RO-NEXT: .ref __llvm_covinit[RO] 27f9d07890SQiongsi Wu 28f9d07890SQiongsi Wu%emit_function_args_ty = type { i32, i32, i32 } 29f9d07890SQiongsi Wu%emit_arcs_args_ty = type { i32, ptr } 30f9d07890SQiongsi Wu%file_info = type { %start_file_args_ty, i32, ptr, ptr } 31f9d07890SQiongsi Wu%start_file_args_ty = type { ptr, i32, i32 } 32f9d07890SQiongsi Wu 33f9d07890SQiongsi Wu@__llvm_gcov_ctr = internal global [1 x i64] zeroinitializer, section "__llvm_gcov_ctr_section" 34f9d07890SQiongsi Wu@__llvm_gcov_ctr.1 = internal global [1 x i64] zeroinitializer, section "__llvm_gcov_ctr_section" 35f9d07890SQiongsi Wu@0 = private unnamed_addr constant [10 x i8] c"test.gcda\00", align 1 36f9d07890SQiongsi Wu@__llvm_internal_gcov_emit_function_args.0 = internal unnamed_addr constant [2 x %emit_function_args_ty] [%emit_function_args_ty { i32 0, i32 1961870044, i32 -801444649 }, %emit_function_args_ty { i32 1, i32 1795396728, i32 -801444649 }] 37f9d07890SQiongsi Wu@__llvm_internal_gcov_emit_arcs_args.0 = internal unnamed_addr constant [2 x %emit_arcs_args_ty] [%emit_arcs_args_ty { i32 1, ptr @__llvm_gcov_ctr }, %emit_arcs_args_ty { i32 1, ptr @__llvm_gcov_ctr.1 }] 38f9d07890SQiongsi Wu@__llvm_internal_gcov_emit_file_info = internal unnamed_addr constant [1 x %file_info] [%file_info { %start_file_args_ty { ptr @0, i32 875575338, i32 -801444649 }, i32 2, ptr @__llvm_internal_gcov_emit_function_args.0, ptr @__llvm_internal_gcov_emit_arcs_args.0 }] 39f9d07890SQiongsi Wu@__llvm_covinit_functions = private constant { ptr, ptr } { ptr @__llvm_gcov_writeout, ptr @__llvm_gcov_reset }, section "__llvm_covinit", align 8 40f9d07890SQiongsi Wu 41f9d07890SQiongsi Wudefine i32 @bar() { 42f9d07890SQiongsi Wuentry: 43f9d07890SQiongsi Wu %gcov_ctr = load i64, ptr @__llvm_gcov_ctr, align 8 44f9d07890SQiongsi Wu %0 = add i64 %gcov_ctr, 1 45f9d07890SQiongsi Wu store i64 %0, ptr @__llvm_gcov_ctr, align 8 46f9d07890SQiongsi Wu ret i32 1 47f9d07890SQiongsi Wu} 48f9d07890SQiongsi Wu 49f9d07890SQiongsi Wudefine i32 @main() { 50f9d07890SQiongsi Wuentry: 51f9d07890SQiongsi Wu %gcov_ctr = load i64, ptr @__llvm_gcov_ctr.1, align 8 52f9d07890SQiongsi Wu %0 = add i64 %gcov_ctr, 1 53f9d07890SQiongsi Wu store i64 %0, ptr @__llvm_gcov_ctr.1, align 8 54f9d07890SQiongsi Wu %retval = alloca i32, align 4 55f9d07890SQiongsi Wu store i32 0, ptr %retval, align 4 56f9d07890SQiongsi Wu %call = call i32 @bar() 57f9d07890SQiongsi Wu %sub = sub nsw i32 %call, 1 58f9d07890SQiongsi Wu ret i32 %sub 59f9d07890SQiongsi Wu} 60f9d07890SQiongsi Wu 61f9d07890SQiongsi Wudefine internal void @__llvm_gcov_writeout() unnamed_addr { 62f9d07890SQiongsi Wuentry: 63f9d07890SQiongsi Wu br label %file.loop.header 64f9d07890SQiongsi Wu 65f9d07890SQiongsi Wufile.loop.header: ; preds = %file.loop.latch, %entry 66f9d07890SQiongsi Wu %file_idx = phi i32 [ 0, %entry ], [ %next_file_idx, %file.loop.latch ] 67f9d07890SQiongsi Wu %0 = getelementptr inbounds [1 x %file_info], ptr @__llvm_internal_gcov_emit_file_info, i32 0, i32 %file_idx 68f9d07890SQiongsi Wu %start_file_args = getelementptr inbounds nuw %file_info, ptr %0, i32 0, i32 0 69f9d07890SQiongsi Wu %1 = getelementptr inbounds nuw %start_file_args_ty, ptr %start_file_args, i32 0, i32 0 70f9d07890SQiongsi Wu %filename = load ptr, ptr %1, align 4 71f9d07890SQiongsi Wu %2 = getelementptr inbounds nuw %start_file_args_ty, ptr %start_file_args, i32 0, i32 1 72f9d07890SQiongsi Wu %version = load i32, ptr %2, align 4 73f9d07890SQiongsi Wu %3 = getelementptr inbounds nuw %start_file_args_ty, ptr %start_file_args, i32 0, i32 2 74f9d07890SQiongsi Wu %stamp = load i32, ptr %3, align 4 75f9d07890SQiongsi Wu call void @llvm_gcda_start_file(ptr %filename, i32 %version, i32 %stamp) 76f9d07890SQiongsi Wu %4 = getelementptr inbounds nuw %file_info, ptr %0, i32 0, i32 1 77f9d07890SQiongsi Wu %num_ctrs = load i32, ptr %4, align 4 78f9d07890SQiongsi Wu %5 = getelementptr inbounds nuw %file_info, ptr %0, i32 0, i32 2 79f9d07890SQiongsi Wu %emit_function_args = load ptr, ptr %5, align 4 80f9d07890SQiongsi Wu %6 = getelementptr inbounds nuw %file_info, ptr %0, i32 0, i32 3 81f9d07890SQiongsi Wu %emit_arcs_args = load ptr, ptr %6, align 4 82f9d07890SQiongsi Wu %7 = icmp slt i32 0, %num_ctrs 83f9d07890SQiongsi Wu br i1 %7, label %counter.loop.header, label %file.loop.latch 84f9d07890SQiongsi Wu 85f9d07890SQiongsi Wucounter.loop.header: ; preds = %counter.loop.header, %file.loop.header 86f9d07890SQiongsi Wu %ctr_idx = phi i32 [ 0, %file.loop.header ], [ %15, %counter.loop.header ] 87f9d07890SQiongsi Wu %8 = getelementptr inbounds %emit_function_args_ty, ptr %emit_function_args, i32 %ctr_idx 88f9d07890SQiongsi Wu %9 = getelementptr inbounds nuw %emit_function_args_ty, ptr %8, i32 0, i32 0 89f9d07890SQiongsi Wu %ident = load i32, ptr %9, align 4 90f9d07890SQiongsi Wu %10 = getelementptr inbounds nuw %emit_function_args_ty, ptr %8, i32 0, i32 1 91f9d07890SQiongsi Wu %func_checkssum = load i32, ptr %10, align 4 92f9d07890SQiongsi Wu %11 = getelementptr inbounds nuw %emit_function_args_ty, ptr %8, i32 0, i32 2 93f9d07890SQiongsi Wu %cfg_checksum = load i32, ptr %11, align 4 94f9d07890SQiongsi Wu call void @llvm_gcda_emit_function(i32 %ident, i32 %func_checkssum, i32 %cfg_checksum) 95f9d07890SQiongsi Wu %12 = getelementptr inbounds %emit_arcs_args_ty, ptr %emit_arcs_args, i32 %ctr_idx 96f9d07890SQiongsi Wu %13 = getelementptr inbounds nuw %emit_arcs_args_ty, ptr %12, i32 0, i32 0 97f9d07890SQiongsi Wu %num_counters = load i32, ptr %13, align 4 98f9d07890SQiongsi Wu %14 = getelementptr inbounds nuw %emit_arcs_args_ty, ptr %12, i32 0, i32 1 99f9d07890SQiongsi Wu %counters = load ptr, ptr %14, align 4 100f9d07890SQiongsi Wu call void @llvm_gcda_emit_arcs(i32 %num_counters, ptr %counters) 101f9d07890SQiongsi Wu %15 = add i32 %ctr_idx, 1 102f9d07890SQiongsi Wu %16 = icmp slt i32 %15, %num_ctrs 103f9d07890SQiongsi Wu br i1 %16, label %counter.loop.header, label %file.loop.latch 104f9d07890SQiongsi Wu 105f9d07890SQiongsi Wufile.loop.latch: ; preds = %counter.loop.header, %file.loop.header 106f9d07890SQiongsi Wu call void @llvm_gcda_summary_info() 107f9d07890SQiongsi Wu call void @llvm_gcda_end_file() 108f9d07890SQiongsi Wu %next_file_idx = add i32 %file_idx, 1 109f9d07890SQiongsi Wu %17 = icmp slt i32 %next_file_idx, 1 110f9d07890SQiongsi Wu br i1 %17, label %file.loop.header, label %exit 111f9d07890SQiongsi Wu 112f9d07890SQiongsi Wuexit: ; preds = %file.loop.latch 113f9d07890SQiongsi Wu ret void 114f9d07890SQiongsi Wu} 115f9d07890SQiongsi Wu 116f9d07890SQiongsi Wudeclare void @llvm_gcda_start_file(ptr, i32, i32) 117f9d07890SQiongsi Wu 118f9d07890SQiongsi Wudeclare void @llvm_gcda_emit_function(i32, i32, i32) 119f9d07890SQiongsi Wu 120f9d07890SQiongsi Wudeclare void @llvm_gcda_emit_arcs(i32, ptr) 121f9d07890SQiongsi Wu 122f9d07890SQiongsi Wudeclare void @llvm_gcda_summary_info() 123f9d07890SQiongsi Wu 124f9d07890SQiongsi Wudeclare void @llvm_gcda_end_file() 125f9d07890SQiongsi Wu 126f9d07890SQiongsi Wudefine internal void @__llvm_gcov_reset() unnamed_addr { 127f9d07890SQiongsi Wuentry: 128f9d07890SQiongsi Wu call void @llvm.memset.p0.i64(ptr @__llvm_gcov_ctr, i8 0, i64 8, i1 false) 129f9d07890SQiongsi Wu call void @llvm.memset.p0.i64(ptr @__llvm_gcov_ctr.1, i8 0, i64 8, i1 false) 130f9d07890SQiongsi Wu ret void 131f9d07890SQiongsi Wu} 132f9d07890SQiongsi Wu 133f9d07890SQiongsi Wudeclare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) 134f9d07890SQiongsi Wu 135f9d07890SQiongsi Wu 136