diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 70d69fc8dd3218..fdaacb572f0621 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -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 @@ 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 diff --git a/llvm/test/MC/Mips/elf-debug-section.s b/llvm/test/MC/Mips/elf-debug-section.s index 237fef12703ca8..ad477df7dd663b 100644 --- a/llvm/test/MC/Mips/elf-debug-section.s +++ b/llvm/test/MC/Mips/elf-debug-section.s @@ -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