summaryrefslogtreecommitdiff
path: root/lib/DebugInfo
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-10-28 23:58:58 +0000
committerAlexey Samsonov <samsonov@google.com>2013-10-28 23:58:58 +0000
commit39f62fa3dd1f683288e67ba58bef785b2dcaa98c (patch)
treeddc5a3d95a9b8855bdb382bfd5d69a2be4c04ec2 /lib/DebugInfo
parent61e22ea592f877d4b7a632fc3ac208445612a8bd (diff)
Merge DWARFDIE::extractFast and DWARFDIE::extract into one function.
Complicated CU-DIE-specific logic in the latter was never used, and it makes sense to have safety checks for broken dwarf in the former. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193563 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/DebugInfo')
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.cpp60
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.h6
2 files changed, 10 insertions, 56 deletions
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp
index 39d8e3e9189..babfd2ece06 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp
+++ b/lib/DebugInfo/DWARFDebugInfoEntry.cpp
@@ -96,6 +96,9 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
uint32_t *OffsetPtr) {
Offset = *OffsetPtr;
DataExtractor DebugInfoData = U->getDebugInfoExtractor();
+ uint32_t UEndOffset = U->getNextUnitOffset();
+ if (Offset >= UEndOffset || !DebugInfoData.isValidOffset(Offset))
+ return false;
uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
if (0 == AbbrCode) {
// NULL debug tag entry.
@@ -103,7 +106,11 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
return true;
}
AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
- assert(AbbrevDecl);
+ if (0 == AbbrevDecl) {
+ // Restore the original offset.
+ *OffsetPtr = Offset;
+ return false;
+ }
ArrayRef<uint8_t> FixedFormSizes = DWARFFormValue::getFixedFormSizes(
U->getAddressByteSize(), U->getVersion());
assert(FixedFormSizes.size() > 0);
@@ -125,53 +132,6 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
return true;
}
-bool DWARFDebugInfoEntryMinimal::extract(const DWARFUnit *U,
- uint32_t *OffsetPtr) {
- DataExtractor DebugInfoData = U->getDebugInfoExtractor();
- const uint32_t UEndOffset = U->getNextUnitOffset();
- Offset = *OffsetPtr;
- if ((Offset >= UEndOffset) || !DebugInfoData.isValidOffset(Offset))
- return false;
- uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
- if (0 == AbbrCode) {
- // NULL debug tag entry.
- AbbrevDecl = NULL;
- return true;
- }
- AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
- if (0 == AbbrevDecl) {
- // Restore the original offset.
- *OffsetPtr = Offset;
- return false;
- }
- bool IsCompileUnitTag = (AbbrevDecl->getTag() == DW_TAG_compile_unit);
- if (IsCompileUnitTag)
- const_cast<DWARFUnit *>(U)->setBaseAddress(0);
-
- // Skip all data in the .debug_info for the attributes
- for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
- uint16_t Attr = AbbrevDecl->getAttrByIndex(i);
- uint16_t Form = AbbrevDecl->getFormByIndex(i);
-
- if (IsCompileUnitTag &&
- ((Attr == DW_AT_entry_pc) || (Attr == DW_AT_low_pc))) {
- DWARFFormValue FormValue(Form);
- if (FormValue.extractValue(DebugInfoData, OffsetPtr, U)) {
- if (Attr == DW_AT_low_pc || Attr == DW_AT_entry_pc) {
- Optional<uint64_t> BaseAddr = FormValue.getAsAddress(U);
- if (BaseAddr.hasValue())
- const_cast<DWARFUnit *>(U)->setBaseAddress(BaseAddr.getValue());
- }
- }
- } else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
- // Restore the original offset.
- *OffsetPtr = Offset;
- return false;
- }
- }
- return true;
-}
-
bool DWARFDebugInfoEntryMinimal::isSubprogramDIE() const {
return getTag() == DW_TAG_subprogram;
}
@@ -323,7 +283,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
getAttributeValueAsReference(U, DW_AT_specification, -1U);
if (spec_ref != -1U) {
DWARFDebugInfoEntryMinimal spec_die;
- if (spec_die.extract(U, &spec_ref)) {
+ if (spec_die.extractFast(U, &spec_ref)) {
if (const char *name = spec_die.getSubroutineName(U))
return name;
}
@@ -333,7 +293,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
if (abs_origin_ref != -1U) {
DWARFDebugInfoEntryMinimal abs_origin_die;
- if (abs_origin_die.extract(U, &abs_origin_ref)) {
+ if (abs_origin_die.extractFast(U, &abs_origin_ref)) {
if (const char *name = abs_origin_die.getSubroutineName(U))
return name;
}
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.h b/lib/DebugInfo/DWARFDebugInfoEntry.h
index 12479bfd3c5..aa61056332e 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.h
+++ b/lib/DebugInfo/DWARFDebugInfoEntry.h
@@ -50,12 +50,6 @@ public:
/// doesn't change OffsetPtr.
bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr);
- /// Extract a debug info entry for a given compile unit from the
- /// .debug_info and .debug_abbrev data starting at the given offset.
- /// If compile unit can't be parsed, returns false and doesn't change
- /// OffsetPtr.
- bool extract(const DWARFUnit *U, uint32_t *OffsetPtr);
-
uint32_t getTag() const { return AbbrevDecl ? AbbrevDecl->getTag() : 0; }
bool isNULL() const { return AbbrevDecl == 0; }