xref: /llvm-project/llvm/test/tools/llvm-dwarfutil/ELF/X86/odr-fwd-declaration.test (revision 4539b44148918c332ff966a2a955aca0ab93dde4)
1## This test checks debug info for the case when one compilation unit
2## contains a forward declaration of a type and another compilation unit
3## contains a definition for that type. The result should contain
4## the original definition and the declaration without modifications.
5
6# RUN: yaml2obj %s -o %t.o
7# RUN: llvm-dwarfutil %t.o - | llvm-dwarfdump -a - | FileCheck %s
8
9## CU1:
10##
11## class class1;
12## template<int> class class2;
13##
14## class1 *var1;
15## class2<int> *var2;
16##
17## CU2:
18##
19## class class1 {
20##   char member1;
21##   float member2;
22## };
23##
24## template<int> class class2 {
25##   char member1;
26## };
27##
28## class1 *var1;
29## class2<int> *var2;
30
31# CHECK: file format elf64-x86-64
32# CHECK: .debug_info contents:
33
34# CHECK: DW_TAG_compile_unit
35# CHECK: DW_AT_name{{.*}}"CU1"
36
37# CHECK: 0x[[CU1_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
38# CHECK: DW_AT_declaration (true)
39
40# CHECK: 0x[[CU1_CLASS2:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class2"
41# CHECK: DW_AT_declaration (true)
42# CHECK: DW_TAG_template_type_parameter{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_INT:[0-9a-f]*]] "int"
43
44# CHECK: 0x[[CU1_INT]]: DW_TAG_base_type
45# CHECK: DW_AT_name{{.*}}"int"
46
47# CHECK: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"
48
49# CHECK: 0x[[CU1_PTR_CLASS2:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS2]] "class2<int>"
50
51# CHECK: DW_TAG_variable
52# CHECK: DW_AT_name{{.*}}"var1"
53# CHECK: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS1]] "class1 *"
54# CHECK: DW_TAG_variable
55# CHECK: DW_AT_name{{.*}}"var2"
56# CHECK: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS2]] "class2<int> *"
57
58# CHECK: DW_TAG_compile_unit
59# CHECK: DW_AT_name{{.*}}"CU2"
60
61# CHECK: 0x[[CU2_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
62# CHECK: DW_TAG_member
63# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_CHAR:[0-9a-f]*]] "char"
64# CHECK: DW_AT_name{{.*}}"member1"
65
66# CHECK: DW_TAG_member
67# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_FLOAT:[0-9a-f]*]] "float"
68# CHECK: DW_AT_name{{.*}}"member2"
69
70# CHECK: 0x[[CU2_CLASS2:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class2"
71# CHECK: DW_TAG_template_type_parameter{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_INT:[0-9a-f]*]] "int"
72# CHECK: DW_TAG_member
73# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_CHAR]] "char"
74# CHECK: DW_AT_name{{.*}}"member1"
75
76# CHECK: 0x[[CU2_INT]]: DW_TAG_base_type
77# CHECK: DW_AT_name{{.*}}"int"
78
79# CHECK: 0x[[CU2_CHAR]]: DW_TAG_base_type
80# CHECK: DW_AT_name{{.*}}"char"
81
82# CHECK: 0x[[CU2_FLOAT]]: DW_TAG_base_type
83# CHECK: DW_AT_name{{.*}}"float"
84
85# CHECK: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_CLASS1]] "class1"
86
87# CHECK: 0x[[CU2_PTR_CLASS2:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_CLASS2]] "class2<int>"
88
89# CHECK: DW_TAG_variable
90# CHECK: DW_AT_name{{.*}}"var1"
91# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS1]] "class1 *"
92# CHECK: DW_TAG_variable
93# CHECK: DW_AT_name{{.*}}"var2"
94# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS2]] "class2<int> *"
95
96--- !ELF
97FileHeader:
98  Class:    ELFCLASS64
99  Data:     ELFDATA2LSB
100  Type:     ET_REL
101  Machine:  EM_X86_64
102Sections:
103  - Name:            .text
104    Type:            SHT_PROGBITS
105    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
106    Address:         0x1000
107    Size:            0x1b
108  - Name:            .text2
109    Type:            SHT_PROGBITS
110    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
111    Address:         0x2000
112    Size:            0x1b
113DWARF:
114  debug_abbrev:
115    - Table:
116      - Tag:      DW_TAG_compile_unit
117        Children: DW_CHILDREN_yes
118        Attributes:
119          - Attribute: DW_AT_producer
120            Form:      DW_FORM_string
121          - Attribute: DW_AT_language
122            Form:      DW_FORM_data2
123          - Attribute: DW_AT_name
124            Form:      DW_FORM_string
125          - Attribute: DW_AT_low_pc
126            Form:      DW_FORM_addr
127          - Attribute: DW_AT_high_pc
128            Form:      DW_FORM_data8
129      - Tag:      DW_TAG_class_type
130        Children: DW_CHILDREN_yes
131        Attributes:
132          - Attribute: DW_AT_name
133            Form:      DW_FORM_string
134      - Tag:      DW_TAG_member
135        Children: DW_CHILDREN_no
136        Attributes:
137          - Attribute: DW_AT_type
138            Form:      DW_FORM_ref_addr
139          - Attribute: DW_AT_name
140            Form:      DW_FORM_string
141      - Tag:      DW_TAG_class_type
142        Children: DW_CHILDREN_no
143        Attributes:
144          - Attribute: DW_AT_name
145            Form:      DW_FORM_string
146          - Attribute: DW_AT_declaration
147            Form:      DW_FORM_flag_present
148      - Tag:      DW_TAG_class_type
149        Children: DW_CHILDREN_yes
150        Attributes:
151          - Attribute: DW_AT_name
152            Form:      DW_FORM_string
153          - Attribute: DW_AT_declaration
154            Form:      DW_FORM_flag_present
155      - Tag:      DW_TAG_template_type_parameter
156        Children: DW_CHILDREN_no
157        Attributes:
158          - Attribute: DW_AT_type
159            Form:      DW_FORM_ref_addr
160      - Tag:      DW_TAG_base_type
161        Children: DW_CHILDREN_no
162        Attributes:
163          - Attribute: DW_AT_name
164            Form:      DW_FORM_string
165      - Tag:      DW_TAG_pointer_type
166        Children: DW_CHILDREN_no
167        Attributes:
168          - Attribute: DW_AT_type
169            Form:      DW_FORM_ref_addr
170      - Tag:      DW_TAG_variable
171        Children: DW_CHILDREN_no
172        Attributes:
173          - Attribute: DW_AT_name
174            Form:      DW_FORM_string
175          - Attribute: DW_AT_const_value
176            Form:      DW_FORM_data4
177          - Attribute: DW_AT_type
178            Form:      DW_FORM_ref_addr
179    - Table:
180      - Tag:      DW_TAG_compile_unit
181        Children: DW_CHILDREN_yes
182        Attributes:
183          - Attribute: DW_AT_producer
184            Form:      DW_FORM_string
185          - Attribute: DW_AT_language
186            Form:      DW_FORM_data2
187          - Attribute: DW_AT_name
188            Form:      DW_FORM_string
189          - Attribute: DW_AT_low_pc
190            Form:      DW_FORM_addr
191          - Attribute: DW_AT_high_pc
192            Form:      DW_FORM_data8
193      - Tag:      DW_TAG_class_type
194        Children: DW_CHILDREN_yes
195        Attributes:
196          - Attribute: DW_AT_name
197            Form:      DW_FORM_string
198      - Tag:      DW_TAG_member
199        Children: DW_CHILDREN_no
200        Attributes:
201          - Attribute: DW_AT_type
202            Form:      DW_FORM_ref_addr
203          - Attribute: DW_AT_name
204            Form:      DW_FORM_string
205      - Tag:      DW_TAG_class_type
206        Children: DW_CHILDREN_no
207        Attributes:
208          - Attribute: DW_AT_name
209            Form:      DW_FORM_string
210          - Attribute: DW_AT_declaration
211            Form:      DW_FORM_flag_present
212      - Tag:      DW_TAG_class_type
213        Children: DW_CHILDREN_yes
214        Attributes:
215          - Attribute: DW_AT_name
216            Form:      DW_FORM_string
217          - Attribute: DW_AT_declaration
218            Form:      DW_FORM_flag_present
219      - Tag:      DW_TAG_template_type_parameter
220        Children: DW_CHILDREN_no
221        Attributes:
222          - Attribute: DW_AT_type
223            Form:      DW_FORM_ref_addr
224      - Tag:      DW_TAG_base_type
225        Children: DW_CHILDREN_no
226        Attributes:
227          - Attribute: DW_AT_name
228            Form:      DW_FORM_string
229      - Tag:      DW_TAG_pointer_type
230        Children: DW_CHILDREN_no
231        Attributes:
232          - Attribute: DW_AT_type
233            Form:      DW_FORM_ref_addr
234      - Tag:      DW_TAG_variable
235        Children: DW_CHILDREN_no
236        Attributes:
237          - Attribute: DW_AT_name
238            Form:      DW_FORM_string
239          - Attribute: DW_AT_const_value
240            Form:      DW_FORM_data4
241          - Attribute: DW_AT_type
242            Form:      DW_FORM_ref_addr
243  debug_info:
244    - Version: 4
245      Entries:
246        - AbbrCode: 1
247          Values:
248            - CStr: by_hand
249            - Value:  0x04
250            - CStr: CU1
251            - Value:  0x1000
252            - Value:  0x1b
253        - AbbrCode: 4
254          Values:
255            - CStr: class1
256        - AbbrCode: 5
257          Values:
258            - CStr: class2
259        - AbbrCode: 6
260          Values:
261            - Value:  0x00000040
262        - AbbrCode: 0
263        - AbbrCode: 7
264          Values:
265            - CStr: int
266        - AbbrCode: 8
267          Values:
268            - Value:  0x0000002a
269        - AbbrCode: 8
270          Values:
271            - Value:  0x00000032
272        - AbbrCode: 9
273          Values:
274            - CStr: var1
275            - Value:  0x00000000
276            - Value:  0x00000045
277        - AbbrCode: 9
278          Values:
279            - CStr: var2
280            - Value:  0x00000000
281            - Value:  0x0000004a
282        - AbbrCode: 0
283    - Version: 4
284      Entries:
285        - AbbrCode: 1
286          Values:
287            - CStr: by_hand
288            - Value:  0x04
289            - CStr: CU2
290            - Value:  0x2000
291            - Value:  0x1b
292        - AbbrCode: 2
293          Values:
294            - CStr: class1
295        - AbbrCode: 3
296          Values:
297            - Value:  0x000000d9
298            - CStr: member1
299        - AbbrCode: 3
300          Values:
301            - Value:  0x000000df
302            - CStr: member2
303        - AbbrCode: 0
304        - AbbrCode: 2
305          Values:
306            - CStr: class2
307        - AbbrCode: 6
308          Values:
309            - Value:  0x000000d4
310        - AbbrCode: 3
311          Values:
312            - Value:  0x000000d9
313            - CStr: member1
314        - AbbrCode: 0
315        - AbbrCode: 7
316          Values:
317            - CStr: int
318        - AbbrCode: 7
319          Values:
320            - CStr: char
321        - AbbrCode: 7
322          Values:
323            - CStr: float
324        - AbbrCode: 8
325          Values:
326            - Value:  0x00000096
327        - AbbrCode: 8
328          Values:
329            - Value:  0x000000b9
330        - AbbrCode: 9
331          Values:
332            - CStr: var1
333            - Value:  0x00000000
334            - Value:  0x000000e6
335        - AbbrCode: 9
336          Values:
337            - CStr: var2
338            - Value:  0x00000000
339            - Value:  0x000000eb
340        - AbbrCode: 0
341...
342