1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -g -emit-llvm -o - %s | FileCheck %s 2*f4a2713aSLionel Sambuc 3*f4a2713aSLionel Sambuc // Make sure that clang outputs distinct debug info for a function 4*f4a2713aSLionel Sambuc // that is inlined twice on the same line. Otherwise it would appear 5*f4a2713aSLionel Sambuc // as if the function was only inlined once. 6*f4a2713aSLionel Sambuc 7*f4a2713aSLionel Sambuc #define INLINE inline __attribute__((always_inline)) 8*f4a2713aSLionel Sambuc 9*f4a2713aSLionel Sambuc INLINE int 10*f4a2713aSLionel Sambuc product (int x, int y) 11*f4a2713aSLionel Sambuc { 12*f4a2713aSLionel Sambuc int result = x * y; 13*f4a2713aSLionel Sambuc return result; 14*f4a2713aSLionel Sambuc } 15*f4a2713aSLionel Sambuc 16*f4a2713aSLionel Sambuc INLINE int 17*f4a2713aSLionel Sambuc sum (int a, int b) 18*f4a2713aSLionel Sambuc { 19*f4a2713aSLionel Sambuc int result = a + b; 20*f4a2713aSLionel Sambuc return result; 21*f4a2713aSLionel Sambuc } 22*f4a2713aSLionel Sambuc 23*f4a2713aSLionel Sambuc int 24*f4a2713aSLionel Sambuc strange_max (int m, int n) 25*f4a2713aSLionel Sambuc { 26*f4a2713aSLionel Sambuc if (m > n) 27*f4a2713aSLionel Sambuc return m; 28*f4a2713aSLionel Sambuc else if (n > m) 29*f4a2713aSLionel Sambuc return n; 30*f4a2713aSLionel Sambuc else 31*f4a2713aSLionel Sambuc return 0; 32*f4a2713aSLionel Sambuc } 33*f4a2713aSLionel Sambuc 34*f4a2713aSLionel Sambuc int 35*f4a2713aSLionel Sambuc foo (int i, int j) 36*f4a2713aSLionel Sambuc { 37*f4a2713aSLionel Sambuc if (strange_max (i, j) == i) 38*f4a2713aSLionel Sambuc return product (i, j); 39*f4a2713aSLionel Sambuc else if (strange_max (i, j) == j) 40*f4a2713aSLionel Sambuc return sum (i, j); 41*f4a2713aSLionel Sambuc else 42*f4a2713aSLionel Sambuc return product (sum (i, i), sum (j, j)); 43*f4a2713aSLionel Sambuc } 44*f4a2713aSLionel Sambuc 45*f4a2713aSLionel Sambuc int 46*f4a2713aSLionel Sambuc main(int argc, char const *argv[]) 47*f4a2713aSLionel Sambuc { 48*f4a2713aSLionel Sambuc 49*f4a2713aSLionel Sambuc int array[3]; 50*f4a2713aSLionel Sambuc int n; 51*f4a2713aSLionel Sambuc 52*f4a2713aSLionel Sambuc array[0] = foo (1238, 78392); 53*f4a2713aSLionel Sambuc array[1] = foo (379265, 23674); 54*f4a2713aSLionel Sambuc array[2] = foo (872934, 234); 55*f4a2713aSLionel Sambuc 56*f4a2713aSLionel Sambuc n = strange_max(array[0], strange_max(array[1], array[2])); 57*f4a2713aSLionel Sambuc 58*f4a2713aSLionel Sambuc return n & 0xf; 59*f4a2713aSLionel Sambuc } 60*f4a2713aSLionel Sambuc 61*f4a2713aSLionel Sambuc // CHECK: define {{.*}} @_Z3fooii 62*f4a2713aSLionel Sambuc // i 63*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 64*f4a2713aSLionel Sambuc // j 65*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 66*f4a2713aSLionel Sambuc // x 67*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 68*f4a2713aSLionel Sambuc // y 69*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 70*f4a2713aSLionel Sambuc // result 71*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 72*f4a2713aSLionel Sambuc 73*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD:[0-9]+]]), !dbg ![[A_DI:[0-9]+]] 74*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD:[0-9]+]]), !dbg ![[B_DI:[0-9]+]] 75*f4a2713aSLionel Sambuc // result 76*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 77*f4a2713aSLionel Sambuc 78*f4a2713aSLionel Sambuc // We want to see a distinct !dbg node. 79*f4a2713aSLionel Sambuc // CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg ![[A_DI]] 80*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg !{{.*}} 81*f4a2713aSLionel Sambuc // CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg ![[B_DI]] 82*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg !{{.*}} 83*f4a2713aSLionel Sambuc // result 84*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 85*f4a2713aSLionel Sambuc 86*f4a2713aSLionel Sambuc // We want to see a distinct !dbg node. 87*f4a2713aSLionel Sambuc // CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg ![[A_DI]] 88*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg !{{.*}} 89*f4a2713aSLionel Sambuc // CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg ![[B_DI]] 90*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg !{{.*}} 91*f4a2713aSLionel Sambuc // result 92*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 93*f4a2713aSLionel Sambuc 94*f4a2713aSLionel Sambuc // Again: we want to see a distinct !dbg node. 95*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[X_MD:[0-9]+]]), !dbg ![[X_DI:[0-9]+]] 96*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[Y_MD:[0-9]+]]), !dbg ![[Y_DI:[0-9]+]] 97*f4a2713aSLionel Sambuc // result 98*f4a2713aSLionel Sambuc // CHECK: call void @llvm.dbg.declare 99*f4a2713aSLionel Sambuc 100*f4a2713aSLionel Sambuc 101*f4a2713aSLionel Sambuc // CHECK: define {{.*}} @main 102*f4a2713aSLionel Sambuc // CHECK: call {{.*}} @_Z3fooii 103*f4a2713aSLionel Sambuc // CHECK: call {{.*}} @_Z3fooii 104*f4a2713aSLionel Sambuc // CHECK: call {{.*}} @_Z3fooii 105*f4a2713aSLionel Sambuc // CHECK: store 106*f4a2713aSLionel Sambuc // CHECK: getelementptr 107*f4a2713aSLionel Sambuc // We want to see the same !dbg node for non-inlined functions. 108*f4a2713aSLionel Sambuc // Needed for GDB compatibility. 109*f4a2713aSLionel Sambuc // CHECK: load {{.*}} !dbg ![[DBG:.*]] 110*f4a2713aSLionel Sambuc // CHECK: load {{.*}} !dbg ![[DBG]] 111*f4a2713aSLionel Sambuc // CHECK: load {{.*}} !dbg ![[DBG]] 112*f4a2713aSLionel Sambuc // CHECK: call {{.*}} @_Z11strange_maxii(i32 {{.*}}, i32 {{.*}}), !dbg ![[DBG]] 113*f4a2713aSLionel Sambuc // CHECK: call {{.*}} @_Z11strange_maxii(i32 {{.*}}, i32 {{.*}}), !dbg ![[DBG]] 114*f4a2713aSLionel Sambuc 115*f4a2713aSLionel Sambuc 116*f4a2713aSLionel Sambuc // Verify that product() has its own inlined_at location at column 15. 117*f4a2713aSLionel Sambuc // CHECK-DAG: ![[A_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [a] 118*f4a2713aSLionel Sambuc // CHECK-DAG: ![[B_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [b] 119*f4a2713aSLionel Sambuc // CHECK-DAG: ![[X_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [x] 120*f4a2713aSLionel Sambuc // CHECK-DAG: ![[Y_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [y] 121*f4a2713aSLionel Sambuc // CHECK-DAG: ![[X_DI]] = metadata !{i32 {{[0-9]+}}, i32 {{[0-9]+}}, metadata !{{[0-9]+}}, metadata ![[PRODUCT:[0-9]+]]} 122*f4a2713aSLionel Sambuc // CHECK-DAG: [[PRODUCT]] = metadata !{i32 {{.*}}, i32 16, metadata !{{.*}}, null} 123*f4a2713aSLionel Sambuc // CHECK-DAG: ![[Y_DI]] = metadata !{i32 {{[0-9]+}}, i32 {{[0-9]+}}, metadata !{{[0-9]+}}, metadata ![[PRODUCT]]} 124