• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
2# RUN: llvm-dwarfdump -v %t.o 2> %t.err | FileCheck --check-prefix=COMMON --check-prefix=SPLIT %s
3# RUN: llvm-dwarfdump -verify %t.o | FileCheck --check-prefix=VERIFY %s
4#
5# Check that we don't report an error on a non-existent range list table.
6# RUN: FileCheck -allow-empty --check-prefix ERR %s < %t.err
7
8# Test object to verify dwarfdump handles v5 string offset tables.
9# We have 2 v5 CUs, a v5 TU, and a split v5 CU and TU.
10#
11
12        .section .debug_str,"MS",@progbits,1
13str_producer:
14        .asciz "Handmade DWARF producer"
15str_CU1:
16        .asciz "Compile_Unit_1"
17str_CU1_dir:
18        .asciz "/home/test/CU1"
19str_CU2:
20        .asciz "Compile_Unit_2"
21str_CU2_dir:
22        .asciz "/home/test/CU2"
23str_TU:
24        .asciz "Type_Unit"
25str_TU_type:
26        .asciz "MyStruct"
27str_Subprogram:
28        .asciz "MyFunc"
29str_Variable1:
30        .asciz "MyVar1"
31str_Variable2:
32        .asciz "MyVar2"
33str_Variable3:
34        .asciz "MyVar3"
35
36# Every unit contributes to the string_offsets table.
37        .section .debug_str_offsets,"",@progbits
38# CU1's contribution
39        .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0+4
40        .short 5    # DWARF version
41        .short 0    # Padding
42.debug_str_offsets_base0:
43        .long str_producer
44        .long str_CU1
45        .long str_CU1_dir
46        .long str_Subprogram
47        .long str_Variable1
48        .long str_Variable2
49        .long str_Variable3
50.debug_str_offsets_segment0_end:
51# A 4-byte gap.
52        .long 0
53# CU2's contribution in DWARF64 format
54        .long 0xffffffff
55        .quad .debug_str_offsets_segment1_end-.debug_str_offsets_base1+4
56        .short 5    # DWARF version
57        .short 0    # Padding
58.debug_str_offsets_base1:
59        .quad str_producer
60        .quad str_CU2
61        .quad str_CU2_dir
62.debug_str_offsets_segment1_end:
63# The TU's contribution
64        .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2+4
65        .short 5    # DWARF version
66        .short 0    # Padding
67.debug_str_offsets_base2:
68        .long str_TU
69        .long str_TU_type
70.debug_str_offsets_segment2_end:
71
72        .section .debug_str.dwo,"MSe",@progbits,1
73dwo_str_CU_5_producer:
74        .asciz "Handmade split DWARF producer"
75dwo_str_CU_5_name:
76        .asciz "V5_split_compile_unit"
77dwo_str_CU_5_comp_dir:
78        .asciz "/home/test/splitCU"
79dwo_str_TU_5:
80        .asciz "V5_split_type_unit"
81dwo_str_TU_5_type:
82        .asciz "V5_split_Mystruct"
83
84        .section .debug_str_offsets.dwo,"e",@progbits
85# One contribution only in a .dwo file
86        .long .debug_dwo_str_offsets_segment0_end-.debug_dwo_str_offsets_base0+4
87        .short 5    # DWARF version
88        .short 0    # Padding
89.debug_dwo_str_offsets_base0:
90        .long dwo_str_CU_5_producer-.debug_str.dwo
91        .long dwo_str_CU_5_name-.debug_str.dwo
92        .long dwo_str_CU_5_comp_dir-.debug_str.dwo
93        .long dwo_str_TU_5-.debug_str.dwo
94        .long dwo_str_TU_5_type-.debug_str.dwo
95.debug_dwo_str_offsets_segment0_end:
96
97# All CUs/TUs use the same abbrev section for simplicity.
98        .section .debug_abbrev,"",@progbits
99        .byte 0x01  # Abbrev code
100        .byte 0x11  # DW_TAG_compile_unit
101        .byte 0x01  # DW_CHILDREN_yes
102        .byte 0x25  # DW_AT_producer
103        .byte 0x1a  # DW_FORM_strx
104        .byte 0x03  # DW_AT_name
105        .byte 0x1a  # DW_FORM_strx
106        .byte 0x72  # DW_AT_str_offsets_base
107        .byte 0x17  # DW_FORM_sec_offset
108        .byte 0x1b  # DW_AT_comp_dir
109        .byte 0x1a  # DW_FORM_strx
110        .byte 0x00  # EOM(1)
111        .byte 0x00  # EOM(2)
112        .byte 0x02  # Abbrev code
113        .byte 0x41  # DW_TAG_type_unit
114        .byte 0x01  # DW_CHILDREN_yes
115        .byte 0x03  # DW_AT_name
116        .byte 0x1a  # DW_FORM_strx
117        .byte 0x72  # DW_AT_str_offsets_base
118        .byte 0x17  # DW_FORM_sec_offset
119        .byte 0x00  # EOM(1)
120        .byte 0x00  # EOM(2)
121        .byte 0x03  # Abbrev code
122        .byte 0x13  # DW_TAG_structure_type
123        .byte 0x00  # DW_CHILDREN_no (no members)
124        .byte 0x03  # DW_AT_name
125        .byte 0x1a  # DW_FORM_strx
126        .byte 0x00  # EOM(1)
127        .byte 0x00  # EOM(2)
128        .byte 0x04  # Abbrev code
129        .byte 0x2e  # DW_TAG_subprogram
130        .byte 0x01  # DW_CHILDREN_yes
131        .byte 0x03  # DW_AT_name
132        .byte 0x25  # DW_FORM_strx1
133        .byte 0x00  # EOM(1)
134        .byte 0x00  # EOM(2)
135        .byte 0x05  # Abbrev code
136        .byte 0x34  # DW_TAG_variable
137        .byte 0x00  # DW_CHILDREN_no
138        .byte 0x03  # DW_AT_name
139        .byte 0x26  # DW_FORM_strx2
140        .byte 0x49  # DW_AT_type
141        .byte 0x13  # DW_FORM_ref4
142        .byte 0x00  # EOM(1)
143        .byte 0x00  # EOM(2)
144        .byte 0x06  # Abbrev code
145        .byte 0x34  # DW_TAG_variable
146        .byte 0x00  # DW_CHILDREN_no
147        .byte 0x03  # DW_AT_name
148        .byte 0x27  # DW_FORM_strx3
149        .byte 0x49  # DW_AT_type
150        .byte 0x13  # DW_FORM_ref4
151        .byte 0x00  # EOM(1)
152        .byte 0x00  # EOM(2)
153        .byte 0x07  # Abbrev code
154        .byte 0x34  # DW_TAG_variable
155        .byte 0x00  # DW_CHILDREN_no
156        .byte 0x03  # DW_AT_name
157        .byte 0x28  # DW_FORM_strx4
158        .byte 0x49  # DW_AT_type
159        .byte 0x13  # DW_FORM_ref4
160        .byte 0x00  # EOM(1)
161        .byte 0x00  # EOM(2)
162        .byte 0x08  # Abbrev code
163        .byte 0x24  # DW_TAG_base_type
164        .byte 0x00  # DW_CHILDREN_no
165        .byte 0x3e  # DW_AT_encoding
166        .byte 0x0b  # DW_FORM_data1
167        .byte 0x00  # EOM(1)
168        .byte 0x00  # EOM(2)
169        .byte 0x09  # Abbrev code
170        .byte 0x11  # DW_TAG_compile_unit
171        .byte 0x00  # DW_CHILDREN_no
172        .byte 0x00  # EOM(1)
173        .byte 0x00  # EOM(2)
174        .byte 0x00  # EOM(3)
175
176# And a .dwo copy of a subset for the .dwo sections.
177        .section .debug_abbrev.dwo,"e",@progbits
178        .byte 0x01  # Abbrev code
179        .byte 0x11  # DW_TAG_compile_unit
180        .byte 0x00  # DW_CHILDREN_no
181        .byte 0x25  # DW_AT_producer
182        .byte 0x1a  # DW_FORM_strx
183        .byte 0x03  # DW_AT_name
184        .byte 0x1a  # DW_FORM_strx
185        .byte 0x1b  # DW_AT_comp_dir
186        .byte 0x1a  # DW_FORM_strx
187        .byte 0x00  # EOM(1)
188        .byte 0x00  # EOM(2)
189        .byte 0x02  # Abbrev code
190        .byte 0x41  # DW_TAG_type_unit
191        .byte 0x01  # DW_CHILDREN_yes
192        .byte 0x03  # DW_AT_name
193        .byte 0x1a  # DW_FORM_strx
194        .byte 0x00  # EOM(1)
195        .byte 0x00  # EOM(2)
196        .byte 0x03  # Abbrev code
197        .byte 0x13  # DW_TAG_structure_type
198        .byte 0x00  # DW_CHILDREN_no (no members)
199        .byte 0x03  # DW_AT_name
200        .byte 0x1a  # DW_FORM_strx
201        .byte 0x00  # EOM(1)
202        .byte 0x00  # EOM(2)
203        .byte 0x00  # EOM(3)
204
205        .section .debug_info,"",@progbits
206
207# DWARF v5 CU header.
208        .long  CU1_5_end-CU1_5_version  # Length of Unit
209CU1_5_version:
210        .short 5               # DWARF version number
211        .byte 1                # DWARF Unit Type
212        .byte 8                # Address Size (in bytes)
213        .long .debug_abbrev    # Offset Into Abbrev. Section
214# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name,
215# DW_AT_str_offsets and DW_AT_compdir.
216        .byte 1                # Abbreviation code
217        .byte 0                # The index of the producer string
218        .byte 1                # The index of the CU name string
219        .long .debug_str_offsets_base0
220        .byte 2                # The index of the comp dir string
221# A subprogram DIE with DW_AT_name, using DW_FORM_strx1.
222        .byte 4                # Abbreviation code
223        .byte 3                # Subprogram name string (DW_FORM_strx1)
224# A variable DIE with DW_AT_name, using DW_FORM_strx2, and DW_AT_type.
225        .byte 5                # Abbreviation code
226        .short 0x0004          # Subprogram name string (DW_FORM_strx2)
227        .long TypeDie-.debug_info
228# A variable DIE with DW_AT_name, using DW_FORM_strx3, and DW_AT_type.
229        .byte 6                # Abbreviation code
230        .byte 5                # Subprogram name string (DW_FORM_strx3)
231        .short 0               # Subprogram name string (DW_FORM_strx3)
232        .long TypeDie-.debug_info
233# A variable DIE with DW_AT_name, using DW_FORM_strx4, and DW_AT_type.
234        .byte 7                # Abbreviation code
235        .long 6                # Subprogram name string (DW_FORM_strx4)
236        .long TypeDie-.debug_info
237        .byte 0 # NULL
238# A base type DIE with DW_AT_encoding.
239TypeDie:
240        .byte 8                # Abbreviation code
241        .byte 5                # DW_ATE_signed
242        .byte 0 # NULL
243        .byte 0 # NULL
244CU1_5_end:
245
246# DWARF v5 CU header
247        .long 0xffffffff
248        .quad CU2_5_end-CU2_5_version  # Length of Unit
249CU2_5_version:
250        .short 5               # DWARF version number
251        .byte 1                # DWARF Unit Type
252        .byte 8                # Address Size (in bytes)
253        .quad .debug_abbrev    # Offset Into Abbrev. Section
254# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name,
255# DW_AT_str_offsets and DW_AT_compdir.
256        .byte 1                # Abbreviation code
257        .byte 0                # The index of the producer string
258        .byte 1                # The index of the CU name string
259        .quad .debug_str_offsets_base1
260        .byte 2                # The index of the comp dir string
261        .byte 0 # NULL
262CU2_5_end:
263# DWARF v5 CU without str_offsets_base - this shouldn't produce an error/nor
264# prevent other str_offsets contributions from being dumped.
265	.long CU3_5_end-CU3_5_version  # Length of Unit
266CU3_5_version:
267        .short 5               # DWARF version number
268        .byte 1                # DWARF Unit Type
269        .byte 8                # Address Size (in bytes)
270        .long .debug_abbrev    # Offset Into Abbrev. Section
271# The compile-unit DIE with no attributes.
272        .byte 9                # Abbreviation code
273CU3_5_end:
274
275
276
277
278
279
280        .section .debug_types,"",@progbits
281# DWARF v5 Type unit header.
282TU_5_start:
283        .long  TU_5_end-TU_5_version  # Length of Unit
284TU_5_version:
285        .short 5               # DWARF version number
286        .byte 2                # DWARF Unit Type
287        .byte 8                # Address Size (in bytes)
288        .long .debug_abbrev    # Offset Into Abbrev. Section
289        .quad 0x0011223344556677 # Type Signature
290        .long TU_5_type-TU_5_start # Type offset
291# The type-unit DIE, which has a name.
292        .byte 2                # Abbreviation code
293        .byte 0                # Index of the unit type name string
294        .long .debug_str_offsets_base2  # offset into the str_offsets section
295# The type DIE, which has a name.
296TU_5_type:
297        .byte 3                # Abbreviation code
298        .byte 1                # Index of the type name string
299        .byte 0 # NULL
300        .byte 0 # NULL
301TU_5_end:
302
303        .section .debug_info.dwo,"e",@progbits
304
305# DWARF v5 split CU header.
306        .long  CU_split_5_end-CU_split_5_version  # Length of Unit
307CU_split_5_version:
308        .short 5               # DWARF version number
309        .byte 1                # DWARF Unit Type
310        .byte 8                # Address Size (in bytes)
311        .long .debug_abbrev.dwo  # Offset Into Abbrev Section
312# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name,
313# DW_AT_str_offsets and DW_AT_compdir.
314        .byte 1                # Abbreviation code
315        .byte 0                # The index of the producer string
316        .byte 1                # The index of the CU name string
317        .byte 2                # The index of the comp dir string
318        .byte 0 # NULL
319CU_split_5_end:
320
321        .section .debug_types.dwo,"e",@progbits
322
323# DWARF v5 split type unit header.
324TU_split_5_start:
325        .long  TU_split_5_end-TU_split_5_version  # Length of Unit
326TU_split_5_version:
327        .short 5               # DWARF version number
328        .byte 6                # DWARF Unit Type
329        .byte 8                # Address Size (in bytes)
330        .long .debug_abbrev.dwo  # Offset Into Abbrev Section
331        .quad 0x8899aabbccddeeff # Type Signature
332        .long TU_split_5_type-TU_split_5_start  # Type offset
333# The type-unit DIE, which has a name.
334        .byte 2                # Abbreviation code
335        .byte 3                # The index of the type unit name string
336# The type DIE, which has a name.
337TU_split_5_type:
338        .byte 3                # Abbreviation code
339        .byte 4                # The index of the type name string
340        .byte 0 # NULL
341        .byte 0 # NULL
342TU_split_5_end:
343
344# We are using a hand-constructed object file and are interest in the correct
345# diplay of the DW_str_offsetsbase attribute, the correct display of strings
346# and the dump of the .debug_str_offsets[.dwo] table.
347
348# Abbreviation for DW_AT_str_offsets_base
349# COMMON:      .debug_abbrev contents:
350# COMMON-NOT:  contents:
351# COMMON:      DW_TAG_compile_unit
352# COMMON-NOT:  DW_TAG
353# COMMON:      DW_AT_str_offsets_base DW_FORM_sec_offset
354#
355# Verify that strings are displayed correctly as indexed strings
356# COMMON:      .debug_info contents:
357# COMMON-NOT:  contents:
358# COMMON:      DW_TAG_compile_unit
359# COMMON-NEXT: DW_AT_producer [DW_FORM_strx] (indexed (00000000) string = "Handmade DWARF producer")
360# COMMON-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "Compile_Unit_1")
361# COMMON-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)
362# COMMON-NEXT: DW_AT_comp_dir [DW_FORM_strx] (indexed (00000002) string = "/home/test/CU1")
363# COMMON-NOT:  NULL
364# COMMON:      DW_TAG_subprogram
365# COMMON-NEXT: DW_AT_name [DW_FORM_strx1] (indexed (00000003) string = "MyFunc")
366# COMMON-NOT:  NULL
367# COMMON:      DW_TAG_variable
368# COMMON-NEXT: DW_AT_name [DW_FORM_strx2] (indexed (00000004) string = "MyVar1")
369# COMMON-NOT:  NULL
370# COMMON:      DW_TAG_variable
371# COMMON-NEXT: DW_AT_name [DW_FORM_strx3] (indexed (00000005) string = "MyVar2")
372# COMMON-NOT:  NULL
373# COMMON:      DW_TAG_variable
374# COMMON-NEXT: DW_AT_name [DW_FORM_strx4] (indexed (00000006) string = "MyVar3")
375#
376# Second compile unit (b.cpp)
377# COMMON:      DW_TAG_compile_unit
378# COMMON-NEXT: DW_AT_producer [DW_FORM_strx] (indexed (00000000) string = "Handmade DWARF producer")
379# COMMON-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "Compile_Unit_2")
380# COMMON-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x0000000000000038)
381# COMMON-NEXT: DW_AT_comp_dir [DW_FORM_strx] (indexed (00000002) string = "/home/test/CU2")
382#
383# The split CU
384# SPLIT:       .debug_info.dwo contents:
385# SPLIT-NOT:   contents:
386# SPLIT:       DW_TAG_compile_unit
387# SPLIT-NEXT:  DW_AT_producer [DW_FORM_strx] (indexed (00000000) string = "Handmade split DWARF producer")
388# SPLIT-NEXT:  DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "V5_split_compile_unit")
389# SPLIT-NEXT:  DW_AT_comp_dir [DW_FORM_strx] (indexed (00000002) string = "/home/test/splitCU")
390#
391# The type unit
392# COMMON:      .debug_types contents:
393# COMMON:      DW_TAG_type_unit
394# COMMON-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000000) string = "Type_Unit")
395# COMMON:      DW_TAG_structure_type
396# COMMON-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "MyStruct")
397#
398# The split type unit
399# SPLIT:       .debug_types.dwo contents:
400# SPLIT:       DW_TAG_type_unit
401# SPLIT-NEXT:  DW_AT_name [DW_FORM_strx] (indexed (00000003) string = "V5_split_type_unit")
402# SPLIT:       DW_TAG_structure_type
403# SPLIT-NEXT:  DW_AT_name [DW_FORM_strx] (indexed (00000004) string = "V5_split_Mystruct")
404#
405# The .debug_str_offsets section
406# COMMON:      .debug_str_offsets contents:
407# COMMON-NEXT: 0x00000000: Contribution size = 32, Format = DWARF32, Version = 5
408# COMMON-NEXT: 0x00000008: 00000000 "Handmade DWARF producer"
409# COMMON-NEXT: 0x0000000c: 00000018 "Compile_Unit_1"
410# COMMON-NEXT: 0x00000010: 00000027 "/home/test/CU1"
411# COMMON-NEXT: 0x00000014: 00000067 "MyFunc"
412# COMMON-NEXT: 0x00000018: 0000006e "MyVar1"
413# COMMON-NEXT: 0x0000001c: 00000075 "MyVar2"
414# COMMON-NEXT: 0x00000020: 0000007c "MyVar3"
415# COMMON-NEXT: Gap, length = 4
416# COMMON-NEXT: 0x00000028: Contribution size = 28, Format = DWARF64, Version = 5
417# COMMON-NEXT: 0x00000038: 0000000000000000 "Handmade DWARF producer"
418# COMMON-NEXT: 0x00000040: 0000000000000036 "Compile_Unit_2"
419# COMMON-NEXT: 0x00000048: 0000000000000045 "/home/test/CU2"
420# COMMON-NEXT: 0x00000050: Contribution size = 12, Format = DWARF32, Version = 5
421# COMMON-NEXT: 0x00000058: 00000054 "Type_Unit"
422# COMMON-NEXT: 0x0000005c: 0000005e "MyStruct"
423#
424# SPLIT:       .debug_str_offsets.dwo contents:
425# SPLIT-NEXT:  0x00000000: Contribution size = 24, Format = DWARF32, Version = 5
426# SPLIT-NEXT:  0x00000008: 00000000 "Handmade split DWARF producer"
427# SPLIT-NEXT:  0x0000000c: 0000001e "V5_split_compile_unit"
428# SPLIT-NEXT:  0x00000010: 00000034 "/home/test/splitCU"
429# SPLIT-NEXT:  0x00000014: 00000047 "V5_split_type_unit"
430# SPLIT-NEXT:  0x00000018: 0000005a "V5_split_Mystruct"
431
432# VERIFY: No errors.
433
434# ERR-NOT: parsing a range list table:
435