debug-info-class.cpp revision 1fe3263a0df6ba164ea3922590a9e585e6737b82
1struct foo;
2void func(foo *f) {
3}
4class bar;
5void func(bar *f) {
6}
7union baz;
8void func(baz *f) {
9}
10
11class B {
12public:
13  virtual ~B();
14};
15
16B::~B() {
17}
18
19struct C {
20  static int s;
21  virtual ~C();
22};
23
24C::~C() {
25}
26
27struct D {
28  D();
29  virtual ~D();
30  void func() {
31  }
32};
33
34struct E {
35  E();
36  virtual ~E();
37  virtual void func() {
38  }
39};
40
41struct F {
42  struct inner {
43  };
44  static const int i = 2;
45  virtual ~F();
46};
47
48struct G {
49  virtual void func();
50  struct inner {
51    int j;
52  };
53};
54
55struct H {};
56struct I : virtual H {};
57struct J : I {};
58J j;
59
60struct A {
61  int one;
62  static const int HdrSize = 52;
63  int two;
64  A() {
65    int x = 1;
66  }
67};
68
69void f1() {
70  D x;
71  x.func();
72  E y;
73  int i = F::i;
74  F::inner z;
75}
76
77int main(int argc, char **argv) {
78  B b;
79  G::inner c_i;
80  if (argc) {
81    A a;
82  }
83  return 0;
84}
85
86// RUN: %clang -target x86_64-unknown_unknown -emit-llvm -g -S %s -o - | FileCheck %s
87// RUN: %clang -target i686-cygwin -emit-llvm -g -S %s -o - | FileCheck %s
88// RUN: %clang -target armv7l-unknown-linux-gnueabihf -emit-llvm -g -S %s -o - | FileCheck %s
89
90// CHECK: invoke {{.+}} @_ZN1BD1Ev(%class.B* %b)
91// CHECK-NEXT: unwind label %{{.+}}, !dbg ![[EXCEPTLOC:.*]]
92// CHECK: store i32 0, i32* %{{.+}}, !dbg ![[RETLOC:.*]]
93// CHECK: DW_TAG_structure_type ] [foo]
94// CHECK: DW_TAG_class_type ] [bar]
95// CHECK: DW_TAG_union_type ] [baz]
96// CHECK: DW_TAG_class_type ] [B] {{.*}} [def]
97// CHECK: metadata !"_vptr$B", {{.*}}, i32 64, metadata !{{.*}}} ; [ DW_TAG_member ]
98
99// CHECK: [[C:![0-9]*]] = {{.*}} metadata [[C_MEM:![0-9]*]], i32 0, metadata !"_ZTS1C", null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] {{.*}} [def]
100// CHECK: [[C_MEM]] = metadata !{metadata [[C_VPTR:![0-9]*]], metadata [[C_S:![0-9]*]], metadata [[C_DTOR:![0-9]*]]}
101// CHECK: [[C_VPTR]] = {{.*}} ; [ DW_TAG_member ] [_vptr$C] {{.*}} [artificial]
102// CHECK: [[C_S]] = {{.*}} ; [ DW_TAG_member ] [s] {{.*}} [static] [from int]
103// CHECK: [[C_DTOR]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [~C]
104
105// CHECK: metadata [[D_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTS1D"} ; [ DW_TAG_structure_type ] [D] {{.*}} [decl]
106// CHECK: [[D_MEM]] = metadata !{metadata [[D_FUNC:![0-9]*]]}
107// CHECK: [[D_FUNC]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [func]
108// CHECK: null, i32 0, null, null, metadata !"_ZTS1E"} ; [ DW_TAG_structure_type ] [E] {{.*}} [decl]
109// CHECK: [[F:![0-9]*]] = {{.*}} metadata [[F_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTS1F"} ; [ DW_TAG_structure_type ] [F] {{.*}} [decl]
110// CHECK: [[F_MEM]] = metadata !{metadata [[F_I:![0-9]*]]}
111// CHECK: [[F_I]] = {{.*}} ; [ DW_TAG_member ] [i]
112
113// CHECK: null, i32 0, null, null, metadata !"_ZTS1G"} ; [ DW_TAG_structure_type ] [G] {{.*}} [decl]
114// CHECK: metadata [[G_INNER_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTSN1G5innerE"} ; [ DW_TAG_structure_type ] [inner] [line 50, {{.*}} [def]
115// CHECK: [[G_INNER_MEM]] = metadata !{metadata [[G_INNER_I:![0-9]*]]}
116// CHECK: [[G_INNER_I]] = {{.*}} ; [ DW_TAG_member ] [j] {{.*}} [from int]
117
118// CHECK: ; [ DW_TAG_structure_type ] [A]
119// CHECK: HdrSize
120// CHECK: ; [ DW_TAG_structure_type ] [I] {{.*}} [def]
121
122// CHECK: [[F_I_DEF:![0-9]*]] = {{.*}}, metadata [[F_I]]} ; [ DW_TAG_variable ] [i]
123
124// CHECK: ![[EXCEPTLOC]] = metadata !{i32 84,
125// CHECK: ![[RETLOC]] = metadata !{i32 83,
126