xref: /llvm-project/llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp (revision 8bd441af8b84165ca904772b1e73eaaed4fbe71a)
1d9063658SJonas Devlieghere /* Compile with:
2d9063658SJonas Devlieghere    for FILE in `seq 3`; do
3d9063658SJonas Devlieghere      clang -g -c  X86/odr-fwd-declaration.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration/$FILE.o
4d9063658SJonas Devlieghere    done
5d9063658SJonas Devlieghere  */
6d9063658SJonas Devlieghere 
7a6ef1abcSJonas Devlieghere // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration -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 typedef struct S *Sptr;
12d9063658SJonas Devlieghere typedef Sptr *Sptrptr;
13d9063658SJonas Devlieghere # 3 "Source1.cpp" 2
foo()14d9063658SJonas Devlieghere void foo() {
15d9063658SJonas Devlieghere   Sptrptr ptr1 = 0;
16d9063658SJonas Devlieghere }
17d9063658SJonas Devlieghere 
18d9063658SJonas Devlieghere // First we confirm that the typedefs reference the forward declaration of the
19d9063658SJonas Devlieghere // struct S.
20d9063658SJonas Devlieghere //
21d9063658SJonas Devlieghere // CHECK: TAG_variable
22d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
23d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr1"
24d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
25d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF1:[a-f0-9]*]]
26d9063658SJonas Devlieghere //
27d9063658SJonas Devlieghere // CHECK: [[TYPEDEF1]]:{{.*}}TAG_typedef
28d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
29d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]]
30d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
31d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptrptr"
32d9063658SJonas Devlieghere //
33d9063658SJonas Devlieghere // CHECK: [[PTR1]]:{{.*}}TAG_pointer_type
34d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
35d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF2:[a-f0-9]*]]
36d9063658SJonas Devlieghere //
37d9063658SJonas Devlieghere // CHECK: [[TYPEDEF2]]:{{.*}}TAG_typedef
38d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
39d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]]
40d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
41d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptr"
42d9063658SJonas Devlieghere //
43d9063658SJonas Devlieghere // CHECK: [[PTR2]]:{{.*}}TAG_pointer_type
44d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
45d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[FWDSTRUCT:[a-f0-9]*]]
46d9063658SJonas Devlieghere //
47d9063658SJonas Devlieghere // CHECK: [[FWDSTRUCT]]:{{.*}}TAG_structure_type
48d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
49d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "S"
50d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
51d9063658SJonas Devlieghere // CHECK: AT_declaration
52*8bd441afSArtem Dergachev // CHECK-NOT: AT_byte_size
53d9063658SJonas Devlieghere 
54d9063658SJonas Devlieghere #elif defined(FILE2)
55d9063658SJonas Devlieghere # 1 "Header.h" 1
56d9063658SJonas Devlieghere typedef struct S *Sptr;
57d9063658SJonas Devlieghere typedef Sptr *Sptrptr;
58d9063658SJonas Devlieghere # 3 "Source2.cpp" 2
59d9063658SJonas Devlieghere struct S {
60d9063658SJonas Devlieghere   int field;
61d9063658SJonas Devlieghere };
bar()62d9063658SJonas Devlieghere void bar() {
63d9063658SJonas Devlieghere   Sptrptr ptr2 = 0;
64d9063658SJonas Devlieghere }
65d9063658SJonas Devlieghere 
66d9063658SJonas Devlieghere // Next we confirm that the typedefs reference the definition rather than the
67d9063658SJonas Devlieghere // previous declaration of S.
68d9063658SJonas Devlieghere //
69d9063658SJonas Devlieghere // CHECK: TAG_variable
70d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
71d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr2"
72d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
73d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3:[a-f0-9]*]]
74d9063658SJonas Devlieghere //
75d9063658SJonas Devlieghere // CHECK: [[TYPEDEF3]]:{{.*}}TAG_typedef
76d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
77d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]]
78d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
79d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptrptr"
80d9063658SJonas Devlieghere //
81d9063658SJonas Devlieghere // CHECK: [[PTR3]]:{{.*}}TAG_pointer_type
82d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
83d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF4:[a-f0-9]*]]
84d9063658SJonas Devlieghere //
85d9063658SJonas Devlieghere // CHECK: [[TYPEDEF4]]:{{.*}}TAG_typedef
86d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
87d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR4:[a-f0-9]*]]
88d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
89d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptr"
90d9063658SJonas Devlieghere //
91d9063658SJonas Devlieghere // CHECK: [[PTR4]]:{{.*}}TAG_pointer_type
92d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
93d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT:[a-f0-9]*]]
94d9063658SJonas Devlieghere //
95d9063658SJonas Devlieghere // CHECK: [[STRUCT]]:{{.*}}TAG_structure_type
96d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
97d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "S"
98d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
99d9063658SJonas Devlieghere // CHECK-NOT: AT_declaration
100d9063658SJonas Devlieghere // CHECK: AT_byte_size
101d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
102d9063658SJonas Devlieghere // CHECK: TAG_member
103d9063658SJonas Devlieghere 
104d9063658SJonas Devlieghere #elif defined(FILE3)
105d9063658SJonas Devlieghere # 1 "Header.h" 1
106d9063658SJonas Devlieghere typedef struct S *Sptr;
107d9063658SJonas Devlieghere typedef Sptr *Sptrptr;
108d9063658SJonas Devlieghere # 3 "Source1.cpp" 2
foo()109d9063658SJonas Devlieghere void foo() {
110d9063658SJonas Devlieghere   Sptrptr ptr1 = 0;
111d9063658SJonas Devlieghere }
112d9063658SJonas Devlieghere 
113d9063658SJonas Devlieghere // Finally we confirm that uniquing is not broken and the same typedef is
114d9063658SJonas Devlieghere // referenced by ptr1.
115d9063658SJonas Devlieghere //
116d9063658SJonas Devlieghere // CHECK: TAG_variable
117d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
118d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr1"
119d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}}
120d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3]]
121d9063658SJonas Devlieghere // CHECK-NOT: TAG_typedef
122d9063658SJonas Devlieghere // CHECK-NOT: TAG_pointer
123d9063658SJonas Devlieghere // CHECK-NOT: TAG_structure_type
124d9063658SJonas Devlieghere 
125d9063658SJonas Devlieghere #else
126d9063658SJonas Devlieghere #error "You must define which file you generate"
127d9063658SJonas Devlieghere #endif
128