# This test verifies that if a DW_TAG_compile_unit has DW_AT_ranges that
# overlap, that it doesn't end up producing invalid errors claiming a child
# DW_TAG_subprogram DIE is not in the parant (CU) ranges. Prior to the commit
# that fixed this, a loop was iterating over all DW_AT_ranges for a DIE and
# stopping the loop if any intersecting ranges were found. This would cause
# the DW_TAG_subprogram DIEs, like "stripped2" and "main", to improperly report
# that they were not contained in the parent's address ranges
#
# The DWARF looks like:
# 0x0000000b: DW_TAG_compile_unit
# DW_AT_name ("/tmp/main.c")
# DW_AT_language (DW_LANG_C)
# DW_AT_low_pc (0x0000000000000000)
# DW_AT_ranges (0x00000000
# [0x0000000000002000, 0x0000000000003000)
# [0x0000000000000000, 0x0000000000000020)
# [0x0000000000000000, 0x0000000000000030)
# [0x0000000000001000, 0x0000000000002000))
#
# 0x0000001e: DW_TAG_subprogram
# DW_AT_name ("stripped1")
# DW_AT_low_pc (0x0000000000000000)
# DW_AT_high_pc (0x0000000000000020)
#
# 0x0000002f: DW_TAG_subprogram
# DW_AT_name ("stripped2")
# DW_AT_low_pc (0x0000000000000000)
# DW_AT_high_pc (0x0000000000000030)
#
# 0x00000044: DW_TAG_subprogram
# DW_AT_name ("main")
# DW_AT_low_pc (0x0000000000001000)
# DW_AT_high_pc (0x0000000000002000)
#
# 0x00000055: DW_TAG_subprogram
# DW_AT_name ("foo")
# DW_AT_low_pc (0x0000000000002000)
# DW_AT_high_pc (0x0000000000003000)
#
# 0x00000066: NULL
# RUN: yaml2obj %s | not llvm-dwarfdump --verify - | FileCheck %s --implicit-check-not=error:
# CHECK: error: DIE has overlapping ranges in DW_AT_ranges attribute: [0x0000000000000000, 0x0000000000000020) and [0x0000000000000000, 0x0000000000000030)
# CHECK: 0x0000000b: DW_TAG_compile_unit
# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000001] = "/tmp/main.c")
# CHECK-NEXT: DW_AT_language [DW_FORM_data2] (DW_LANG_C)
# CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
# CHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000
# CHECK-NEXT: [0x0000000000002000, 0x0000000000003000)
# CHECK-NEXT: [0x0000000000000000, 0x0000000000000020)
# CHECK-NEXT: [0x0000000000000000, 0x0000000000000030)
# CHECK-NEXT: [0x0000000000001000, 0x0000000000002000))
# CHECK: error: DIEs have overlapping address ranges:
# CHECK: 0x0000002f: DW_TAG_subprogram
# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000017] = "stripped2")
# CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
# CHECK-NEXT: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000030)
# CHECK: 0x0000001e: DW_TAG_subprogram
# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000000d] = "stripped1")
# CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
# CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000020)
---
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x00000001
ncmds: 4
sizeofcmds: 464
flags: 0x00002000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: ''
vmaddr: 0
vmsize: 261
fileoff: 528
filesize: 261
maxprot: 7
initprot: 7
nsects: 4
flags: 0
Sections:
- sectname: __debug_abbrev
segname: __DWARF
addr: 0x0000000000000000
size: 36
offset: 0x00000210
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_info
segname: __DWARF
addr: 0x0000000000000024
size: 103
offset: 0x00000234
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_ranges
segname: __DWARF
addr: 0x000000000000008B
size: 80
offset: 0x0000029B
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_str
segname: __DWARF
addr: 0x00000000000000DB
size: 42
offset: 0x000002EB
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 0
nsyms: 0
stroff: 792
strsize: 8
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 658944
sdk: 658944
ntools: 1
Tools:
- tool: 3
version: 34734080
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 792
datasize: 0
LinkEditData:
StringTable:
- ' '
- ''
- ''
- ''
- ''
- ''
- ''
DWARF:
debug_str:
- ''
- '/tmp/main.c'
- stripped1
- stripped2
- main
- foo
debug_abbrev:
- Table:
- Code: 0x00000001
Tag: DW_TAG_compile_unit
Children: DW_CHILDREN_yes
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_strp
- Attribute: DW_AT_language
Form: DW_FORM_data2
- Attribute: DW_AT_low_pc
Form: DW_FORM_addr
- Attribute: DW_AT_ranges
Form: DW_FORM_sec_offset
- Code: 0x00000002
Tag: DW_TAG_subprogram
Children: DW_CHILDREN_no
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_strp
- Attribute: DW_AT_low_pc
Form: DW_FORM_addr
- Attribute: DW_AT_high_pc
Form: DW_FORM_data4
- Code: 0x00000003
Tag: DW_TAG_subprogram
Children: DW_CHILDREN_no
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_strp
- Attribute: DW_AT_low_pc
Form: DW_FORM_addr
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_ranges:
- Offset: 0x00000000
AddrSize: 0x08
Entries:
- LowOffset: 0x0000000000002000
HighOffset: 0x0000000000003000
- LowOffset: 0x0000000000000000
HighOffset: 0x0000000000000020
- LowOffset: 0x0000000000000000
HighOffset: 0x0000000000000030
- LowOffset: 0x0000000000001000
HighOffset: 0x0000000000002000
debug_info:
- Version: 4
AddrSize: 8
Entries:
- AbbrCode: 0x00000001
Values:
- Value: 0x0000000000000001
- Value: 0x0000000000000002
- Value: 0x0000000000000000
- Value: 0x0000000000000000
- AbbrCode: 0x00000002
Values:
- Value: 0x000000000000000D
- Value: 0x0000000000000000
- Value: 0x0000000000000020
- AbbrCode: 0x00000003
Values:
- Value: 0x0000000000000017
- Value: 0x0000000000000000
- Value: 0x0000000000000030
- AbbrCode: 0x00000002
Values:
- Value: 0x0000000000000021
- Value: 0x0000000000001000
- Value: 0x0000000000001000
- AbbrCode: 0x00000002
Values:
- Value: 0x0000000000000026
- Value: 0x0000000000002000
- Value: 0x0000000000001000
- AbbrCode: 0x00000000
...