forked from OSchip/llvm-project
[MC][ELF] Do not error on parsing .debug_* section directive for MIPS
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
This commit is contained in:
parent
fcf2d5f402
commit
990e8025b5
|
@ -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;
|
||||
|
||||
|
@ -659,11 +676,9 @@ EndStmt:
|
|||
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue