From 29276490d13c9368b556d109353b6091404a37a2 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Sun, 8 Aug 2021 08:09:59 +0300 Subject: [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 (cherry picked from commit 990e8025b5fcac42da6e7ce082cd9bf81b4fbbf7) --- llvm/lib/MC/MCParser/ELFAsmParser.cpp | 23 +++++++++++++++++---- llvm/test/MC/Mips/elf-debug-section.s | 38 ++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 70d69fc8dd32..fdaacb572f06 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 @@ 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 diff --git a/llvm/test/MC/Mips/elf-debug-section.s b/llvm/test/MC/Mips/elf-debug-section.s index 237fef12703c..ad477df7dd66 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 -- cgit v1.2.1