xref: /llvm-project/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-member-functions.cpp (revision f1fdfe6888f93b9f6dfb4689e1f3206de584ff5b)
1b61ac4a8Savl-llvm /* Compile with:
2b61ac4a8Savl-llvm    for FILE in `seq 3`; do
3b61ac4a8Savl-llvm      clang -g -c  odr-member-functions.cpp -DFILE$FILE -o
4b61ac4a8Savl-llvm    odr-member-functions/$FILE.o done
5b61ac4a8Savl-llvm  */
6b61ac4a8Savl-llvm 
7*f1fdfe68SAlexey Lapshin // RUN: dsymutil --linker=parallel -f \
8b61ac4a8Savl-llvm // RUN: -oso-prepend-path=%p/../../Inputs/odr-member-functions \
9b61ac4a8Savl-llvm // RUN: -y %p/../dummy-debug-map.map -o %t1.out
10b61ac4a8Savl-llvm // RUN: llvm-dwarfdump -debug-info %t1.out | FileCheck %s
11b61ac4a8Savl-llvm 
12b61ac4a8Savl-llvm struct S {
fooS13b61ac4a8Savl-llvm   __attribute__((always_inline)) void foo() { bar(); }
fooS14b61ac4a8Savl-llvm   __attribute__((always_inline)) void foo(int i) {
15b61ac4a8Savl-llvm     if (i)
16b61ac4a8Savl-llvm       bar();
17b61ac4a8Savl-llvm   }
18b61ac4a8Savl-llvm   void bar();
19b61ac4a8Savl-llvm 
bazS20b61ac4a8Savl-llvm   template <typename T> void baz(T t) {}
21b61ac4a8Savl-llvm };
22b61ac4a8Savl-llvm 
23b61ac4a8Savl-llvm #ifdef FILE1
foo()24b61ac4a8Savl-llvm void foo() { S s; }
25b61ac4a8Savl-llvm 
26b61ac4a8Savl-llvm // First chack that types are moved into the type table unit.
27b61ac4a8Savl-llvm 
28b61ac4a8Savl-llvm // CHECK: TAG_compile_unit
29b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"__artificial_type_unit"
30b61ac4a8Savl-llvm 
31b61ac4a8Savl-llvm // CHECK: 0x[[INT_BASE:[0-9a-f]*]]: DW_TAG_base_type
32b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"int"
33b61ac4a8Savl-llvm 
34b61ac4a8Savl-llvm // CHECK: 0x[[PTR_S:[0-9a-f]*]]:{{.*}}DW_TAG_pointer_type
35b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[STRUCT_S:[0-9a-f]*]] "S")
36b61ac4a8Savl-llvm 
37b61ac4a8Savl-llvm // CHECK: 0x[[STRUCT_S]]:{{.*}}DW_TAG_structure_type
38b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"S"
39b61ac4a8Savl-llvm 
40b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
41b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3barEv"
42b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"bar"
43b61ac4a8Savl-llvm 
44b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
45b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
46b61ac4a8Savl-llvm 
47b61ac4a8Savl-llvm // CHECK: 0x[[BAZ_SUBPROGRAM:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
48b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3bazIiEEvT_"
49b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"baz<int>"
50b61ac4a8Savl-llvm 
51b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
52b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
53b61ac4a8Savl-llvm 
54b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
55b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
56b61ac4a8Savl-llvm 
57b61ac4a8Savl-llvm // CHECK: DW_TAG_template_type_parameter
58b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
59b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"T"
60b61ac4a8Savl-llvm 
61b61ac4a8Savl-llvm // CHECK: 0x[[FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
62b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEi"
63b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo"
64b61ac4a8Savl-llvm 
65b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
66b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
67b61ac4a8Savl-llvm 
68b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
69b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
70b61ac4a8Savl-llvm 
71b61ac4a8Savl-llvm // CHECK: 0x[[FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
72b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv"
73b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo"
74b61ac4a8Savl-llvm 
75b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
76b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
77b61ac4a8Savl-llvm 
78b61ac4a8Savl-llvm // For the second unit check that it references structure "S"
79b61ac4a8Savl-llvm 
80b61ac4a8Savl-llvm // CHECK: TAG_compile_unit
81b61ac4a8Savl-llvm // CHECK-NOT: {{DW_TAG|NULL}}
82b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
83b61ac4a8Savl-llvm 
84b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
85b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
86b61ac4a8Savl-llvm // CHECK-NEXT: AT_name{{.*}}"foo"
87b61ac4a8Savl-llvm 
88b61ac4a8Savl-llvm // CHECK: DW_TAG_variable
89b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s"
90b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
91b61ac4a8Savl-llvm 
92b61ac4a8Savl-llvm #elif defined(FILE2)
foo()93b61ac4a8Savl-llvm void foo() {
94b61ac4a8Savl-llvm   S s;
95b61ac4a8Savl-llvm   // Check that the overloaded member functions are resolved correctly
96b61ac4a8Savl-llvm   s.foo();
97b61ac4a8Savl-llvm   s.foo(1);
98b61ac4a8Savl-llvm }
99b61ac4a8Savl-llvm 
100b61ac4a8Savl-llvm // For the third unit check that it references member functions of structure S.
101b61ac4a8Savl-llvm // CHECK: TAG_compile_unit
102b61ac4a8Savl-llvm // CHECK-NOT: DW_TAG
103b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
104b61ac4a8Savl-llvm 
105b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
106b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ev]] "_ZN1S3fooEv"
107b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_inline    (DW_INL_inlined)
108b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ev_PARAM1:[0-9a-f]*]]
109b61ac4a8Savl-llvm 
110b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ev_PARAM1]]:{{.*}}DW_TAG_formal_parameter
111b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"this"
112b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
113b61ac4a8Savl-llvm 
114b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
115b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ei]] "_ZN1S3fooEi"
116b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_inline    (DW_INL_inlined)
117b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ei_PARAM1:[0-9a-f]*]]
118b61ac4a8Savl-llvm 
119b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei_PARAM1]]:{{.*}}DW_TAG_formal_parameter
120b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"this"
121b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
122b61ac4a8Savl-llvm 
123b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei_PARAM2:[0-9a-f]*]]:{{.*}}DW_TAG_formal_parameter
124b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"i"
125b61ac4a8Savl-llvm // CHECK: DW_AT_type    (0x00000000[[INT_BASE]] "int"
126b61ac4a8Savl-llvm 
127b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
128b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
129b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo"
130b61ac4a8Savl-llvm 
131b61ac4a8Savl-llvm // CHECK: DW_TAG_variable
132b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s"
133b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
134b61ac4a8Savl-llvm 
135b61ac4a8Savl-llvm // CHECK: DW_TAG_inlined_subroutine
136b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev]] "_ZN1S3fooEv"
137b61ac4a8Savl-llvm // CHECK: DW_AT_low_pc
138b61ac4a8Savl-llvm // CHECK: DW_AT_high_pc
139b61ac4a8Savl-llvm 
140b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
141b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev_PARAM1]] "this"
142b61ac4a8Savl-llvm 
143b61ac4a8Savl-llvm // CHECK: DW_TAG_inlined_subroutine
144b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei]] "_ZN1S3fooEi"
145b61ac4a8Savl-llvm // CHECK: DW_AT_low_pc
146b61ac4a8Savl-llvm // CHECK: DW_AT_high_pc
147b61ac4a8Savl-llvm 
148b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
149b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM1]] "this"
150b61ac4a8Savl-llvm 
151b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
152b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM2]] "i"
153b61ac4a8Savl-llvm 
154b61ac4a8Savl-llvm #elif defined(FILE3)
foo()155b61ac4a8Savl-llvm void foo() {
156b61ac4a8Savl-llvm   S s;
157b61ac4a8Savl-llvm   s.baz<int>(42);
158b61ac4a8Savl-llvm }
159b61ac4a8Savl-llvm 
160b61ac4a8Savl-llvm // For the fourth unit check that it references member functions of structure S.
161b61ac4a8Savl-llvm 
162b61ac4a8Savl-llvm // CHECK: TAG_compile_unit
163b61ac4a8Savl-llvm // CHECK-NOT: DW_TAG
164b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
165b61ac4a8Savl-llvm 
166b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
167b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
168b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo"
169b61ac4a8Savl-llvm 
170b61ac4a8Savl-llvm // CHECK: DW_TAG_variable
171b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s"
172b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
173b61ac4a8Savl-llvm 
174b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
175b61ac4a8Savl-llvm // CHECK: DW_AT_object_pointer{{.*}}(0x[[INST_PARAM2:[0-9a-f]*]]
176b61ac4a8Savl-llvm // CHECK: DW_AT_specification{{.*}}(0x00000000[[BAZ_SUBPROGRAM]] "_ZN1S3bazIiEEvT_"
177b61ac4a8Savl-llvm 
178b61ac4a8Savl-llvm // CHECK: 0x[[INST_PARAM2]]:{{.*}}DW_TAG_formal_parameter
179b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"this"
180b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
181b61ac4a8Savl-llvm 
182b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter
183b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"t"
184b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int"
185b61ac4a8Savl-llvm 
186b61ac4a8Savl-llvm // CHECK: DW_TAG_template_type_parameter
187b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int"
188b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"T"
189b61ac4a8Savl-llvm 
190b61ac4a8Savl-llvm #else
191b61ac4a8Savl-llvm #error "You must define which file you generate"
192b61ac4a8Savl-llvm #endif
193