xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/debug-info-same-line.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
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