debug-info-same-line.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -g -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s 25ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl 35ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// Make sure that clang outputs distinct debug info for a function 45ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// that is inlined twice on the same line. Otherwise it would appear 55ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// as if the function was only inlined once. 600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl#define INLINE inline __attribute__((always_inline)) 800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian PrantlINLINE int 1000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlproduct (int x, int y) 1100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl{ 1200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl int result = x * y; 1300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return result; 1400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl} 1500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 1600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian PrantlINLINE int 1700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlsum (int a, int b) 1800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl{ 1900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl int result = a + b; 2000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return result; 2100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl} 2200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 2300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlint 2400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlstrange_max (int m, int n) 2500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl{ 2600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (m > n) 2700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return m; 2800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl else if (n > m) 2900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return n; 3000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl else 3100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return 0; 3200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl} 3300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 3400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlint 3500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlfoo (int i, int j) 3600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl{ 3700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (strange_max (i, j) == i) 3800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return product (i, j); 3900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl else if (strange_max (i, j) == j) 4000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return sum (i, j); 4100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl else 4200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl return product (sum (i, i), sum (j, j)); 4300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl} 4400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 4500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlint 4600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlmain(int argc, char const *argv[]) 4700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl{ 4800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 4900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl int array[3]; 506b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl int n; 5100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 5200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl array[0] = foo (1238, 78392); 5300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl array[1] = foo (379265, 23674); 5400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl array[2] = foo (872934, 234); 5500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 566b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl n = strange_max(array[0], strange_max(array[1], array[2])); 576b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl 586b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl return n & 0xf; 5900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl} 6000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl 61b38b3cd64c24500cbea9e6dfe774407dd6ef4a79Adrian Prantl// CHECK: define {{.*}} @_Z3fooii 625ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// i 635ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 645ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// j 655ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 665ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// x 675ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 685ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// y 695ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 705ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// result 715ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 725ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl 735ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD:[0-9]+]]), !dbg ![[A_DI:[0-9]+]] 745ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD:[0-9]+]]), !dbg ![[B_DI:[0-9]+]] 755ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// result 765ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 775ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl 785ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// We want to see a distinct !dbg node. 795ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg ![[A_DI]] 805ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg !{{.*}} 815ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg ![[B_DI]] 825ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg !{{.*}} 835ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// result 845ca58a0aca0320b8980921e8ee55112668817939Adrian Prantl// CHECK: call void @llvm.dbg.declare 856b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl 86b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// We want to see a distinct !dbg node. 87b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg ![[A_DI]] 88b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[A_MD]]), !dbg !{{.*}} 89b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-NOT: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg ![[B_DI]] 90b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[B_MD]]), !dbg !{{.*}} 91b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// result 92b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare 93b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl 94b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// Again: we want to see a distinct !dbg node. 95b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[X_MD:[0-9]+]]), !dbg ![[X_DI:[0-9]+]] 96b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare(metadata !{i32* %{{.*}}}, metadata ![[Y_MD:[0-9]+]]), !dbg ![[Y_DI:[0-9]+]] 97b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// result 98b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK: call void @llvm.dbg.declare 99b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl 100b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl 1016b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: define {{.*}} @main 1026b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: call {{.*}} @_Z3fooii 1036b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: call {{.*}} @_Z3fooii 1046b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: call {{.*}} @_Z3fooii 1056b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: store 1066b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: getelementptr 1076b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// We want to see the same !dbg node for non-inlined functions. 1086b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// Needed for GDB compatibility. 1096b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: load {{.*}} !dbg ![[DBG:.*]] 1106b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: load {{.*}} !dbg ![[DBG]] 1116b6a9b3f7b54e1df0976027ab623bafa3d769638Adrian Prantl// CHECK: load {{.*}} !dbg ![[DBG]] 112fd44d34ab626a19819ad0e87a03e4bf014ec94fdAdrian Prantl// CHECK: call {{.*}} @_Z11strange_maxii(i32 {{.*}}, i32 {{.*}}), !dbg ![[DBG]] 113fd44d34ab626a19819ad0e87a03e4bf014ec94fdAdrian Prantl// CHECK: call {{.*}} @_Z11strange_maxii(i32 {{.*}}, i32 {{.*}}), !dbg ![[DBG]] 114b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl 115b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl 116b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// Verify that product() has its own inlined_at location at column 15. 117b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[A_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [a] 118b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[B_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [b] 119b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[X_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [x] 120b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[Y_MD]] = metadata{{.*}}[ DW_TAG_arg_variable ] [y] 121b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[X_DI]] = metadata !{i32 {{[0-9]+}}, i32 {{[0-9]+}}, metadata !{{[0-9]+}}, metadata ![[PRODUCT:[0-9]+]]} 122b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: [[PRODUCT]] = metadata !{i32 {{.*}}, i32 16, metadata !{{.*}}, null} 123b0e603c63813c8378e35a75408ab4cefe71e93e2Adrian Prantl// CHECK-DAG: ![[Y_DI]] = metadata !{i32 {{[0-9]+}}, i32 {{[0-9]+}}, metadata !{{[0-9]+}}, metadata ![[PRODUCT]]} 124