xref: /llvm-project/llvm/test/tools/dsymutil/X86/odr-fwd-declaration2.cpp (revision a6ef1abc0970ff3ae49a643cf3575226e3c5e762)
1d9063658SJonas Devlieghere /* Compile with:
2d9063658SJonas Devlieghere    for FILE in `seq 3`; do
3d9063658SJonas Devlieghere      clang -g -c  X86/odr-fwd-declaration2.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration2/$FILE.o
4d9063658SJonas Devlieghere    done
5d9063658SJonas Devlieghere  */
6d9063658SJonas Devlieghere 
7*a6ef1abcSJonas Devlieghere // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration2 -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -v -debug-info - | FileCheck %s
8d9063658SJonas Devlieghere 
9d9063658SJonas Devlieghere #ifdef FILE1
10d9063658SJonas Devlieghere # 1 "Header.h" 1
11d9063658SJonas Devlieghere struct A {
12d9063658SJonas Devlieghere   struct B;
13d9063658SJonas Devlieghere   B *bPtr;
14d9063658SJonas Devlieghere   B &bRef;
15d9063658SJonas Devlieghere   int B::*bPtrToField;
16d9063658SJonas Devlieghere };
17d9063658SJonas Devlieghere # 3 "Source1.cpp" 2
foo()18d9063658SJonas Devlieghere void foo() {
19d9063658SJonas Devlieghere   A *ptr1 = 0;
20d9063658SJonas Devlieghere }
21d9063658SJonas Devlieghere 
22d9063658SJonas Devlieghere // First we confirm that bPtr, bRef and bPtrToField reference the forward
23d9063658SJonas Devlieghere // declaration of the struct B.
24d9063658SJonas Devlieghere //
25d9063658SJonas Devlieghere // CHECK: DW_TAG_member
26d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
27d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtr"
28d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
29d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]]
30d9063658SJonas Devlieghere //
31d9063658SJonas Devlieghere // CHECK: [[STRUCT1:[a-f0-9]*]]:{{.*}}TAG_structure_type
32d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
33d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "B"
34d9063658SJonas Devlieghere // CHECK-NOT: AT_byte_size
35d9063658SJonas Devlieghere // CHECK: DW_AT_declaration
36d9063658SJonas Devlieghere //
37d9063658SJonas Devlieghere // CHECK: DW_TAG_member
38d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bRef"
39d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
40d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[REF1:[a-f0-9]*]]
41d9063658SJonas Devlieghere //
42d9063658SJonas Devlieghere // CHECK: TAG_member
43d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
44d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtrToField"
45d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
46d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER1:[a-f0-9]*]]
47d9063658SJonas Devlieghere //
48d9063658SJonas Devlieghere // CHECK: [[PTR1]]:{{.*}}TAG_pointer_type
49d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
50d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]]
51d9063658SJonas Devlieghere //
52d9063658SJonas Devlieghere // CHECK: [[REF1]]:{{.*}}TAG_reference_type
53d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
54d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]]
55d9063658SJonas Devlieghere //
56d9063658SJonas Devlieghere // CHECK: [[PTRTOMEMBER1]]:{{.*}}TAG_ptr_to_member_type
57d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
58d9063658SJonas Devlieghere // CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT1]]
59d9063658SJonas Devlieghere 
60d9063658SJonas Devlieghere #elif defined(FILE2)
61d9063658SJonas Devlieghere # 1 "Header.h" 1
62d9063658SJonas Devlieghere struct A {
63d9063658SJonas Devlieghere   struct B;
64d9063658SJonas Devlieghere   B *bPtr;
65d9063658SJonas Devlieghere   B &bRef;
66d9063658SJonas Devlieghere   int B::*bPtrToField;
67d9063658SJonas Devlieghere };
68d9063658SJonas Devlieghere # 3 "Source2.cpp" 2
69d9063658SJonas Devlieghere struct A::B {
70d9063658SJonas Devlieghere   int x;
71d9063658SJonas Devlieghere };
bar()72d9063658SJonas Devlieghere void bar() {
73d9063658SJonas Devlieghere   A *ptr2 = 0;
74d9063658SJonas Devlieghere }
75d9063658SJonas Devlieghere 
76d9063658SJonas Devlieghere // Next we confirm that bPtr, bRef and bPtrToField reference the definition of
77d9063658SJonas Devlieghere // B, rather than its declaration.
78d9063658SJonas Devlieghere //
79d9063658SJonas Devlieghere // CHECK: [[STRUCTA:[a-f0-9]*]]:{{.*}}TAG_structure_type
80d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
81d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "A"
82d9063658SJonas Devlieghere // CHECK-NOT: AT_byte_size
83d9063658SJonas Devlieghere // CHECK: DW_AT_byte_size
84d9063658SJonas Devlieghere //
85d9063658SJonas Devlieghere // CHECK: DW_TAG_member
86d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
87d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtr"
88d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
89d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]]
90d9063658SJonas Devlieghere //
91d9063658SJonas Devlieghere // CHECK: [[STRUCT2:[a-f0-9]*]]:{{.*}}TAG_structure_type
92d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
93d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "B"
94d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
95d9063658SJonas Devlieghere // CHECK: DW_AT_byte_size
96d9063658SJonas Devlieghere //
97d9063658SJonas Devlieghere // CHECK: DW_TAG_member
98d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bRef"
99d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
100d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[REF2:[a-f0-9]*]]
101d9063658SJonas Devlieghere //
102d9063658SJonas Devlieghere // CHECK: TAG_member
103d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
104d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtrToField"
105d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
106d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER2:[a-f0-9]*]]
107d9063658SJonas Devlieghere //
108d9063658SJonas Devlieghere // CHECK: [[PTR2]]:{{.*}}TAG_pointer_type
109d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
110d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]]
111d9063658SJonas Devlieghere //
112d9063658SJonas Devlieghere // CHECK: [[REF2]]:{{.*}}TAG_reference_type
113d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
114d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]]
115d9063658SJonas Devlieghere //
116d9063658SJonas Devlieghere // CHECK: [[PTRTOMEMBER2]]:{{.*}}TAG_ptr_to_member_type
117d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
118d9063658SJonas Devlieghere // CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT2:[a-f0-9]*]]
119d9063658SJonas Devlieghere 
120d9063658SJonas Devlieghere #elif defined(FILE3)
121d9063658SJonas Devlieghere # 1 "Header.h" 1
122d9063658SJonas Devlieghere struct A {
123d9063658SJonas Devlieghere   struct B;
124d9063658SJonas Devlieghere   B *bPtr;
125d9063658SJonas Devlieghere   B &bRef;
126d9063658SJonas Devlieghere   int B::*bPtrToField;
127d9063658SJonas Devlieghere };
128d9063658SJonas Devlieghere # 3 "Source2.cpp" 2
129d9063658SJonas Devlieghere struct A::B {
130d9063658SJonas Devlieghere   int x;
131d9063658SJonas Devlieghere };
bar()132d9063658SJonas Devlieghere void bar() {
133d9063658SJonas Devlieghere   A *ptr2 = 0;
134d9063658SJonas Devlieghere }
135d9063658SJonas Devlieghere 
136d9063658SJonas Devlieghere // Finally we confirm that uniquing isn't broken by checking that further
137d9063658SJonas Devlieghere // references to 'struct A' point to its now complete definition.
138d9063658SJonas Devlieghere //
139d9063658SJonas Devlieghere // CHECK: TAG_variable
140d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
141d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr2"
142d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
143d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]]
144d9063658SJonas Devlieghere //
145d9063658SJonas Devlieghere // CHECK: [[PTR3]]:{{.*}}TAG_pointer_type
146d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
147d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCTA]]
148d9063658SJonas Devlieghere 
149d9063658SJonas Devlieghere #else
150d9063658SJonas Devlieghere #error "You must define which file you generate"
151d9063658SJonas Devlieghere #endif
152