diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-10-28 23:58:58 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-10-28 23:58:58 +0000 |
commit | 330b8939bb6f4a37753974504ad24e1587761225 (patch) | |
tree | ae454a0152b5974271f18255e5410679892e5e50 /llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp | |
parent | 2873b38e6947ffe4ca434e2e318edf88ea082237 (diff) | |
download | bcm5719-llvm-330b8939bb6f4a37753974504ad24e1587761225.tar.gz bcm5719-llvm-330b8939bb6f4a37753974504ad24e1587761225.zip |
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.
llvm-svn: 193563
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp | 60 |
1 files changed, 10 insertions, 50 deletions
diff --git a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 39d8e3e9189..babfd2ece06 100644 --- a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/llvm/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; } |