[llvm] r300708 - Revert r300697 which causes buildbot failure.

Dehao Chen via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 19 08:29:00 PDT 2017


Author: dehao
Date: Wed Apr 19 10:28:58 2017
New Revision: 300708

URL: http://llvm.org/viewvc/llvm-project?rev=300708&view=rev
Log:
Revert r300697 which causes buildbot failure.

Modified:
    llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h
    llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
    llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
    llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp

Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h?rev=300708&r1=300707&r2=300708&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h Wed Apr 19 10:28:58 2017
@@ -252,6 +252,13 @@ public:
   void getCallerFrame(uint32_t &CallFile, uint32_t &CallLine,
                       uint32_t &CallColumn, uint32_t &CallDiscriminator) const;
   
+  /// Get inlined chain for a given address, rooted at the current DIE.
+  /// Returns empty chain if address is not contained in address range
+  /// of current DIE.
+  void
+  getInlinedChainForAddress(const uint64_t Address,
+                            SmallVectorImpl<DWARFDie> &InlinedChain) const;
+
   class attribute_iterator;
 
   /// Get an iterator range to all attributes in the current DIE only.

Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=300708&r1=300707&r2=300708&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Wed Apr 19 10:28:58 2017
@@ -31,7 +31,6 @@
 #include <cstdint>
 #include <memory>
 #include <vector>
-#include <map>
 
 namespace llvm {
 
@@ -135,11 +134,6 @@ class DWARFUnit {
   uint64_t BaseAddr;
   // The compile unit debug information entry items.
   std::vector<DWARFDebugInfoEntry> DieArray;
-
-  // Map from range's start address to end address and corresponding DIE.
-  // IntervalMap does not support range removal, as a result, we use the
-  // std::map::upper_bound for address range lookup.
-  std::map<uint64_t, std::pair<uint64_t, DWARFDie>> AddrDieMap;
   typedef iterator_range<std::vector<DWARFDebugInfoEntry>::iterator>
       die_iterator_range;
 
@@ -189,9 +183,6 @@ public:
     AddrOffsetSectionBase = Base;
   }
 
-  // Recursively update address to Die map.
-  void updateAddressDieMap(DWARFDie Die);
-
   void setRangesSection(StringRef RS, uint32_t Base) {
     RangeSection = RS;
     RangeSectionBase = Base;
@@ -348,10 +339,10 @@ private:
   /// it was actually constructed.
   bool parseDWO();
 
-  /// getSubroutineForAddress - Returns subprogram DIE with address range
+  /// getSubprogramForAddress - Returns subprogram DIE with address range
   /// encompassing the provided address. The pointer is alive as long as parsed
   /// compile unit DIEs are not cleared.
-  DWARFDie getSubroutineForAddress(uint64_t Address);
+  DWARFDie getSubprogramForAddress(uint64_t Address);
 };
 
 } // end namespace llvm

Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp?rev=300708&r1=300707&r2=300708&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp Wed Apr 19 10:28:58 2017
@@ -352,6 +352,32 @@ void DWARFDie::dump(raw_ostream &OS, uns
   }
 }
 
+void DWARFDie::getInlinedChainForAddress(
+    const uint64_t Address, SmallVectorImpl<DWARFDie> &InlinedChain) const {
+  if (isNULL())
+    return;
+  DWARFDie DIE(*this);
+  while (DIE) {
+    // Append current DIE to inlined chain only if it has correct tag
+    // (e.g. it is not a lexical block).
+    if (DIE.isSubroutineDIE())
+      InlinedChain.push_back(DIE);
+
+    // Try to get child which also contains provided address.
+    DWARFDie Child = DIE.getFirstChild();
+    while (Child) {
+      if (Child.addressRangeContainsAddress(Address)) {
+        // Assume there is only one such child.
+        break;
+      }
+      Child = Child.getSibling();
+    }
+    DIE = Child;
+  }
+  // Reverse the obtained chain to make the root of inlined chain last.
+  std::reverse(InlinedChain.begin(), InlinedChain.end());
+}
+
 DWARFDie DWARFDie::getParent() const {
   if (isValid())
     return U->getParent(Die);

Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=300708&r1=300707&r2=300708&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Wed Apr 19 10:28:58 2017
@@ -343,66 +343,36 @@ void DWARFUnit::collectAddressRanges(DWA
     clearDIEs(true);
 }
 
-void DWARFUnit::updateAddressDieMap(DWARFDie Die) {
-  if (Die.isSubroutineDIE()) {
-    for (const auto &R : Die.getAddressRanges()) {
-      // Ignore 0-sized ranges.
-      if (R.first == R.second)
-        continue;
-      auto B = AddrDieMap.upper_bound(R.first);
-      if (B != AddrDieMap.begin() && R.first < (--B)->second.first) {
-        // The range is a sub-range of existing ranges, we need to split the
-        // existing range.
-        if (R.second < B->second.first)
-          AddrDieMap[R.second] = B->second;
-        if (R.first > B->first)
-          AddrDieMap[B->first].first = R.first;
-      }
-      AddrDieMap[R.first] = std::make_pair(R.second, Die);
+DWARFDie
+DWARFUnit::getSubprogramForAddress(uint64_t Address) {
+  extractDIEsIfNeeded(false);
+  for (const DWARFDebugInfoEntry &D : DieArray) {
+    DWARFDie DIE(this, &D);
+    if (DIE.isSubprogramDIE() &&
+        DIE.addressRangeContainsAddress(Address)) {
+      return DIE;
     }
   }
-  // Parent DIEs are added to the AddrDieMap prior to the Children DIEs to
-  // simplify the logic to update AddrDieMap. The child's range will always
-  // be equal or smaller than the parent's range. With this assumption, when
-  // adding one range into the map, it will at most split a range into 3
-  // sub-ranges.
-  for (DWARFDie Child = Die.getFirstChild(); Child; Child = Child.getSibling())
-    updateAddressDieMap(Child);
-}
-
-DWARFDie DWARFUnit::getSubroutineForAddress(uint64_t Address) {
-  extractDIEsIfNeeded(false);
-  if (AddrDieMap.empty())
-    updateAddressDieMap(getUnitDIE());
-  auto R = AddrDieMap.upper_bound(Address);
-  if (R == AddrDieMap.begin())
-    return DWARFDie();
-  // upper_bound's previous item contains Address.
-  --R;
-  assert(Address <= R->second.first);
-  return R->second.second;
+  return DWARFDie();
 }
 
 void
 DWARFUnit::getInlinedChainForAddress(uint64_t Address,
                                      SmallVectorImpl<DWARFDie> &InlinedChain) {
-  // First, find the subroutine that contains the given address (the leaf
+  // First, find a subprogram that contains the given address (the root
   // of inlined chain).
-  DWARFDie SubroutineDIE;
+  DWARFDie SubprogramDIE;
   // Try to look for subprogram DIEs in the DWO file.
   parseDWO();
   if (DWO)
-    SubroutineDIE = DWO->getUnit()->getSubroutineForAddress(Address);
+    SubprogramDIE = DWO->getUnit()->getSubprogramForAddress(Address);
   else
-    SubroutineDIE = getSubroutineForAddress(Address);
+    SubprogramDIE = getSubprogramForAddress(Address);
 
-  if (SubroutineDIE) {
-    while (SubroutineDIE) {
-      if (SubroutineDIE.isSubroutineDIE())
-        InlinedChain.push_back(SubroutineDIE);
-      SubroutineDIE  = SubroutineDIE.getParent();
-    }
-  } else
+  // Get inlined chain rooted at this subprogram DIE.
+  if (SubprogramDIE)
+    SubprogramDIE.getInlinedChainForAddress(Address, InlinedChain);
+  else
     InlinedChain.clear();
 }
 




More information about the llvm-commits mailing list