summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFDie.cpp')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDie.cpp126
1 files changed, 78 insertions, 48 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index f52cc112f7f..981f33c1f4f 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -154,82 +154,112 @@ const char *DWARFDie::getAttributeValueAsString(dwarf::Attribute Attr,
uint64_t DWARFDie::getAttributeValueAsAddress(dwarf::Attribute Attr,
uint64_t FailValue) const {
- auto FormValue = getAttributeValue(Attr);
- if (!FormValue)
- return FailValue;
- Optional<uint64_t> Result = FormValue->getAsAddress();
- return Result.hasValue() ? Result.getValue() : FailValue;
+ if (auto Value = getAttributeValueAsAddress(Attr))
+ return *Value;
+ return FailValue;
+}
+
+Optional<uint64_t>
+DWARFDie::getAttributeValueAsAddress(dwarf::Attribute Attr) const {
+ if (auto FormValue = getAttributeValue(Attr))
+ return FormValue->getAsAddress();
+ return None;
}
int64_t DWARFDie::getAttributeValueAsSignedConstant(dwarf::Attribute Attr,
int64_t FailValue) const {
- auto FormValue = getAttributeValue(Attr);
- if (!FormValue)
- return FailValue;
- Optional<int64_t> Result = FormValue->getAsSignedConstant();
- return Result.hasValue() ? Result.getValue() : FailValue;
+ if (auto Value = getAttributeValueAsSignedConstant(Attr))
+ return *Value;
+ return FailValue;
+}
+
+Optional<int64_t>
+DWARFDie::getAttributeValueAsSignedConstant(dwarf::Attribute Attr) const {
+ if (auto FormValue = getAttributeValue(Attr))
+ return FormValue->getAsSignedConstant();
+ return None;
}
uint64_t
DWARFDie::getAttributeValueAsUnsignedConstant(dwarf::Attribute Attr,
uint64_t FailValue) const {
- auto FormValue = getAttributeValue(Attr);
- if (!FormValue)
- return FailValue;
- Optional<uint64_t> Result = FormValue->getAsUnsignedConstant();
- return Result.hasValue() ? Result.getValue() : FailValue;
+ if (auto Value = getAttributeValueAsUnsignedConstant(Attr))
+ return *Value;
+ return FailValue;
+}
+
+
+Optional<uint64_t>
+DWARFDie::getAttributeValueAsUnsignedConstant(dwarf::Attribute Attr) const {
+ if (auto FormValue = getAttributeValue(Attr))
+ return FormValue->getAsUnsignedConstant();
+ return None;
}
uint64_t DWARFDie::getAttributeValueAsReference(dwarf::Attribute Attr,
uint64_t FailValue) const {
- auto FormValue = getAttributeValue(Attr);
- if (!FormValue)
- return FailValue;
- Optional<uint64_t> Result = FormValue->getAsReference();
- return Result.hasValue() ? Result.getValue() : FailValue;
+ if (auto Value = getAttributeValueAsReference(Attr))
+ return *Value;
+ return FailValue;
+}
+
+
+Optional<uint64_t>
+DWARFDie::getAttributeValueAsReference(dwarf::Attribute Attr) const {
+ if (auto FormValue = getAttributeValue(Attr))
+ return FormValue->getAsReference();
+ return None;
}
uint64_t DWARFDie::getAttributeValueAsSectionOffset(dwarf::Attribute Attr,
uint64_t FailValue) const {
- auto FormValue = getAttributeValue(Attr);
- if (!FormValue)
- return FailValue;
- Optional<uint64_t> Result = FormValue->getAsSectionOffset();
- return Result.hasValue() ? Result.getValue() : FailValue;
+ if (auto Value = getAttributeValueAsSectionOffset(Attr))
+ return *Value;
+ return FailValue;
}
+Optional<uint64_t>
+DWARFDie::getAttributeValueAsSectionOffset(dwarf::Attribute Attr) const {
+ if (auto FormValue = getAttributeValue(Attr))
+ return FormValue->getAsSectionOffset();
+ return None;
+}
+
+
DWARFDie
DWARFDie::getAttributeValueAsReferencedDie(dwarf::Attribute Attr) const {
- uint32_t SpecRef = getAttributeValueAsReference(Attr, -1U);
- if (SpecRef != -1U) {
- auto SpecUnit = U->getUnitSection().getUnitForOffset(SpecRef);
+ auto SpecRef = getAttributeValueAsReference(Attr);
+ if (SpecRef) {
+ auto SpecUnit = U->getUnitSection().getUnitForOffset(*SpecRef);
if (SpecUnit)
- return SpecUnit->getDIEForOffset(SpecRef);
+ return SpecUnit->getDIEForOffset(*SpecRef);
}
return DWARFDie();
}
-uint64_t
-DWARFDie::getRangesBaseAttribute(uint64_t FailValue) const {
- auto Result = getAttributeValueAsSectionOffset(DW_AT_rnglists_base, -1ULL);
- if (Result != -1ULL)
+Optional<uint64_t>
+DWARFDie::getRangesBaseAttribute() const {
+ auto Result = getAttributeValueAsSectionOffset(DW_AT_rnglists_base);
+ if (Result)
return Result;
- return getAttributeValueAsSectionOffset(DW_AT_GNU_ranges_base, FailValue);
+ return getAttributeValueAsSectionOffset(DW_AT_GNU_ranges_base);
}
bool DWARFDie::getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC) const {
- LowPC = getAttributeValueAsAddress(DW_AT_low_pc, -1ULL);
- if (LowPC == -1ULL)
+ if (auto LowPCVal = getAttributeValueAsAddress(DW_AT_low_pc))
+ LowPC = *LowPCVal;
+ else
return false;
- HighPC = getAttributeValueAsAddress(DW_AT_high_pc, -1ULL);
- if (HighPC == -1ULL) {
- // Since DWARF4, DW_AT_high_pc may also be of class constant, in which case
- // it represents function size.
- HighPC = getAttributeValueAsUnsignedConstant(DW_AT_high_pc, -1ULL);
- if (HighPC != -1ULL)
- HighPC += LowPC;
- }
- return (HighPC != -1ULL);
+
+ if (auto HighPCVal = getAttributeValueAsAddress(DW_AT_high_pc)) {
+ // High PC is an address.
+ HighPC = *HighPCVal;
+ } else if (auto Offset = getAttributeValueAsUnsignedConstant(DW_AT_high_pc)) {
+ // High PC is an offset from LowPC.
+ HighPC = LowPC + *Offset;
+ } else
+ return false;
+ return true;
}
DWARFAddressRangesVector
@@ -242,10 +272,10 @@ DWARFDie::getAddressRanges() const {
return DWARFAddressRangesVector(1, std::make_pair(LowPC, HighPC));
}
// Multiple ranges from .debug_ranges section.
- uint32_t RangesOffset = getAttributeValueAsSectionOffset(DW_AT_ranges, -1U);
- if (RangesOffset != -1U) {
+ auto RangesOffset = getAttributeValueAsSectionOffset(DW_AT_ranges);
+ if (RangesOffset) {
DWARFDebugRangeList RangeList;
- if (U->extractRangeList(RangesOffset, RangeList))
+ if (U->extractRangeList(*RangesOffset, RangeList))
return RangeList.getAbsoluteRanges(U->getBaseAddress());
}
return DWARFAddressRangesVector();
OpenPOWER on IntegriCloud