From 6faff4886a3059a8cda08f015d29a6c9a0a4de3c Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Mon, 28 Oct 2013 23:41:49 +0000 Subject: DWARF parser: Use ArrayRef to represent form sizes and simplify DWARFDIE::extractFast() interface. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193560 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/DWARFDebugInfoEntry.cpp | 13 +++++-------- lib/DebugInfo/DWARFDebugInfoEntry.h | 5 ++--- lib/DebugInfo/DWARFFormValue.cpp | 6 +++--- lib/DebugInfo/DWARFUnit.cpp | 5 +---- 4 files changed, 11 insertions(+), 18 deletions(-) (limited to 'lib/DebugInfo') diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 3383cee..39d8e3e 100644 --- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/lib/DebugInfo/DWARFDebugInfoEntry.cpp @@ -93,7 +93,6 @@ void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, } bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U, - const uint8_t *FixedFormSizes, uint32_t *OffsetPtr) { Offset = *OffsetPtr; DataExtractor DebugInfoData = U->getDebugInfoExtractor(); @@ -105,21 +104,19 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U, } AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); assert(AbbrevDecl); - assert(FixedFormSizes); // For best performance this should be specified! + ArrayRef FixedFormSizes = DWARFFormValue::getFixedFormSizes( + U->getAddressByteSize(), U->getVersion()); + assert(FixedFormSizes.size() > 0); // Skip all data in the .debug_info for the attributes for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) { uint16_t Form = AbbrevDecl->getFormByIndex(i); - // FIXME: Currently we're checking if this is less than the last - // entry in the fixed_form_sizes table, but this should be changed - // to use dynamic dispatch. uint8_t FixedFormSize = - (Form < DW_FORM_ref_sig8) ? FixedFormSizes[Form] : 0; + (Form < FixedFormSizes.size()) ? FixedFormSizes[Form] : 0; if (FixedFormSize) *OffsetPtr += FixedFormSize; - else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, - U)) { + else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) { // Restore the original offset. *OffsetPtr = Offset; return false; diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.h b/lib/DebugInfo/DWARFDebugInfoEntry.h index e073d87..12479bf 100644 --- a/lib/DebugInfo/DWARFDebugInfoEntry.h +++ b/lib/DebugInfo/DWARFDebugInfoEntry.h @@ -45,11 +45,10 @@ public: void dumpAttribute(raw_ostream &OS, const DWARFUnit *u, uint32_t *offset_ptr, uint16_t attr, uint16_t form, unsigned indent = 0) const; - /// Extracts a debug info entry, which is a child of a given compile unit, + /// Extracts a debug info entry, which is a child of a given unit, /// starting at a given offset. If DIE can't be extracted, returns false and /// doesn't change OffsetPtr. - bool extractFast(const DWARFUnit *U, const uint8_t *FixedFormSizes, - uint32_t *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. diff --git a/lib/DebugInfo/DWARFFormValue.cpp b/lib/DebugInfo/DWARFFormValue.cpp index 1a59dd8..b07f275 100644 --- a/lib/DebugInfo/DWARFFormValue.cpp +++ b/lib/DebugInfo/DWARFFormValue.cpp @@ -62,8 +62,8 @@ static uint8_t getRefAddrSize(uint8_t AddrSize, uint16_t Version) { return (Version == 2) ? AddrSize : 4; } -const uint8_t * -DWARFFormValue::getFixedFormSizes(uint8_t AddrSize, uint16_t Version) { +ArrayRef DWARFFormValue::getFixedFormSizes(uint8_t AddrSize, + uint16_t Version) { uint8_t RefAddrSize = getRefAddrSize(AddrSize, Version); if (AddrSize == 4 && RefAddrSize == 4) return FixedFormSizes<4, 4>::sizes; @@ -73,7 +73,7 @@ DWARFFormValue::getFixedFormSizes(uint8_t AddrSize, uint16_t Version) { return FixedFormSizes<8, 4>::sizes; if (AddrSize == 8 && RefAddrSize == 8) return FixedFormSizes<8, 8>::sizes; - return 0; + return None; } static const DWARFFormValue::FormClass DWARF4FormClasses[] = { diff --git a/lib/DebugInfo/DWARFUnit.cpp b/lib/DebugInfo/DWARFUnit.cpp index 25062cd..090d441 100644 --- a/lib/DebugInfo/DWARFUnit.cpp +++ b/lib/DebugInfo/DWARFUnit.cpp @@ -194,12 +194,9 @@ void DWARFUnit::extractDIEsToVector( uint32_t NextCUOffset = getNextUnitOffset(); DWARFDebugInfoEntryMinimal DIE; uint32_t Depth = 0; - const uint8_t *FixedFormSizes = - DWARFFormValue::getFixedFormSizes(getAddressByteSize(), getVersion()); bool IsCUDie = true; - while (Offset < NextCUOffset && - DIE.extractFast(this, FixedFormSizes, &Offset)) { + while (Offset < NextCUOffset && DIE.extractFast(this, &Offset)) { if (IsCUDie) { if (AppendCUDie) Dies.push_back(DIE); -- cgit v1.1