forked from OSchip/llvm-project
[DWARF][Verifier] Do not add child DieRangeInfo with empty address range to the parent.
verifyDieRanges function checks for the intersected address ranges. It adds child DieRangeInfo into parent DieRangeInfo to check whether children have overlapping address ranges. It is safe to not add DieRangeInfo with empty address range into parent's children list. This decreases the number of children which should be navigated and as a result decreases execution time(parents having a lot of children with empty ranges spend much time navigating them). For this command: "llvm-dwarfdump --verify clang-repl" execution time decreased from 220 sec till 75 sec. Differential Revision: https://reviews.llvm.org/D107554
This commit is contained in:
parent
40fd2d93c0
commit
07d44cc0b1
|
@ -50,6 +50,9 @@ DWARFVerifier::DieRangeInfo::insert(const DWARFAddressRange &R) {
|
|||
|
||||
DWARFVerifier::DieRangeInfo::die_range_info_iterator
|
||||
DWARFVerifier::DieRangeInfo::insert(const DieRangeInfo &RI) {
|
||||
if (RI.Ranges.empty())
|
||||
return Children.end();
|
||||
|
||||
auto End = Children.end();
|
||||
auto Iter = Children.begin();
|
||||
while (Iter != End) {
|
||||
|
@ -462,7 +465,7 @@ unsigned DWARFVerifier::verifyDieRanges(const DWARFDie &Die,
|
|||
}
|
||||
|
||||
// Verify that ranges are contained within their parent.
|
||||
bool ShouldBeContained = !Ranges.empty() && !ParentRI.Ranges.empty() &&
|
||||
bool ShouldBeContained = !RI.Ranges.empty() && !ParentRI.Ranges.empty() &&
|
||||
!(Die.getTag() == DW_TAG_subprogram &&
|
||||
ParentRI.Die.getTag() == DW_TAG_subprogram);
|
||||
if (ShouldBeContained && !ParentRI.contains(RI)) {
|
||||
|
|
|
@ -0,0 +1,212 @@
|
|||
# This test verifies that: if a DW_TAG_compile_unit has children not having
|
||||
# ranges then llvm-dwarfdump still correctly verifies other dies with normal
|
||||
# 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)
|
||||
# [0x0000000000001000, 0x0000000000002000))
|
||||
#
|
||||
# 0x0000001e: DW_TAG_subprogram
|
||||
# DW_AT_name ("no_range1")
|
||||
#
|
||||
# 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)
|
||||
#
|
||||
# # 0x0000001e: DW_TAG_subprogram
|
||||
# DW_AT_name ("no_range2")
|
||||
#
|
||||
# 0x00000066: NULL
|
||||
|
||||
# RUN: yaml2obj %s | llvm-dwarfdump --verify - | FileCheck %s
|
||||
|
||||
# CHECK: Verifying -: file format Mach-O 64-bit x86-64
|
||||
# CHECK: Verifying .debug_abbrev...
|
||||
# CHECK: Verifying .debug_info Unit Header Chain...
|
||||
# CHECK: No errors.
|
||||
|
||||
--- !mach-o
|
||||
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: 75
|
||||
offset: 0x00000234
|
||||
align: 0
|
||||
reloff: 0x00000000
|
||||
nreloc: 0
|
||||
flags: 0x00000000
|
||||
reserved1: 0x00000000
|
||||
reserved2: 0x00000000
|
||||
reserved3: 0x00000000
|
||||
- sectname: __debug_ranges
|
||||
segname: __DWARF
|
||||
addr: 0x000000000000008B
|
||||
size: 48
|
||||
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'
|
||||
- no_range1
|
||||
- no_range2
|
||||
- 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
|
||||
|
||||
debug_ranges:
|
||||
- Offset: 0x00000000
|
||||
AddrSize: 0x08
|
||||
Entries:
|
||||
- LowOffset: 0x0000000000002000
|
||||
HighOffset: 0x0000000000003000
|
||||
- LowOffset: 0x0000000000001000
|
||||
HighOffset: 0x0000000000002000
|
||||
debug_info:
|
||||
- Version: 4
|
||||
AddrSize: 8
|
||||
Entries:
|
||||
- AbbrCode: 0x00000001
|
||||
Values:
|
||||
- Value: 0x0000000000000001
|
||||
- Value: 0x0000000000000002
|
||||
- Value: 0x0000000000000000
|
||||
- Value: 0x0000000000000000
|
||||
- AbbrCode: 0x00000003
|
||||
Values:
|
||||
- Value: 0x000000000000000D
|
||||
- AbbrCode: 0x00000002
|
||||
Values:
|
||||
- Value: 0x0000000000000021
|
||||
- Value: 0x0000000000001000
|
||||
- Value: 0x0000000000001000
|
||||
- AbbrCode: 0x00000002
|
||||
Values:
|
||||
- Value: 0x0000000000000026
|
||||
- Value: 0x0000000000002000
|
||||
- Value: 0x0000000000001000
|
||||
- AbbrCode: 0x00000003
|
||||
Values:
|
||||
- Value: 0x0000000000000017
|
||||
- AbbrCode: 0x00000000
|
||||
...
|
|
@ -0,0 +1,236 @@
|
|||
# This test verifies that: if a parent die(DW_TAG_subprogram) has zero
|
||||
# length address range and has a child with normal address range then
|
||||
# the "DIE address ranges are not contained in its parent's ranges"
|
||||
# error is reported. It also checks that if a parent die has zero
|
||||
# length address range and has children with overlapped addresses
|
||||
# then the error "DIEs have overlapping address ranges" is reported.
|
||||
#
|
||||
# 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
|
||||
# [0x0000000000001000, 0x0000000000002000))
|
||||
#
|
||||
# 0x0000001e: DW_TAG_subprogram
|
||||
# DW_AT_name ("main")
|
||||
# DW_AT_low_pc (0x0000000000000000)
|
||||
# DW_AT_high_pc (0x0000000000000000)
|
||||
#
|
||||
# 0x00000033: DW_TAG_lexical_block
|
||||
# DW_AT_low_pc (0x0000000000001000)
|
||||
# DW_AT_high_pc (0x0000000000002000)
|
||||
#
|
||||
# 0x00000044: DW_TAG_lexical_block
|
||||
# DW_AT_low_pc (0x0000000000001000)
|
||||
# DW_AT_high_pc (0x0000000000002000)
|
||||
# 0x00000055: NULL
|
||||
#
|
||||
# 0x00000056: NULL
|
||||
|
||||
|
||||
# RUN: yaml2obj %s | not llvm-dwarfdump --verify - | FileCheck %s --implicit-check-not=error:
|
||||
|
||||
# CHECK: Verifying -: file format Mach-O 64-bit x86-64
|
||||
# CHECK: Verifying .debug_abbrev...
|
||||
# CHECK: Verifying .debug_info Unit Header Chain...
|
||||
# CHECK: error: DIE address ranges are not contained in its parent's ranges:
|
||||
# CHECK: 0x0000001e: DW_TAG_subprogram
|
||||
# CHECK: DW_AT_name ("main")
|
||||
# CHECK: DW_AT_low_pc (0x0000000000000000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000000000)
|
||||
|
||||
# CHECK: 0x00000033: DW_TAG_lexical_block
|
||||
# CHECK: DW_AT_low_pc (0x0000000000001000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000002000)
|
||||
|
||||
# CHECK: error: DIEs have overlapping address ranges:
|
||||
# CHECK: 0x00000044: DW_TAG_lexical_block
|
||||
# CHECK: DW_AT_low_pc (0x0000000000001000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000002000)
|
||||
|
||||
# CHECK: 0x00000033: DW_TAG_lexical_block
|
||||
# CHECK: DW_AT_low_pc (0x0000000000001000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000002000)
|
||||
|
||||
# CHECK: error: DIE address ranges are not contained in its parent's ranges:
|
||||
# CHECK: 0x0000001e: DW_TAG_subprogram
|
||||
# CHECK: DW_AT_name ("main")
|
||||
# CHECK: DW_AT_low_pc (0x0000000000000000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000000000)
|
||||
|
||||
# CHECK: 0x00000044: DW_TAG_lexical_block
|
||||
# CHECK: DW_AT_low_pc (0x0000000000001000)
|
||||
# CHECK: DW_AT_high_pc (0x0000000000002000)
|
||||
|
||||
|
||||
--- !mach-o
|
||||
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: 87
|
||||
offset: 0x00000234
|
||||
align: 0
|
||||
reloff: 0x00000000
|
||||
nreloc: 0
|
||||
flags: 0x00000000
|
||||
reserved1: 0x00000000
|
||||
reserved2: 0x00000000
|
||||
reserved3: 0x00000000
|
||||
- sectname: __debug_ranges
|
||||
segname: __DWARF
|
||||
addr: 0x000000000000008B
|
||||
size: 32
|
||||
offset: 0x0000029B
|
||||
align: 0
|
||||
reloff: 0x00000000
|
||||
nreloc: 0
|
||||
flags: 0x00000000
|
||||
reserved1: 0x00000000
|
||||
reserved2: 0x00000000
|
||||
reserved3: 0x00000000
|
||||
- sectname: __debug_str
|
||||
segname: __DWARF
|
||||
addr: 0x00000000000000DB
|
||||
size: 18
|
||||
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'
|
||||
- main
|
||||
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_yes
|
||||
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
|
||||
- Code: 0x00000003
|
||||
Tag: DW_TAG_lexical_block
|
||||
Children: DW_CHILDREN_no
|
||||
Attributes:
|
||||
- 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: 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: 0x0000000000000000
|
||||
- AbbrCode: 0x00000003
|
||||
Values:
|
||||
- Value: 0x0000000000001000
|
||||
- Value: 0x0000000000002000
|
||||
- AbbrCode: 0x00000003
|
||||
Values:
|
||||
- Value: 0x0000000000001000
|
||||
- Value: 0x0000000000002000
|
||||
- AbbrCode: 0x00000000
|
||||
- AbbrCode: 0x00000000
|
||||
...
|
Loading…
Reference in New Issue