[PATCH] D107707: [MC][ELF] Do not error on parsing .debug_* section directive for MIPS

Simon Atanasyan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 7 22:30:08 PDT 2021


atanasyan created this revision.
atanasyan added reviewers: MaskRay, jhenderson, joerg.
Herald added subscribers: pengfei, jrtc27, hiraditya, arichardson, sdardis.
atanasyan requested review of this revision.
Herald added a project: LLVM.

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_*,"", at progbits` directive for MIPS targets.

The same problem exists for x86-64 target and this patch extends workaround implemented in D76151 <https://reviews.llvm.org/D76151>. The patch adds one more case when assembler ignore section types mismatch after `SwitchSection()` call.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D107707

Files:
  llvm/lib/MC/MCParser/ELFAsmParser.cpp
  llvm/test/MC/Mips/elf-debug-section.s


Index: llvm/test/MC/Mips/elf-debug-section.s
===================================================================
--- llvm/test/MC/Mips/elf-debug-section.s
+++ 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,"", at progbits
+.section        .debug_addr,"", at progbits
+.section        .debug_aranges,"", at progbits
+.section        .debug_info,"", at progbits
+.section        .debug_line,"", at progbits
+.section        .debug_loclists,"", at progbits
+.section        .debug_pubnames,"", at progbits
+.section        .debug_pubtypes,"", at progbits
+.section        .debug_ranges,"", at progbits
+.section        .debug_rnglists,"", at progbits
+.section        .debug_str,"MS", at 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
Index: llvm/lib/MC/MCParser/ELFAsmParser.cpp
===================================================================
--- llvm/lib/MC/MCParser/ELFAsmParser.cpp
+++ llvm/lib/MC/MCParser/ELFAsmParser.cpp
@@ -502,6 +502,25 @@
   return SectionName.startswith(Prefix) || SectionName == Prefix.drop_back();
 }
 
+static bool allowSectionTypeMismatch(const Triple &TT,
+                                     const MCSectionELF *Section,
+                                     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 Section->getName() == ".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 Section->getType() == ELF::SHT_MIPS_DWARF &&
+           Type == ELF::SHT_PROGBITS;
+  }
+  return false;
+}
+
 bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
   StringRef SectionName;
 
@@ -659,11 +678,8 @@
       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(), Section, Type))
     Error(loc, "changed section type for " + SectionName + ", expected: 0x" +
                    utohexstr(Section->getType()));
   // Check that flags are used consistently. However, the GNU assembler permits


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107707.365001.patch
Type: text/x-patch
Size: 3992 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210808/25e74239/attachment.bin>


More information about the llvm-commits mailing list