xref: /aosp_15_r20/external/clang/test/CodeGenCXX/debug-info.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=BOTH
2*67e74705SXin Li // RUN: %clang_cc1 -triple i686-pc-windows-msvc -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=MSVC --check-prefix=BOTH
3*67e74705SXin Li 
4*67e74705SXin Li // CHECK: define void @_ZN7pr147634funcENS_3fooE
5*67e74705SXin Li // CHECK: call void @llvm.dbg.declare({{.*}}, metadata ![[F:[0-9]+]], metadata ![[EXPR:[0-9]+]])
6*67e74705SXin Li 
7*67e74705SXin Li // !llvm.dbg.cu pulls in globals and their types first.
8*67e74705SXin Li // CHECK-NOT: !DIGlobalVariable(name: "c"
9*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "x", linkageName: "_ZN6pr96081xE"
10*67e74705SXin Li // CHECK-SAME:              type: [[INCARRAYPTR:![0-9]*]]
11*67e74705SXin Li // CHECK-SAME:              variable: [3 x i8]** @_ZN6pr96081xE
12*67e74705SXin Li // CHECK: [[INCARRAYPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[INCARRAY:![0-9]+]]
13*67e74705SXin Li // CHECK: [[INCARRAY]] = !DICompositeType(tag: DW_TAG_array_type
14*67e74705SXin Li // CHECK-NOT:                             line:
15*67e74705SXin Li // CHECK-NOT:                             size:
16*67e74705SXin Li // CHECK-NOT:                             align:
17*67e74705SXin Li // CHECK-NOT:                             offset:
18*67e74705SXin Li // CHECK-SAME:                            baseType: ![[INCTYPE:[0-9]+]]
19*67e74705SXin Li 
20*67e74705SXin Li // CHECK: ![[INCTYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "incomplete"
21*67e74705SXin Li // CHECK-SAME:                                   DIFlagFwdDecl
22*67e74705SXin Li 
23*67e74705SXin Li template<typename T> struct Identity {
24*67e74705SXin Li   typedef T Type;
25*67e74705SXin Li };
26*67e74705SXin Li 
f(Identity<int>::Type a)27*67e74705SXin Li void f(Identity<int>::Type a) {}
f(Identity<int> a)28*67e74705SXin Li void f(Identity<int> a) {}
f(int & a)29*67e74705SXin Li void f(int& a) { }
30*67e74705SXin Li 
31*67e74705SXin Li template<typename T> struct A {
32*67e74705SXin Li   A<T> *next;
33*67e74705SXin Li };
f(A<int>)34*67e74705SXin Li void f(A<int>) { }
35*67e74705SXin Li 
36*67e74705SXin Li struct B { };
37*67e74705SXin Li 
f()38*67e74705SXin Li void f() {
39*67e74705SXin Li   int B::*a = 0;
40*67e74705SXin Li   void (B::*b)() = 0;
41*67e74705SXin Li }
42*67e74705SXin Li 
43*67e74705SXin Li namespace EmptyNameCrash {
44*67e74705SXin Li   struct A { A(); };
45*67e74705SXin Li   typedef struct { A x; } B;
46*67e74705SXin Li   B x;
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li // PR4890
50*67e74705SXin Li namespace PR4890 {
51*67e74705SXin Li   struct X {
52*67e74705SXin Li     ~X();
53*67e74705SXin Li   };
54*67e74705SXin Li 
~X()55*67e74705SXin Li   X::~X() { }
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li namespace VirtualDtor {
59*67e74705SXin Li   struct Y {
60*67e74705SXin Li     virtual ~Y();
61*67e74705SXin Li   };
62*67e74705SXin Li 
~Y()63*67e74705SXin Li   Y::~Y() { }
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace VirtualBase {
67*67e74705SXin Li   struct A { int a; };
68*67e74705SXin Li   struct B : virtual A { int b; };
69*67e74705SXin Li // BOTH: ![[VBASE_B:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: [[@LINE-1]],
70*67e74705SXin Li // MSVC-SAME:                                        size: 96, align: 32
71*67e74705SXin Li // CHECK-SAME:                                       size: 128, align: 64,
72*67e74705SXin Li // BOTH-NOT:                                         offset:
73*67e74705SXin Li // BOTH-NOT:                                         DIFlagFwdDecl
74*67e74705SXin Li // BOTH-SAME:                                        elements: [[VBASE_B_DEF:![0-9]+]]
75*67e74705SXin Li // BOTH: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
76*67e74705SXin Li //
77*67e74705SXin Li // Look for the vbtable offset of A, which should be 4 for MSVC, 24 otherwise.
78*67e74705SXin Li // BOTH: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[VBASE_B]],
79*67e74705SXin Li // BOTH-SAME:                              baseType: ![[VBASE_A:[0-9]+]],
80*67e74705SXin Li // MSVC-SAME:                              offset: 4,
81*67e74705SXin Li // CHECK-SAME:                             offset: 24,
82*67e74705SXin Li //
83*67e74705SXin Li // BOTH: ![[VBASE_A]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "A",
84*67e74705SXin Li 
f()85*67e74705SXin Li   void f() {
86*67e74705SXin Li     B b;
87*67e74705SXin Li   }
88*67e74705SXin Li }
89*67e74705SXin Li 
90*67e74705SXin Li namespace b5249287 {
91*67e74705SXin Li template <typename T> class A {
92*67e74705SXin Li   struct B;
93*67e74705SXin Li };
94*67e74705SXin Li 
95*67e74705SXin Li class Cls {
96*67e74705SXin Li   template <typename T> friend class A<T>::B;
97*67e74705SXin Li };
98*67e74705SXin Li 
99*67e74705SXin Li Cls obj;
100*67e74705SXin Li }
101*67e74705SXin Li 
102*67e74705SXin Li // CHECK: [[FUNC:[0-9]+]] = distinct !DISubprogram(name: "func", linkageName: "_ZN7pr147634funcENS_3fooE"
103*67e74705SXin Li // CHECK-SAME:                                      type: {{![0-9]+}}
104*67e74705SXin Li // CHECK-SAME:                                      isDefinition: true
105*67e74705SXin Li 
106*67e74705SXin Li // CHECK: [[PR14763:![0-9]+]] = !DINamespace(name: "pr14763"
107*67e74705SXin Li namespace pr14763 {
108*67e74705SXin Li struct foo {
109*67e74705SXin Li // CHECK: ![[FOO:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "foo"
110*67e74705SXin Li // CHECK-SAME:             scope: [[PR14763]]
111*67e74705SXin Li // CHECK-SAME:             identifier:
112*67e74705SXin Li   foo(const foo&);
113*67e74705SXin Li };
114*67e74705SXin Li 
115*67e74705SXin Li // For some reason function arguments ended up down here
116*67e74705SXin Li // CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: ![[FUNC]]
117*67e74705SXin Li // CHECK-SAME:                      type: ![[FOO]]
118*67e74705SXin Li // CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
func(foo f)119*67e74705SXin Li foo func(foo f) {
120*67e74705SXin Li   return f; // reference 'f' for now because otherwise we hit another bug
121*67e74705SXin Li }
122*67e74705SXin Li 
123*67e74705SXin Li }
124*67e74705SXin Li 
foo()125*67e74705SXin Li void foo() {
126*67e74705SXin Li // CHECK: !DILocalVariable(name: "c"
127*67e74705SXin Li // CHECK-NOT:              arg:
128*67e74705SXin Li // CHECK-SAME:            )
129*67e74705SXin Li   const wchar_t c = L'x';
130*67e74705SXin Li   wchar_t d = c;
131*67e74705SXin Li }
132*67e74705SXin Li 
133*67e74705SXin Li namespace pr9608 { // also pr9600
134*67e74705SXin Li struct incomplete;
135*67e74705SXin Li incomplete (*x)[3];
136*67e74705SXin Li }
137*67e74705SXin Li 
138*67e74705SXin Li namespace pr16214 {
139*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "a"
140*67e74705SXin Li // CHECK-SAME:             elements: [[A_MEM:![0-9]+]]
141*67e74705SXin Li // CHECK-SAME:             identifier: "_ZTSN7pr162141aE"
142*67e74705SXin Li // CHECK: [[A_MEM]] = !{[[A_I:![0-9]*]]}
143*67e74705SXin Li struct a {
144*67e74705SXin Li // CHECK: [[A_I]] = !DIDerivedType(tag: DW_TAG_member, name: "i"
145*67e74705SXin Li   int i;
146*67e74705SXin Li };
147*67e74705SXin Li 
148*67e74705SXin Li typedef a at;
149*67e74705SXin Li 
150*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "b"
151*67e74705SXin Li // CHECK-SAME:             DIFlagFwdDecl
152*67e74705SXin Li struct b {
153*67e74705SXin Li };
154*67e74705SXin Li 
155*67e74705SXin Li typedef b bt;
156*67e74705SXin Li 
func()157*67e74705SXin Li void func() {
158*67e74705SXin Li   at a_inst;
159*67e74705SXin Li   bt *b_ptr_inst;
160*67e74705SXin Li   const bt *b_cnst_ptr_inst;
161*67e74705SXin Li }
162*67e74705SXin Li 
163*67e74705SXin Li }
164