diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h @@ -106,6 +106,7 @@ Header Hdr; HeaderData HdrData; dwarf::FormParams FormParams; + uint32_t HashDataEntryLength; bool IsValid = false; /// Returns true if we should continue scanning for entries or false if we've @@ -261,6 +262,9 @@ uint32_t getSizeHdr() const; uint32_t getHeaderDataLength() const; + /// Returns the size of one HashData entry. + uint32_t getHashDataEntryLength() const { return HashDataEntryLength; } + /// Return the Atom description, which can be used to interpret the raw values /// of the Accelerator Entries in this table. ArrayRef> getAtomsDesc(); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp @@ -66,10 +66,23 @@ HdrData.DIEOffsetBase = AccelSection.getU32(&Offset); uint32_t NumAtoms = AccelSection.getU32(&Offset); + HashDataEntryLength = 0; + auto MakeUnsupportedFormError = [](dwarf::Form Form) { + return createStringError(errc::not_supported, + "Unsupported form:" + + dwarf::FormEncodingString(Form)); + }; + for (unsigned i = 0; i < NumAtoms; ++i) { uint16_t AtomType = AccelSection.getU16(&Offset); auto AtomForm = static_cast(AccelSection.getU16(&Offset)); HdrData.Atoms.push_back(std::make_pair(AtomType, AtomForm)); + + std::optional FormSize = + dwarf::getFixedFormByteSize(AtomForm, FormParams); + if (!FormSize) + return MakeUnsupportedFormError(AtomForm); + HashDataEntryLength += *FormSize; } IsValid = true; @@ -207,6 +220,7 @@ W.printNumber("DIE offset base", HdrData.DIEOffsetBase); W.printNumber("Number of atoms", uint64_t(HdrData.Atoms.size())); + W.printNumber("Size of each hash data entry", getHashDataEntryLength()); SmallVector AtomForms; { ListScope AtomsScope(W, "Atoms"); diff --git a/llvm/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test b/llvm/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test --- a/llvm/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test +++ b/llvm/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test @@ -193,6 +193,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -286,6 +287,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 4 +CHECK-NEXT: Size of each hash data entry: 11 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -342,6 +344,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -363,6 +366,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset diff --git a/llvm/test/tools/dsymutil/X86/basic-lto-linking-x86.test b/llvm/test/tools/dsymutil/X86/basic-lto-linking-x86.test --- a/llvm/test/tools/dsymutil/X86/basic-lto-linking-x86.test +++ b/llvm/test/tools/dsymutil/X86/basic-lto-linking-x86.test @@ -192,6 +192,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -285,6 +286,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 4 +CHECK-NEXT: Size of each hash data entry: 11 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -341,6 +343,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset @@ -362,6 +365,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset diff --git a/llvm/test/tools/dsymutil/X86/objc.test b/llvm/test/tools/dsymutil/X86/objc.test --- a/llvm/test/tools/dsymutil/X86/objc.test +++ b/llvm/test/tools/dsymutil/X86/objc.test @@ -21,6 +21,7 @@ CHECK-NEXT: } CHECK-NEXT: DIE offset base: 0 CHECK-NEXT: Number of atoms: 1 +CHECK-NEXT: Size of each hash data entry: 4 CHECK-NEXT: Atoms [ CHECK-NEXT: Atom 0 { CHECK-NEXT: Type: DW_ATOM_die_offset diff --git a/llvm/test/tools/llvm-dwarfdump/X86/apple_names_verify_form.s b/llvm/test/tools/llvm-dwarfdump/X86/apple_names_verify_form.s --- a/llvm/test/tools/llvm-dwarfdump/X86/apple_names_verify_form.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/apple_names_verify_form.s @@ -3,7 +3,7 @@ # RUN: | FileCheck %s # CHECK: Verifying .apple_names... -# CHECK-NEXT: error: Unsupported form: failed to read HashData. +# CHECK-NEXT: error: Unsupported form: # This test is meant to verify that the -verify option # in llvm-dwarfdump, correctly identifies that Atom[0].form is unsupported. @@ -34,7 +34,7 @@ .long 0 ## HeaderData Die Offset Base .long 1 ## HeaderData Atom Count .short 1 ## DW_ATOM_die_offset - .short 400 ## DW_FORM_data4 -- error: unsupported form; failed to read HashData. + .short 400 ## not a valid form -- error: unsupported form; failed to read HashData. .long 0 ## Bucket 0 .long 1 ## Bucket 1 .long 177678 ## Hash in Bucket 0