forked from OSchip/llvm-project
[DWARF] - Use DWARFAddressRange struct instead of uint64_t pair for DWARFAddressRangesVector.
Recommit of r303159 "[DWARF] - Use DWARFAddressRange struct instead of uint64_t pair for DWARFAddressRangesVector" All places were shitched to use DWARFAddressRange now. Suggested during review of D33184. llvm-svn: 303163
This commit is contained in:
parent
3824cca7b3
commit
4671f2e08c
|
@ -22,8 +22,13 @@ namespace llvm {
|
|||
|
||||
class raw_ostream;
|
||||
|
||||
struct DWARFAddressRange {
|
||||
uint64_t LowPC;
|
||||
uint64_t HighPC;
|
||||
};
|
||||
|
||||
/// DWARFAddressRangesVector - represents a set of absolute address ranges.
|
||||
typedef std::vector<std::pair<uint64_t, uint64_t>> DWARFAddressRangesVector;
|
||||
typedef std::vector<DWARFAddressRange> DWARFAddressRangesVector;
|
||||
|
||||
class DWARFDebugRangeList {
|
||||
public:
|
||||
|
|
|
@ -54,9 +54,8 @@ void DWARFDebugAranges::generate(DWARFContext *CTX) {
|
|||
if (ParsedCUOffsets.insert(CUOffset).second) {
|
||||
DWARFAddressRangesVector CURanges;
|
||||
CU->collectAddressRanges(CURanges);
|
||||
for (const auto &R : CURanges) {
|
||||
appendRange(CUOffset, R.first, R.second);
|
||||
}
|
||||
for (const auto &R : CURanges)
|
||||
appendRange(CUOffset, R.LowPC, R.HighPC);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,8 +69,8 @@ DWARFDebugRangeList::getAbsoluteRanges(uint64_t BaseAddress) const {
|
|||
if (RLE.isBaseAddressSelectionEntry(AddressSize)) {
|
||||
BaseAddress = RLE.EndAddress;
|
||||
} else {
|
||||
Res.push_back(std::make_pair(BaseAddress + RLE.StartAddress,
|
||||
BaseAddress + RLE.EndAddress));
|
||||
Res.push_back(
|
||||
{BaseAddress + RLE.StartAddress, BaseAddress + RLE.EndAddress});
|
||||
}
|
||||
}
|
||||
return Res;
|
||||
|
|
|
@ -60,8 +60,8 @@ static void dumpRanges(raw_ostream &OS, const DWARFAddressRangesVector& Ranges,
|
|||
OS << '\n';
|
||||
OS.indent(Indent);
|
||||
OS << format("[0x%0*" PRIx64 " - 0x%0*" PRIx64 ")",
|
||||
AddressSize*2, Range.first,
|
||||
AddressSize*2, Range.second);
|
||||
AddressSize*2, Range.LowPC,
|
||||
AddressSize*2, Range.HighPC);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,9 +229,9 @@ DWARFDie::getAddressRanges() const {
|
|||
return DWARFAddressRangesVector();
|
||||
// Single range specified by low/high PC.
|
||||
uint64_t LowPC, HighPC;
|
||||
if (getLowAndHighPC(LowPC, HighPC)) {
|
||||
return DWARFAddressRangesVector(1, std::make_pair(LowPC, HighPC));
|
||||
}
|
||||
if (getLowAndHighPC(LowPC, HighPC))
|
||||
return {{LowPC, HighPC}};
|
||||
|
||||
// Multiple ranges from .debug_ranges section.
|
||||
auto RangesOffset = toSectionOffset(find(DW_AT_ranges));
|
||||
if (RangesOffset) {
|
||||
|
@ -257,7 +257,7 @@ DWARFDie::collectChildrenAddressRanges(DWARFAddressRangesVector& Ranges) const {
|
|||
|
||||
bool DWARFDie::addressRangeContainsAddress(const uint64_t Address) const {
|
||||
for (const auto& R : getAddressRanges()) {
|
||||
if (R.first <= Address && Address < R.second)
|
||||
if (R.LowPC <= Address && Address < R.HighPC)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -349,18 +349,18 @@ void DWARFUnit::updateAddressDieMap(DWARFDie Die) {
|
|||
if (Die.isSubroutineDIE()) {
|
||||
for (const auto &R : Die.getAddressRanges()) {
|
||||
// Ignore 0-sized ranges.
|
||||
if (R.first == R.second)
|
||||
if (R.LowPC == R.HighPC)
|
||||
continue;
|
||||
auto B = AddrDieMap.upper_bound(R.first);
|
||||
if (B != AddrDieMap.begin() && R.first < (--B)->second.first) {
|
||||
auto B = AddrDieMap.upper_bound(R.LowPC);
|
||||
if (B != AddrDieMap.begin() && R.LowPC < (--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;
|
||||
if (R.HighPC < B->second.first)
|
||||
AddrDieMap[R.HighPC] = B->second;
|
||||
if (R.LowPC > B->first)
|
||||
AddrDieMap[B->first].first = R.LowPC;
|
||||
}
|
||||
AddrDieMap[R.first] = std::make_pair(R.second, Die);
|
||||
AddrDieMap[R.LowPC] = std::make_pair(R.HighPC, Die);
|
||||
}
|
||||
}
|
||||
// Parent DIEs are added to the AddrDieMap prior to the Children DIEs to
|
||||
|
|
Loading…
Reference in New Issue