Author: Tobias Burnus Date: 2020-12-11T16:45:45Z New Revision: 1deff4009e0ae661b03682901bf6932297ce7ea1
URL: https://github.com/llvm/llvm-project/commit/1deff4009e0ae661b03682901bf6932297ce7ea1 DIFF: https://github.com/llvm/llvm-project/commit/1deff4009e0ae661b03682901bf6932297ce7ea1.diff LOG: [MC][ELF] Accept abbreviated form with sh_flags and sh_entsize D73999 / commit 75af9da755721123e62b45cd0bc0c5e688a9722a added for LLVM 11 a check that sh_flags and sh_entsize (and sh_type) changes are an error, in line with GNU assembler. However, GNU assembler accepts and GCC generates an abbreviated form: while the first .section contains the flags and entsize, subsequent sections simply contain the name without repeating entsize or flags. Do likewise for better compatibility. See https://bugs.llvm.org/show_bug.cgi?id=48201 Reviewed By: jhenderson, MaskRay Differential Revision: https://reviews.llvm.org/D92052 Added: llvm/test/MC/ELF/section-omitted-attributes.s Modified: llvm/lib/MC/MCParser/ELFAsmParser.cpp llvm/test/MC/ELF/section-flags-changed.s Removed: ################################################################################ diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 78fee5ad87a3..65ac1d6b5ba0 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -652,10 +652,13 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) { !(SectionName == ".eh_frame" && Type == ELF::SHT_PROGBITS)) Error(loc, "changed section type for " + SectionName + ", expected: 0x" + utohexstr(Section->getType())); - if (Section->getFlags() != Flags) + // Check that flags are used consistently. However, the GNU assembler permits + // to leave out in subsequent uses of the same sections; for compatibility, + // do likewise. + if ((Flags || Size || !TypeName.empty()) && Section->getFlags() != Flags) Error(loc, "changed section flags for " + SectionName + ", expected: 0x" + utohexstr(Section->getFlags())); - if (Section->getEntrySize() != Size) + if ((Flags || Size || !TypeName.empty()) && Section->getEntrySize() != Size) Error(loc, "changed section entsize for " + SectionName + ", expected: " + Twine(Section->getEntrySize())); diff --git a/llvm/test/MC/ELF/section-flags-changed.s b/llvm/test/MC/ELF/section-flags-changed.s index 65f52cc29a6d..d2964ef046d1 100644 --- a/llvm/test/MC/ELF/section-flags-changed.s +++ b/llvm/test/MC/ELF/section-flags-changed.s @@ -9,4 +9,7 @@ foo: # CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section flags for .foo, expected: 0x6 .pushsection .foo,"a",@progbits +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section flags for .foo, expected: 0x6 +.section .foo,"",@progbits + .pushsection .foo,"ax",@progbits diff --git a/llvm/test/MC/ELF/section-omitted-attributes.s b/llvm/test/MC/ELF/section-omitted-attributes.s new file mode 100644 index 000000000000..72b7c9121387 --- /dev/null +++ b/llvm/test/MC/ELF/section-omitted-attributes.s @@ -0,0 +1,11 @@ +# RUN: llvm-mc -triple=x86_64 %s -o - | FileCheck %s + +# If section flags and other attributes are omitted, don't error. + +# CHECK: .section .foo,"aM",@progbits,1 + +.section .foo,"aM",@progbits,1 + +.section .foo + +.pushsection .foo _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits