diff options
author | George Rimar <grimar@accesssoftek.com> | 2017-09-04 10:30:39 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2017-09-04 10:30:39 +0000 |
commit | 2f95c8bccb73cb4d292a2c4e3704887da3414394 (patch) | |
tree | 8a825101811f635e11bca7d99282a48a8da26c34 /llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | |
parent | 8703e3838068156b2e0ff80b218bf854a7eba84e (diff) | |
download | bcm5719-llvm-2f95c8bccb73cb4d292a2c4e3704887da3414394.tar.gz bcm5719-llvm-2f95c8bccb73cb4d292a2c4e3704887da3414394.zip |
[DebugInfo] - Fix for lld DWARF parsing of base address selection entries in range lists.
It solves issue of wrong section index evaluating for ranges when
base address is used.
Based on David Blaikie's patch D36097.
Differential revision: https://reviews.llvm.org/D37214
llvm-svn: 312477
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index 5b0b3f65f6c..813960ca95d 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -160,7 +160,7 @@ void DWARFUnit::clear() { Length = 0; Abbrevs = nullptr; FormParams = DWARFFormParams({0, 0, DWARF32}); - BaseAddr = 0; + BaseAddr.reset(); RangeSectionBase = 0; AddrOffsetSectionBase = 0; clearDIEs(false); @@ -242,9 +242,10 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) { // If CU DIE was just parsed, copy several attribute values from it. if (!HasCUDie) { DWARFDie UnitDie = getUnitDIE(); - auto BaseAddr = toAddress(UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc})); - if (BaseAddr) - setBaseAddress(*BaseAddr); + Optional<DWARFFormValue> PC = UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc}); + if (Optional<uint64_t> Addr = toAddress(PC)) + setBaseAddress({*Addr, PC->getSectionIndex()}); + if (!isDWO) { assert(AddrOffsetSectionBase == 0); assert(RangeSectionBase == 0); |