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