[DWARF parser] Use distinction between DW_AT_ranges_base and DW_AT_GNU_ranges_base...
authorAlexey Samsonov <vonosmas@gmail.com>
Fri, 13 Jun 2014 22:31:03 +0000 (22:31 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Fri, 13 Jun 2014 22:31:03 +0000 (22:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210945 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/DWARFDebugInfoEntry.cpp
lib/DebugInfo/DWARFDebugInfoEntry.h
lib/DebugInfo/DWARFUnit.cpp

index b811ed70644fa9d9711e36196da409143941c4b2..2e7a54aeb858b7c7001e3136829ad003433f7d9f 100644 (file)
@@ -210,6 +210,16 @@ uint64_t DWARFDebugInfoEntryMinimal::getAttributeValueAsSectionOffset(
   return Result.hasValue() ? Result.getValue() : FailValue;
 }
 
+uint64_t
+DWARFDebugInfoEntryMinimal::getRangesBaseAttribute(const DWARFUnit *U,
+                                                   uint64_t FailValue) const {
+  uint64_t Result =
+      getAttributeValueAsSectionOffset(U, DW_AT_ranges_base, -1ULL);
+  if (Result != -1ULL)
+    return Result;
+  return getAttributeValueAsSectionOffset(U, DW_AT_GNU_ranges_base, FailValue);
+}
+
 bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFUnit *U,
                                                  uint64_t &LowPC,
                                                  uint64_t &HighPC) const {
index 916e1ed340eb350da2a1f3eb6a441d879471d727..cc58eb652adc538548d717cd31a8dd42c15c92ed 100644 (file)
@@ -106,6 +106,8 @@ public:
                                             const uint16_t Attr,
                                             uint64_t FailValue) const;
 
+  uint64_t getRangesBaseAttribute(const DWARFUnit *U, uint64_t FailValue) const;
+
   /// Retrieves DW_AT_low_pc and DW_AT_high_pc from CU.
   /// Returns true if both attributes are present.
   bool getLowAndHighPC(const DWARFUnit *U, uint64_t &LowPC,
index 027827735cf65f5c0b120f468942b894c1d85dad..39d0a0ff5a4cd5771299b589d16ab2a2ae02b3e9 100644 (file)
@@ -225,12 +225,10 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
     setBaseAddress(BaseAddr);
     AddrOffsetSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
         this, DW_AT_GNU_addr_base, 0);
-    // Users of old DWARF may not know about DW_AT_ranges_base, so it is ignored
-    // for skeleton CU DIE (e.g. DW_AT_ranges are *not* relative to it).
-    if (Version > 4) {
-      RangeSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
-          this, DW_AT_GNU_ranges_base, 0);
-    }
+    RangeSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
+        this, DW_AT_ranges_base, 0);
+    // Don't fall back to DW_AT_GNU_ranges_base: it should be ignored for
+    // skeleton CU DIE, so that DWARF users not aware of it are not broken.
   }
 
   setDIERelations();
@@ -276,8 +274,7 @@ bool DWARFUnit::parseDWO() {
   }
   // Share .debug_addr and .debug_ranges section with compile unit in .dwo
   DWOCU->setAddrOffsetSection(AddrOffsetSection, AddrOffsetSectionBase);
-  uint32_t DWORangesBase = DieArray[0].getAttributeValueAsSectionOffset(
-      this, DW_AT_GNU_ranges_base, 0);
+  uint32_t DWORangesBase = DieArray[0].getRangesBaseAttribute(this, 0);
   DWOCU->setRangesSection(RangeSection, DWORangesBase);
   return true;
 }