[llvm] r361683 - llvm-dwarfdump: Don't error on mixed units using/not using str_offsets
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri May 24 17:07:23 PDT 2019
Author: dblaikie
Date: Fri May 24 17:07:22 2019
New Revision: 361683
URL: http://llvm.org/viewvc/llvm-project?rev=361683&view=rev
Log:
llvm-dwarfdump: Don't error on mixed units using/not using str_offsets
This lead to errors when dumping binaries with v4 and v5 units linked
together (but could've also errored on v5 units that did/didn't use
str_offsets).
Also improves error handling and messages around invalid str_offsets
contributions.
Added:
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid.s
Removed:
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-1.s
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-2.s
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s
Modified:
llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s
llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets.s
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=361683&r1=361682&r2=361683&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Fri May 24 17:07:22 2019
@@ -175,6 +175,7 @@ struct StrOffsetsContributionDescriptor
StrOffsetsContributionDescriptor(uint64_t Base, uint64_t Size,
uint8_t Version, dwarf::DwarfFormat Format)
: Base(Base), Size(Size), FormParams({Version, 0, Format}) {}
+ StrOffsetsContributionDescriptor() = default;
uint8_t getVersion() const { return FormParams.Version; }
dwarf::DwarfFormat getFormat() const { return FormParams.Format; }
@@ -184,7 +185,7 @@ struct StrOffsetsContributionDescriptor
/// Determine whether a contribution to the string offsets table is
/// consistent with the relevant section size and that its length is
/// a multiple of the size of one of its entries.
- Optional<StrOffsetsContributionDescriptor>
+ Expected<StrOffsetsContributionDescriptor>
validateContributionSize(DWARFDataExtractor &DA);
};
@@ -249,14 +250,14 @@ protected:
/// Find the unit's contribution to the string offsets table and determine its
/// length and form. The given offset is expected to be derived from the unit
/// DIE's DW_AT_str_offsets_base attribute.
- Optional<StrOffsetsContributionDescriptor>
+ Expected<Optional<StrOffsetsContributionDescriptor>>
determineStringOffsetsTableContribution(DWARFDataExtractor &DA);
/// Find the unit's contribution to the string offsets table and determine its
/// length and form. The given offset is expected to be 0 in a dwo file or,
/// in a dwp file, the start of the unit's contribution to the string offsets
/// table section (as determined by the index table).
- Optional<StrOffsetsContributionDescriptor>
+ Expected<Optional<StrOffsetsContributionDescriptor>>
determineStringOffsetsTableContributionDWO(DWARFDataExtractor &DA);
public:
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=361683&r1=361682&r2=361683&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Fri May 24 17:07:22 2019
@@ -101,7 +101,8 @@ static ContributionCollection
collectContributionData(DWARFContext::unit_iterator_range Units) {
ContributionCollection Contributions;
for (const auto &U : Units)
- Contributions.push_back(U->getStringOffsetsTableContribution());
+ if (const auto &C = U->getStringOffsetsTableContribution())
+ Contributions.push_back(C);
// Sort the contributions so that any invalid ones are placed at
// the start of the contributions vector. This way they are reported
// first.
@@ -157,9 +158,9 @@ static void dumpDWARFv5StringOffsetsSect
// Detect overlapping contributions.
if (Offset > ContributionHeader) {
- OS << "error: overlapping contributions to string offsets table in "
- "section ."
- << SectionName << ".\n";
+ WithColor::error()
+ << "overlapping contributions to string offsets table in section ."
+ << SectionName << ".\n";
return;
}
// Report a gap in the table.
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=361683&r1=361682&r2=361683&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Fri May 24 17:07:22 2019
@@ -435,12 +435,17 @@ size_t DWARFUnit::extractDIEsIfNeeded(bo
// which may differ from the unit's format.
DWARFDataExtractor DA(Context.getDWARFObj(), StringOffsetSection,
isLittleEndian, 0);
- if (IsDWO)
- StringOffsetsTableContribution =
- determineStringOffsetsTableContributionDWO(DA);
- else if (getVersion() >= 5)
- StringOffsetsTableContribution =
- determineStringOffsetsTableContribution(DA);
+ if (IsDWO || getVersion() >= 5) {
+ auto StringOffsetOrError =
+ IsDWO ? determineStringOffsetsTableContributionDWO(DA)
+ : determineStringOffsetsTableContribution(DA);
+ if (!StringOffsetOrError) {
+ WithColor::error() << "invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: "
+ << toString(StringOffsetOrError.takeError()) << '\n';
+ } else {
+ StringOffsetsTableContribution = *StringOffsetOrError;
+ }
+ }
// DWARF v5 uses the .debug_rnglists and .debug_rnglists.dwo sections to
// describe address ranges.
@@ -758,7 +763,7 @@ llvm::Optional<object::SectionedAddress>
return BaseAddr;
}
-Optional<StrOffsetsContributionDescriptor>
+Expected<StrOffsetsContributionDescriptor>
StrOffsetsContributionDescriptor::validateContributionSize(
DWARFDataExtractor &DA) {
uint8_t EntrySize = getDwarfOffsetByteSize();
@@ -769,65 +774,94 @@ StrOffsetsContributionDescriptor::valida
if (ValidationSize >= Size)
if (DA.isValidOffsetForDataOfSize((uint32_t)Base, ValidationSize))
return *this;
- return None;
+ return createStringError(errc::invalid_argument, "length exceeds section size");
}
// Look for a DWARF64-formatted contribution to the string offsets table
// starting at a given offset and record it in a descriptor.
-static Optional<StrOffsetsContributionDescriptor>
+static Expected<StrOffsetsContributionDescriptor>
parseDWARF64StringOffsetsTableHeader(DWARFDataExtractor &DA, uint32_t Offset) {
if (!DA.isValidOffsetForDataOfSize(Offset, 16))
- return None;
+ return createStringError(errc::invalid_argument, "section offset exceeds section size");
if (DA.getU32(&Offset) != 0xffffffff)
- return None;
+ return createStringError(errc::invalid_argument, "32 bit contribution referenced from a 64 bit unit");
uint64_t Size = DA.getU64(&Offset);
uint8_t Version = DA.getU16(&Offset);
(void)DA.getU16(&Offset); // padding
// The encoded length includes the 2-byte version field and the 2-byte
// padding, so we need to subtract them out when we populate the descriptor.
- return {{Offset, Size - 4, Version, DWARF64}};
+ return StrOffsetsContributionDescriptor(Offset, Size - 4, Version, DWARF64);
}
// Look for a DWARF32-formatted contribution to the string offsets table
// starting at a given offset and record it in a descriptor.
-static Optional<StrOffsetsContributionDescriptor>
+static Expected<StrOffsetsContributionDescriptor>
parseDWARF32StringOffsetsTableHeader(DWARFDataExtractor &DA, uint32_t Offset) {
if (!DA.isValidOffsetForDataOfSize(Offset, 8))
- return None;
+ return createStringError(errc::invalid_argument, "section offset exceeds section size");
+
uint32_t ContributionSize = DA.getU32(&Offset);
if (ContributionSize >= 0xfffffff0)
- return None;
+ return createStringError(errc::invalid_argument, "invalid length");
+
uint8_t Version = DA.getU16(&Offset);
(void)DA.getU16(&Offset); // padding
// The encoded length includes the 2-byte version field and the 2-byte
// padding, so we need to subtract them out when we populate the descriptor.
- return {{Offset, ContributionSize - 4, Version, DWARF32}};
+ return StrOffsetsContributionDescriptor(Offset, ContributionSize - 4, Version,
+ DWARF32);
}
-Optional<StrOffsetsContributionDescriptor>
-DWARFUnit::determineStringOffsetsTableContribution(DWARFDataExtractor &DA) {
- auto Offset = toSectionOffset(getUnitDIE().find(DW_AT_str_offsets_base), 0);
- Optional<StrOffsetsContributionDescriptor> Descriptor;
- // Attempt to find a DWARF64 contribution 16 bytes before the base.
- switch (Header.getFormat()) {
- case dwarf::DwarfFormat::DWARF64:
+static Expected<StrOffsetsContributionDescriptor>
+parseDWARFStringOffsetsTableHeader(DWARFDataExtractor &DA,
+ llvm::dwarf::DwarfFormat Format,
+ uint64_t Offset) {
+ StrOffsetsContributionDescriptor Desc;
+ switch (Format) {
+ case dwarf::DwarfFormat::DWARF64: {
if (Offset < 16)
- return None;
- Descriptor =
- parseDWARF64StringOffsetsTableHeader(DA, (uint32_t)Offset - 16);
+ return createStringError(errc::invalid_argument, "insufficient space for 64 bit header prefix");
+ auto DescOrError = parseDWARF64StringOffsetsTableHeader(DA, (uint32_t)Offset - 16);
+ if (!DescOrError)
+ return DescOrError.takeError();
+ Desc = *DescOrError;
break;
- case dwarf::DwarfFormat::DWARF32:
+ }
+ case dwarf::DwarfFormat::DWARF32: {
if (Offset < 8)
- return None;
- Descriptor = parseDWARF32StringOffsetsTableHeader(DA, (uint32_t)Offset - 8);
+ return createStringError(errc::invalid_argument, "insufficient space for 32 bit header prefix");
+ auto DescOrError = parseDWARF32StringOffsetsTableHeader(DA, (uint32_t)Offset - 8);
+ if (!DescOrError)
+ return DescOrError.takeError();
+ Desc = *DescOrError;
break;
}
- return Descriptor ? Descriptor->validateContributionSize(DA) : Descriptor;
+ }
+ return Desc.validateContributionSize(DA);
}
-Optional<StrOffsetsContributionDescriptor>
+Expected<Optional<StrOffsetsContributionDescriptor>>
+DWARFUnit::determineStringOffsetsTableContribution(DWARFDataExtractor &DA) {
+ uint64_t Offset;
+ if (IsDWO) {
+ Offset = 0;
+ if (DA.getData().data() == nullptr)
+ return None;
+ } else {
+ auto OptOffset = toSectionOffset(getUnitDIE().find(DW_AT_str_offsets_base));
+ if (!OptOffset)
+ return None;
+ Offset = *OptOffset;
+ }
+ auto DescOrError = parseDWARFStringOffsetsTableHeader(DA, Header.getFormat(), Offset);
+ if (!DescOrError)
+ return DescOrError.takeError();
+ return *DescOrError;
+}
+
+Expected<Optional<StrOffsetsContributionDescriptor>>
DWARFUnit::determineStringOffsetsTableContributionDWO(DWARFDataExtractor & DA) {
uint64_t Offset = 0;
auto IndexEntry = Header.getIndexEntry();
@@ -836,19 +870,24 @@ DWARFUnit::determineStringOffsetsTableCo
if (C)
Offset = C->Offset;
if (getVersion() >= 5) {
+ if (DA.getData().data() == nullptr)
+ return None;
+ Offset += Header.getFormat() == dwarf::DwarfFormat::DWARF32 ? 8 : 16;
// Look for a valid contribution at the given offset.
- auto Descriptor =
- parseDWARF64StringOffsetsTableHeader(DA, (uint32_t)Offset);
- if (!Descriptor)
- Descriptor = parseDWARF32StringOffsetsTableHeader(DA, (uint32_t)Offset);
- return Descriptor ? Descriptor->validateContributionSize(DA) : Descriptor;
+ auto DescOrError = parseDWARFStringOffsetsTableHeader(DA, Header.getFormat(), Offset);
+ if (!DescOrError)
+ return DescOrError.takeError();
+ return *DescOrError;
}
// Prior to DWARF v5, we derive the contribution size from the
// index table (in a package file). In a .dwo file it is simply
// the length of the string offsets section.
if (!IndexEntry)
- return {{0, StringOffsetSection.Data.size(), 4, DWARF32}};
+ return {
+ Optional<StrOffsetsContributionDescriptor>(
+ {0, StringOffsetSection.Data.size(), 4, DWARF32})};
if (C)
- return {{C->Offset, C->Length, 4, DWARF32}};
+ return {Optional<StrOffsetsContributionDescriptor>(
+ {C->Offset, C->Length, 4, DWARF32})};
return None;
}
Removed: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-1.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-1.s?rev=361682&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-1.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-1.s (removed)
@@ -1,37 +0,0 @@
-# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
-# RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=INVALIDCONTRIB %s
-#
-# Test object to verify that llvm-dwarfdump handles an invalid string offsets
-# table.
-#
-# A rudimentary abbrev section.
- .section .debug_abbrev,"", at progbits
- .byte 0x01 # Abbrev code
- .byte 0x11 # DW_TAG_compile_unit
- .byte 0x00 # DW_CHILDREN_no
- .byte 0x00 # EOM(1)
- .byte 0x00 # EOM(2)
- .byte 0x00 # EOM(3)
-
-# A rudimentary compile unit to convince dwarfdump that we are dealing with a
-# DWARF v5 string offsets table.
- .section .debug_info,"", at progbits
-
-# DWARF v5 CU header.
- .long CU1_5_end-CU1_5_version # Length of Unit
-CU1_5_version:
- .short 5 # DWARF version number
- .byte 1 # DWARF Unit Type
- .byte 8 # Address Size (in bytes)
- .long .debug_abbrev # Offset Into Abbrev. Section
-# A compile-unit DIE, which has no attributes.
- .byte 1 # Abbreviation code
-CU1_5_end:
-
- .section .debug_str_offsets,"", at progbits
-# A degenerate section, not enough for a single contribution size.
- .byte 2
-
-# INVALIDCONTRIB: .debug_str_offsets contents:
-# INVALIDCONTRIB-NOT: contents:
-# INVALIDCONTRIB: error: invalid contribution to string offsets table in section .debug_str_offsets.
Removed: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-2.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-2.s?rev=361682&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-2.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-2.s (removed)
@@ -1,39 +0,0 @@
-# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
-# RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=INVALIDCONTRIB %s
-#
-# Test object to verify that llvm-dwarfdump handles an invalid string offsets
-# table.
-#
-# A rudimentary abbrev section.
- .section .debug_abbrev,"", at progbits
- .byte 0x01 # Abbrev code
- .byte 0x11 # DW_TAG_compile_unit
- .byte 0x00 # DW_CHILDREN_no
- .byte 0x00 # EOM(1)
- .byte 0x00 # EOM(2)
- .byte 0x00 # EOM(3)
-
-# A rudimentary compile unit to convince dwarfdump that we are dealing with a
-# DWARF v5 string offsets table.
- .section .debug_info,"", at progbits
-
-# DWARF v5 CU header.
- .long CU1_5_end-CU1_5_version # Length of Unit
-CU1_5_version:
- .short 5 # DWARF version number
- .byte 1 # DWARF Unit Type
- .byte 8 # Address Size (in bytes)
- .long .debug_abbrev # Offset Into Abbrev. Section
-# A compile-unit DIE, which has no attributes.
- .byte 1 # Abbreviation code
-CU1_5_end:
-
- .section .debug_str_offsets,"", at progbits
-# A degenerate section with fewer bytes than required for a DWARF64 size.
- .long 0xffffffff
- .long 0
- .short 4
-
-# INVALIDCONTRIB: .debug_str_offsets contents:
-# INVALIDCONTRIB-NOT: contents:
-# INVALIDCONTRIB: error: invalid contribution to string offsets table in section .debug_str_offsets.
Removed: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s?rev=361682&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s (removed)
@@ -1,93 +0,0 @@
-# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
-# RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=INVALIDCONTRIB %s
-#
-# Test object to verify that llvm-dwarfdump handles an invalid string offsets
-# table.
-
- .section .debug_str,"MS", at progbits,1
-str_producer:
- .asciz "Handmade DWARF producer"
-str_CU1:
- .asciz "Compile_Unit_1"
-str_CU1_dir:
- .asciz "/home/test/CU1"
-str_CU2:
- .asciz "Compile_Unit_2"
-str_CU2_dir:
- .asciz "/home/test/CU2"
-str_TU:
- .asciz "Type_Unit"
-str_TU_type:
- .asciz "MyStruct"
-
- .section .debug_str.dwo,"MS", at progbits,1
-dwo_str_CU_5_producer:
- .asciz "Handmade split DWARF producer"
-dwo_str_CU_5_name:
- .asciz "V5_split_compile_unit"
-dwo_str_CU_5_comp_dir:
- .asciz "/home/test/splitCU"
-dwo_str_TU_5:
- .asciz "V5_split_type_unit"
-dwo_str_TU_5_type:
- .asciz "V5_split_Mystruct"
-
-# A rudimentary abbrev section.
- .section .debug_abbrev,"", at progbits
- .byte 0x01 # Abbrev code
- .byte 0x11 # DW_TAG_compile_unit
- .byte 0x00 # DW_CHILDREN_no
- .byte 0x72 # DW_AT_str_offsets_base
- .byte 0x17 # DW_FORM_sec_offset
- .byte 0x00 # EOM(1)
- .byte 0x00 # EOM(2)
- .byte 0x00 # EOM(3)
-
-# A rudimentary compile unit to convince dwarfdump that we are dealing with a
-# DWARF v5 string offsets table.
- .section .debug_info,"", at progbits
-
-# DWARF v5 CU header.
- .long CU1_5_end-CU1_5_version # Length of Unit
-CU1_5_version:
- .short 5 # DWARF version number
- .byte 1 # DWARF Unit Type
- .byte 8 # Address Size (in bytes)
- .long .debug_abbrev # Offset Into Abbrev. Section
-# A compile-unit DIE, which has no attributes.
- .byte 1 # Abbreviation code
- .long .debug_str_offsets_base0
-CU1_5_end:
-
- .section .debug_str_offsets,"", at progbits
-# CU1's contribution
-# Invalid length
- .long 0xfffffffe
- .short 5 # DWARF version
- .short 0 # Padding
-.debug_str_offsets_base0:
- .long str_producer
- .long str_CU1
- .long str_CU1_dir
-.debug_str_offsets_segment0_end:
-# CU2's contribution
- .long .debug_str_offsets_segment1_end-.debug_str_offsets_base1+4
- .short 5 # DWARF version
- .short 0 # Padding
-.debug_str_offsets_base1:
- .long str_producer
- .long str_CU2
- .long str_CU2_dir
-.debug_str_offsets_segment1_end:
-# The TU's contribution
- .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2+4
- .short 5 # DWARF version
- .short 0 # Padding
-.debug_str_offsets_base2:
- .long str_TU
- .long str_TU_type
-.debug_str_offsets_segment2_end:
-
-# INVALIDCONTRIB: .debug_str_offsets contents:
-# INVALIDCONTRIB-NOT: contents:
-# INVALIDCONTRIB: error: invalid contribution to string offsets table in section .debug_str_offsets.
Removed: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s?rev=361682&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s (removed)
@@ -1,56 +0,0 @@
-# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
-# RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=INVALIDLENGTH %s
-#
-# Test object to verify that llvm-dwarfdump handles an invalid string offsets
-# table.
-
- .section .debug_str,"MS", at progbits,1
-str_producer:
- .asciz "Handmade DWARF producer"
-str_CU1:
- .asciz "Compile_Unit_1"
-
-# A rudimentary abbrev section.
- .section .debug_abbrev,"", at progbits
- .byte 0x01 # Abbrev code
- .byte 0x11 # DW_TAG_compile_unit
- .byte 0x00 # DW_CHILDREN_no
- .byte 0x72 # DW_AT_str_offsets_base
- .byte 0x17 # DW_FORM_sec_offset
- .byte 0x00 # EOM(1)
- .byte 0x00 # EOM(2)
- .byte 0x00 # EOM(3)
-
-# A rudimentary compile unit to convince dwarfdump that we are dealing with a
-# DWARF v5 string offsets table.
- .section .debug_info,"", at progbits
-
-# DWARF v5 CU header.
- .long CU1_5_end-CU1_5_version # Length of Unit
-CU1_5_version:
- .short 5 # DWARF version number
- .byte 1 # DWARF Unit Type
- .byte 8 # Address Size (in bytes)
- .long .debug_abbrev # Offset Into Abbrev. Section
-# A compile-unit DIE, which has no attributes.
- .byte 1 # Abbreviation code
- .long .debug_str_offsets_base0
-CU1_5_end:
-
-# Every unit contributes to the string_offsets table.
- .section .debug_str_offsets,"", at progbits
-# CU1's contribution
-# The length is not a multiple of 4. Check that we don't read off the
-# end.
- .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0+4
- .short 5 # DWARF version
- .short 0 # Padding
-.debug_str_offsets_base0:
- .long str_producer
- .long str_CU1
- .byte 0
-.debug_str_offsets_segment0_end:
-
-# INVALIDLENGTH: .debug_str_offsets contents:
-# INVALIDLENGTH-NOT: contents:
-# INVALIDLENGTH: error: invalid contribution to string offsets table in section .debug_str_offsets.
Modified: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s?rev=361683&r1=361682&r2=361683&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s Fri May 24 17:07:22 2019
@@ -1,5 +1,5 @@
# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
-# RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=OVERLAP %s
+# RUN: llvm-dwarfdump -v %t.o 2>&1 | FileCheck --check-prefix=OVERLAP %s
#
# Test object to verify that llvm-dwarfdump handles an invalid string offsets
# table with overlapping contributions.
@@ -89,6 +89,4 @@ CU2_5_end:
.long str_CU2_dir
.debug_str_offsets_segment1_end:
-# OVERLAP: .debug_str_offsets contents:
-# OVERLAP-NOT: contents:
# OVERLAP: error: overlapping contributions to string offsets table in section .debug_str_offsets.
Added: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid.s?rev=361683&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid.s (added)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets-invalid.s Fri May 24 17:07:22 2019
@@ -0,0 +1,154 @@
+# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
+# RUN: llvm-dwarfdump -v %t.o 2>&1 | FileCheck %s
+#
+# Test object to verify that llvm-dwarfdump handles an invalid string offsets
+# table.
+#
+# A rudimentary abbrev section.
+ .section .debug_abbrev,"", at progbits
+ .byte 0x01 # Abbrev code
+ .byte 0x11 # DW_TAG_compile_unit
+ .byte 0x00 # DW_CHILDREN_no
+ .byte 0x72 # DW_AT_str_offsets_base
+ .byte 0x17 # DW_FORM_sec_offset
+ .byte 0x00 # EOM(1)
+ .byte 0x00 # EOM(2)
+ .byte 0x00 # EOM(3)
+
+# A rudimentary compile unit to convince dwarfdump that we are dealing with a
+# DWARF v5 string offsets table.
+ .section .debug_info,"", at progbits
+
+# DWARF v5 32 bit CU header.
+ .long CU1_end-CU1_begin # Length of Unit
+CU1_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .long 0 # DW_AT_str_offsets_base
+CU1_end:
+
+# DWARF v5 64 bit CU header.
+ .long 0xffffffff
+ .quad CU2_end-CU2_begin # Length of Unit
+CU2_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .quad .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .quad 0 # DW_AT_str_offsets_base
+CU2_end:
+ .long CU3_end-CU3_begin # Length of Unit
+CU3_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .quad .str_off0 # DW_AT_str_offsets_base
+CU3_end:
+ .long CU4_end-CU4_begin # Length of Unit
+CU4_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .quad .str_off1 # DW_AT_str_offsets_base
+CU4_end:
+ .long CU5_end-CU5_begin # Length of Unit
+CU5_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .long .str_off2_begin # DW_AT_str_offsets_base
+CU5_end:
+ .long CU6_end-CU6_begin # Length of Unit
+CU6_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .long .str_off3_begin # DW_AT_str_offsets_base
+CU6_end:
+ .long 0xffffffff
+ .quad CU7_end-CU7_begin # Length of Unit
+CU7_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .quad .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .quad .str_off4_begin # DW_AT_str_offsets_base
+CU7_end:
+ .long CU8_end-CU8_begin # Length of Unit
+CU8_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .long .str_off_end+16 # DW_AT_str_offsets_base
+CU8_end:
+ .long 0xffffffff
+ .quad CU9_end-CU9_begin # Length of Unit
+CU9_begin:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .quad .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbreviation code: DW_TAG_compile_unit
+ .quad .str_off_end+8 # DW_AT_str_offsets_base
+CU9_end:
+
+ .section .debug_str_offsets,"", at progbits
+# Invalid length
+ .long 0xfffffff4
+ .short 5 # DWARF version
+ .short 0 # Padding
+.str_off0:
+ .long 0
+# Length beyond section bounds
+ .long .str_off_end-.str_off1+8
+ .short 5 # DWARF version
+ .short 0 # Padding
+.str_off1:
+ .long 0
+# Length intrudes on following unit
+ .long .str_off2_end-.str_off2_begin+8
+ .short 5 # DWARF version
+ .short 0 # Padding
+.str_off2_begin:
+ .long 0
+.str_off2_end:
+# Plain contribution, no errors here
+ .long .str_off3_end-.str_off3_begin
+ .short 5 # DWARF version
+ .short 0 # Padding
+.str_off3_begin:
+ .long 0
+.str_off3_end:
+# 32 bit contribution referenced from a 64 bit unit
+ .long .str_off4_end-.str_off4_begin
+ .short 5 # DWARF version
+ .short 0 # Padding
+.str_off4_begin:
+ .long 0
+.str_off4_end:
+.str_off_end:
+
+
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: insufficient space for 32 bit header prefix
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: insufficient space for 64 bit header prefix
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: invalid length
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: length exceeds section size
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: 32 bit contribution referenced from a 64 bit unit
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: section offset exceeds section size
+# CHECK: error: invalid contribution to string offsets table in section .debug_str_offsets[.dwo]: section offset exceeds section size
+# CHECK: error: overlapping contributions to string offsets table in section .debug_str_offsets.
Modified: llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets.s?rev=361683&r1=361682&r2=361683&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets.s (original)
+++ llvm/trunk/test/DebugInfo/X86/dwarfdump-str-offsets.s Fri May 24 17:07:22 2019
@@ -166,6 +166,11 @@ dwo_str_TU_5_type:
.byte 0x0b # DW_FORM_data1
.byte 0x00 # EOM(1)
.byte 0x00 # EOM(2)
+ .byte 0x09 # Abbrev code
+ .byte 0x11 # DW_TAG_compile_unit
+ .byte 0x00 # DW_CHILDREN_no
+ .byte 0x00 # EOM(1)
+ .byte 0x00 # EOM(2)
.byte 0x00 # EOM(3)
# And a .dwo copy of a subset for the .dwo sections.
@@ -255,6 +260,22 @@ CU2_5_version:
.byte 2 # The index of the comp dir string
.byte 0 # NULL
CU2_5_end:
+# DWARF v5 CU without str_offsets_base - this shouldn't produce an error/nor
+# prevent other str_offsets contributions from being dumped.
+ .long CU3_5_end-CU3_5_version # Length of Unit
+CU3_5_version:
+ .short 5 # DWARF version number
+ .byte 1 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+# The compile-unit DIE with no attributes.
+ .byte 9 # Abbreviation code
+CU3_5_end:
+
+
+
+
+
.section .debug_types,"", at progbits
# DWARF v5 Type unit header.
More information about the llvm-commits
mailing list