[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