summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2021-08-08 08:09:59 +0300
committerFangrui Song <i@maskray.me>2021-12-14 17:32:32 -0800
commit29276490d13c9368b556d109353b6091404a37a2 (patch)
treed164c54f3193c856572fb6a20ca363ef1d3b0f5b
parent724ed207b76055d80264aa98b3da8566ef60d321 (diff)
downloadllvm-29276490d13c9368b556d109353b6091404a37a2.tar.gz
[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)
-rw-r--r--llvm/lib/MC/MCParser/ELFAsmParser.cpp23
-rw-r--r--llvm/test/MC/Mips/elf-debug-section.s38
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