Skip to content

Commit

Permalink
[MC][ELF] Do not error on parsing .debug_* section directive for MIPS
Browse files Browse the repository at this point in the history
MIPS .debug_* sections should have SHT_MIPS_DWARF section type to
distinguish among sections contain DWARF and ECOFF debug formats, but in
assembly files these sections have SHT_PROGBITS (@progbits) type. Now
assembler shows 'changed section type for ...' error when parsing
`.section .debug_*,"",@progbits` directive for MIPS targets.

The same problem exists for x86-64 target and this patch extends
workaround implemented in D76151. The patch adds one more case
when assembler ignores section types mismatch after `SwitchSection()`
call.

Differential Revision: https://reviews.llvm.org/D107707
  • Loading branch information
atanasyan committed Aug 9, 2021
1 parent fcf2d5f commit 990e802
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
23 changes: 19 additions & 4 deletions llvm/lib/MC/MCParser/ELFAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,23 @@ static bool hasPrefix(StringRef SectionName, StringRef Prefix) {
return SectionName.startswith(Prefix) || SectionName == Prefix.drop_back();
}

static bool allowSectionTypeMismatch(const Triple &TT, StringRef SectionName,
unsigned Type) {
if (TT.getArch() == Triple::x86_64) {
// x86-64 psABI names SHT_X86_64_UNWIND as the canonical type for .eh_frame,
// but GNU as emits SHT_PROGBITS .eh_frame for .cfi_* directives. Don't
// error for SHT_PROGBITS .eh_frame
return SectionName == ".eh_frame" && Type == ELF::SHT_PROGBITS;
}
if (TT.isMIPS()) {
// MIPS .debug_* sections should have SHT_MIPS_DWARF section type to
// distinguish among sections contain DWARF and ECOFF debug formats,
// but in assembly files these sections have SHT_PROGBITS type.
return hasPrefix(SectionName, ".debug_") && Type == ELF::SHT_PROGBITS;
}
return false;
}

bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
StringRef SectionName;

Expand Down Expand Up @@ -659,11 +676,9 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
getContext().getELFSection(SectionName, Type, Flags, Size, GroupName,
IsComdat, UniqueID, LinkedToSym);
getStreamer().SwitchSection(Section, Subsection);
// x86-64 psABI names SHT_X86_64_UNWIND as the canonical type for .eh_frame,
// but GNU as emits SHT_PROGBITS .eh_frame for .cfi_* directives. Don't error
// for SHT_PROGBITS .eh_frame
if (Section->getType() != Type &&
!(SectionName == ".eh_frame" && Type == ELF::SHT_PROGBITS))
!allowSectionTypeMismatch(getContext().getTargetTriple(), SectionName,
Type))
Error(loc, "changed section type for " + SectionName + ", expected: 0x" +
utohexstr(Section->getType()));
// Check that flags are used consistently. However, the GNU assembler permits
Expand Down
38 changes: 37 additions & 1 deletion llvm/test/MC/Mips/elf-debug-section.s
Original file line number Diff line number Diff line change
@@ -1,6 +1,42 @@
# RUN: llvm-mc -filetype=obj -triple=mips-linux-gnu -g %s -o - \
# RUN: | llvm-readobj -S - | FileCheck %s

# MIPS .debug_* sections should have SHT_MIPS_DWARF section type
# to distinguish among sections contain DWARF and ECOFF debug formats,
# but in assembly files these sections have SHT_PROGBITS type.

.section .debug_abbrev,"",@progbits
.section .debug_addr,"",@progbits
.section .debug_aranges,"",@progbits
.section .debug_info,"",@progbits
.section .debug_line,"",@progbits
.section .debug_loclists,"",@progbits
.section .debug_pubnames,"",@progbits
.section .debug_pubtypes,"",@progbits
.section .debug_ranges,"",@progbits
.section .debug_rnglists,"",@progbits
.section .debug_str,"MS",@progbits,1

# CHECK: Section {
# CHECK: Name: .debug_abbrev
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_addr
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_aranges
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_info
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_line
# CHECK-NEXT: Type: SHT_MIPS_DWARF (0x7000001E)
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_loclists
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_pubnames
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_pubtypes
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_ranges
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_rnglists
# CHECK-NEXT: Type: SHT_MIPS_DWARF
# CHECK: Name: .debug_str
# CHECK-NEXT: Type: SHT_MIPS_DWARF

0 comments on commit 990e802

Please sign in to comment.