From: Alexey Samsonov Date: Mon, 28 Oct 2013 23:58:58 +0000 (+0000) Subject: Merge DWARFDIE::extractFast and DWARFDIE::extract into one function. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=39f62fa3dd1f683288e67ba58bef785b2dcaa98c;p=oota-llvm.git 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 --- 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 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(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 BaseAddr = FormValue.getAsAddress(U); - if (BaseAddr.hasValue()) - const_cast(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; }