diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h index c9042e5932606..b60aef90871d7 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h @@ -222,8 +222,13 @@ class AppleAcceleratorTable : public DWARFAcceleratorTable { /// referenced by the name table and interpreted with the help of the /// abbreviation table. class DWARFDebugNames : public DWARFAcceleratorTable { - /// The fixed-size part of a DWARF v5 Name Index header - struct HeaderPOD { +public: + class NameIndex; + class NameIterator; + class ValueIterator; + + /// DWARF v5 Name Index header. + struct Header { uint32_t UnitLength; uint16_t Version; uint16_t Padding; @@ -234,15 +239,6 @@ class DWARFDebugNames : public DWARFAcceleratorTable { uint32_t NameCount; uint32_t AbbrevTableSize; uint32_t AugmentationStringSize; - }; - -public: - class NameIndex; - class NameIterator; - class ValueIterator; - - /// DWARF v5 Name Index header. - struct Header : public HeaderPOD { SmallString<8> AugmentationString; Error extract(const DWARFDataExtractor &AS, uint64_t *Offset); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp index 575edba51ee89..07760a8ec78f0 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp @@ -378,8 +378,20 @@ void DWARFDebugNames::Header::dump(ScopedPrinter &W) const { Error DWARFDebugNames::Header::extract(const DWARFDataExtractor &AS, uint64_t *Offset) { + // These fields are the same for 32-bit and 64-bit DWARF formats. + constexpr unsigned CommonHeaderSize = 2 + // Version + 2 + // Padding + 4 + // CU count + 4 + // Local TU count + 4 + // Foreign TU count + 4 + // Bucket count + 4 + // Name count + 4 + // Abbreviations table size + 4; // Augmentation string size + static const unsigned DWARF32HeaderFixedPartSize = + dwarf::getUnitLengthFieldByteSize(dwarf::DWARF32) + CommonHeaderSize; // Check that we can read the fixed-size part. - if (!AS.isValidOffset(*Offset + sizeof(HeaderPOD) - 1)) + if (!AS.isValidOffsetForDataOfSize(*Offset, DWARF32HeaderFixedPartSize)) return createStringError(errc::illegal_byte_sequence, "Section too small: cannot read header.");