250 lines
11 KiB
ArmAsm
250 lines
11 KiB
ArmAsm
|
# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
|
||
|
# RUN: not llvm-dwarfdump -v -debug-info %t.o 2> %t.err | FileCheck %s
|
||
|
# RUN: FileCheck %s --input-file %t.err --check-prefix=ERR --implicit-check-not=error
|
||
|
# RUN: not llvm-dwarfdump -lookup 10 %t.o 2> %t2.err
|
||
|
# RUN: FileCheck %s --input-file %t2.err --check-prefix=ERR --implicit-check-not=error
|
||
|
# RUN: llvm-dwarfdump -debug-rnglists %t.o | \
|
||
|
# RUN: FileCheck %s --check-prefix=RNGLISTS
|
||
|
|
||
|
# Test object to verify dwarfdump handles v5 range lists in 64-bit DWARF format.
|
||
|
# This is similar to 'dwarfdump-rnglists.s', which uses 32-bit DWARF format.
|
||
|
# We use very simplified compile unit dies.
|
||
|
# There are 2 full CUs with DW_AT_rnglists_base, one with a DW_AT_ranges
|
||
|
# attribute using DW_FORM_sec_offset, the other with DW_AT_ranges using
|
||
|
# DW_FORM_rnglistx.
|
||
|
|
||
|
.section .debug_abbrev,"",@progbits
|
||
|
.byte 0x01 # Abbrev code
|
||
|
.byte 0x11 # DW_TAG_compile_unit
|
||
|
.byte 0x00 # DW_CHILDREN_no
|
||
|
.byte 0x74 # DW_AT_rnglists_base
|
||
|
.byte 0x17 # DW_FORM_sec_offset
|
||
|
.byte 0x55 # DW_AT_ranges
|
||
|
.byte 0x17 # DW_FORM_sec_offset
|
||
|
.byte 0x00 # EOM(1)
|
||
|
.byte 0x00 # EOM(2)
|
||
|
.byte 0x02 # Abbrev code
|
||
|
.byte 0x11 # DW_TAG_compile_unit
|
||
|
.byte 0x00 # DW_CHILDREN_no
|
||
|
.byte 0x74 # DW_AT_rnglists_base
|
||
|
.byte 0x17 # DW_FORM_sec_offset
|
||
|
.byte 0x55 # DW_AT_ranges
|
||
|
.byte 0x23 # DW_FORM_rnglistx
|
||
|
.byte 0x00 # EOM(1)
|
||
|
.byte 0x00 # EOM(2)
|
||
|
.byte 0x00 # EOM(3)
|
||
|
|
||
|
# The split CU uses DW_FORM_rnglistx (the only correct option).
|
||
|
# There is no DW_AT_rnglists_base in split units.
|
||
|
.section .debug_abbrev.dwo,"e",@progbits
|
||
|
.byte 0x01 # Abbrev code
|
||
|
.byte 0x11 # DW_TAG_compile_unit
|
||
|
.byte 0x00 # DW_CHILDREN_no
|
||
|
.byte 0x55 # DW_AT_ranges
|
||
|
.byte 0x23 # DW_FORM_rnglistx
|
||
|
.byte 0x00 # EOM(1)
|
||
|
.byte 0x00 # EOM(2)
|
||
|
.byte 0x00 # EOM(3)
|
||
|
|
||
|
.section .debug_info,"",@progbits
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad CU1_5_64_end - CU1_5_64_version # Length of Unit
|
||
|
CU1_5_64_version:
|
||
|
.short 5 # DWARF version number
|
||
|
.byte 1 # DWARF Unit Type
|
||
|
.byte 4 # Address Size (in bytes)
|
||
|
.quad .debug_abbrev # Offset Into Abbrev. Section
|
||
|
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
|
||
|
.byte 1 # Abbreviation code
|
||
|
.quad Rnglist_Table0_base # DW_AT_rnglists_base
|
||
|
.quad Rnglist_Table0_Rnglist0 # DW_AT_ranges
|
||
|
CU1_5_64_end:
|
||
|
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad CU2_5_64_end - CU2_5_64_version # Length of Unit
|
||
|
CU2_5_64_version:
|
||
|
.short 5 # DWARF version number
|
||
|
.byte 1 # DWARF Unit Type
|
||
|
.byte 4 # Address Size (in bytes)
|
||
|
.quad .debug_abbrev # Offset Into Abbrev. Section
|
||
|
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
|
||
|
.byte 2 # Abbreviation code
|
||
|
.quad Rnglist_Table0_base # DW_AT_rnglists_base
|
||
|
.uleb128 1 # DW_AT_ranges
|
||
|
CU2_5_64_end:
|
||
|
|
||
|
# A CU with an invalid DW_AT_rnglists_base attribute
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad CU3_5_64_end - CU3_5_64_version # Length of Unit
|
||
|
CU3_5_64_version:
|
||
|
.short 5 # DWARF version number
|
||
|
.byte 1 # DWARF Unit Type
|
||
|
.byte 4 # Address Size (in bytes)
|
||
|
.quad .debug_abbrev # Offset Into Abbrev. Section
|
||
|
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
|
||
|
.byte 2 # Abbreviation code
|
||
|
.quad 0x8 # DW_AT_rnglists_base
|
||
|
.uleb128 0 # DW_AT_ranges
|
||
|
CU3_5_64_end:
|
||
|
|
||
|
# A CU DIE with an incorrect DW_AT_ranges attribute
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad CU4_5_64_end - CU4_5_64_version # Length of Unit
|
||
|
CU4_5_64_version:
|
||
|
.short 5 # DWARF version number
|
||
|
.byte 1 # DWARF Unit Type
|
||
|
.byte 4 # Address Size (in bytes)
|
||
|
.quad .debug_abbrev # Offset Into Abbrev. Section
|
||
|
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
|
||
|
.byte 1 # Abbreviation code
|
||
|
.quad Rnglist_Table0_base # DW_AT_rnglists_base
|
||
|
.quad 4000 # DW_AT_ranges
|
||
|
CU4_5_64_end:
|
||
|
|
||
|
.section .debug_info.dwo,"e",@progbits
|
||
|
|
||
|
# DWARF v5 split CU header.
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad CU_split_5_64_end-CU_split_5_64_version # Length of Unit
|
||
|
CU_split_5_64_version:
|
||
|
.short 5 # DWARF version number
|
||
|
.byte 5 # DWARF Unit Type
|
||
|
.byte 4 # Address Size (in bytes)
|
||
|
.quad 0 # Offset Into Abbrev Section
|
||
|
.quad 0xdeadbeefbaadf00d # DWO id
|
||
|
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
|
||
|
.byte 1 # Abbreviation code
|
||
|
.uleb128 1 # DW_AT_ranges
|
||
|
CU_split_5_64_end:
|
||
|
|
||
|
.section .debug_rnglists,"",@progbits
|
||
|
# A rnglist table with 2 range lists. The first one uses DW_RLE_start_end
|
||
|
# and DW_RLE_start_length. The second one uses DW_RLE_base_address and
|
||
|
# DW_RLE_offset_pair. The range lists have entries in the offset table.
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad Rnglist_Table0_end - Rnglist_Table0 # table length
|
||
|
Rnglist_Table0:
|
||
|
.short 5 # version
|
||
|
.byte 4 # address size
|
||
|
.byte 0 # segment selector size
|
||
|
.long 2 # offset entry count
|
||
|
Rnglist_Table0_base:
|
||
|
# 2 offset entries which can be used by DW_FORM_rnglistx.
|
||
|
.quad Rnglist_Table0_Rnglist0 - Rnglist_Table0_base
|
||
|
.quad Rnglist_Table0_Rnglist1 - Rnglist_Table0_base
|
||
|
Rnglist_Table0_Rnglist0:
|
||
|
.byte 6 # DW_RLE_start_end
|
||
|
.long Range0_start
|
||
|
.long Range0_end
|
||
|
.byte 7 # DW_RLE_start_length
|
||
|
.long Range1_start
|
||
|
.uleb128 Range1_end - Range1_start
|
||
|
.byte 0 # DW_RLE_end_of_list
|
||
|
Rnglist_Table0_Rnglist1:
|
||
|
.byte 5 # DW_RLE_base_address
|
||
|
.long Range0_start
|
||
|
.byte 4 # DW_RLE_offset_pair
|
||
|
.uleb128 Range1_start - Range0_start
|
||
|
.uleb128 Range1_end - Range0_start
|
||
|
.byte 0 # DW_RLE_end_of_list
|
||
|
Rnglist_Table0_end:
|
||
|
|
||
|
# A rnglist table for the split unit with an empty rangelist and one that
|
||
|
# uses DW_RLE_base_address and DW_RLE_offset_pair. The ranges have entries
|
||
|
# in the offset table. We use the empty range list so we can test
|
||
|
# DW_FORM_rnglistx with an index other than 0.
|
||
|
.section .debug_rnglists.dwo,"e",@progbits
|
||
|
.long 0xffffffff # DWARF64 mark
|
||
|
.quad Rnglist_Table0_dwo_end - Rnglist_Table0_dwo # table length
|
||
|
Rnglist_Table0_dwo:
|
||
|
.short 5 # version
|
||
|
.byte 4 # address size
|
||
|
.byte 0 # segment selector size
|
||
|
.long 2 # offset entry count
|
||
|
Rnglist_Table0_base_dwo:
|
||
|
# 2 offset entries which can be used by DW_FORM_rnglistx.
|
||
|
.quad Rnglist_Table0_Rnglist0_dwo - Rnglist_Table0_base_dwo
|
||
|
.quad Rnglist_Table0_Rnglist1_dwo - Rnglist_Table0_base_dwo
|
||
|
Rnglist_Table0_Rnglist0_dwo:
|
||
|
.byte 0 # DW_RLE_start_end
|
||
|
Rnglist_Table0_Rnglist1_dwo:
|
||
|
.byte 5 # DW_RLE_base_address
|
||
|
.long Range0_start - .text
|
||
|
.byte 4 # DW_RLE_offset_pair
|
||
|
.uleb128 Range1_start - Range0_start
|
||
|
.uleb128 Range1_end - Range0_start
|
||
|
.byte 0 # DW_RLE_end_of_list
|
||
|
Rnglist_Table0_dwo_end:
|
||
|
|
||
|
.text
|
||
|
.space 20
|
||
|
Range0_start: # Range0: 0x14 - 0x1c
|
||
|
.space 10
|
||
|
Range0_end:
|
||
|
.space 12
|
||
|
Range1_start: # Range1: 0x2a - 0x34
|
||
|
.space 10
|
||
|
Range1_end:
|
||
|
|
||
|
# CHECK: .debug_info contents:
|
||
|
# CHECK: Compile Unit:
|
||
|
# CHECK-NOT: Compile Unit:
|
||
|
# CHECK: DW_TAG_compile_unit
|
||
|
# CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000000000014)
|
||
|
# CHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x0000000000000024
|
||
|
# CHECK-NEXT: [0x00000014, 0x0000001e) ".text"
|
||
|
# CHECK-NEXT: [0x0000002a, 0x00000034) ".text")
|
||
|
|
||
|
# CHECK: Compile Unit:
|
||
|
# CHECK-NOT: Compile Unit:
|
||
|
# CHECK: DW_TAG_compile_unit
|
||
|
# CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000000000014)
|
||
|
# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000034
|
||
|
# CHECK-NEXT: [0x0000002a, 0x00000034) ".text")
|
||
|
|
||
|
# CHECK: .debug_info.dwo contents:
|
||
|
# CHECK: Compile Unit:
|
||
|
# CHECK-NOT: contents:
|
||
|
# CHECK: DW_TAG_compile_unit
|
||
|
# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000025
|
||
|
# CHECK-NEXT: [0x0000002a, 0x00000034))
|
||
|
|
||
|
#ERR: error: decoding address ranges: invalid range list offset 0x4000500000008
|
||
|
#ERR: error: decoding address ranges: invalid range list offset 0xfa0
|
||
|
|
||
|
# RNGLISTS: .debug_rnglists contents:
|
||
|
# RNGLISTS: range list header:
|
||
|
# RNGLISTS-SAME: length = 0x0000000000000031,
|
||
|
# RNGLISTS-SAME: format = DWARF64,
|
||
|
# RNGLISTS-SAME: version = 0x0005,
|
||
|
# RNGLISTS-SAME: addr_size = 0x04,
|
||
|
# RNGLISTS-SAME: seg_size = 0x00,
|
||
|
# RNGLISTS-SAME: offset_entry_count = 0x00000002
|
||
|
# RNGLISTS-NEXT: offsets: [
|
||
|
# RNGLISTS-NEXT: 0x0000000000000010
|
||
|
# RNGLISTS-NEXT: 0x0000000000000020
|
||
|
# RNGLISTS-NEXT: ]
|
||
|
# RNGLISTS-NEXT: ranges:
|
||
|
# RNGLISTS-NEXT: [0x00000014, 0x0000001e)
|
||
|
# RNGLISTS-NEXT: [0x0000002a, 0x00000034)
|
||
|
# RNGLISTS-NEXT: <End of list>
|
||
|
# RNGLISTS-NEXT: [0x0000002a, 0x00000034)
|
||
|
# RNGLISTS-NEXT: <End of list>
|
||
|
|
||
|
# RNGLISTS: .debug_rnglists.dwo contents:
|
||
|
# RNGLISTS: range list header:
|
||
|
# RNGLISTS-SAME: length = 0x0000000000000022,
|
||
|
# RNGLISTS-SAME: format = DWARF64,
|
||
|
# RNGLISTS-SAME: version = 0x0005,
|
||
|
# RNGLISTS-SAME: addr_size = 0x04,
|
||
|
# RNGLISTS-SAME: seg_size = 0x00,
|
||
|
# RNGLISTS-SAME: offset_entry_count = 0x00000002
|
||
|
# RNGLISTS-NEXT: offsets: [
|
||
|
# RNGLISTS-NEXT: 0x0000000000000010
|
||
|
# RNGLISTS-NEXT: 0x0000000000000011
|
||
|
# RNGLISTS-NEXT: ]
|
||
|
# RNGLISTS-NEXT: ranges:
|
||
|
# RNGLISTS-NEXT: <End of list>
|
||
|
# RNGLISTS-NEXT: [0x0000002a, 0x00000034)
|
||
|
# RNGLISTS-NEXT: <End of list>
|