summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-11-30 14:33:48 +0000
committerFangrui Song <i@maskray.me>2021-12-14 17:32:35 -0800
commit5932c004778cf251302db0d46d1dfb247325ed3f (patch)
treeabc4c7f5ab07db0d7a00954e2d3591feacce6457
parent29276490d13c9368b556d109353b6091404a37a2 (diff)
downloadllvm-5932c004778cf251302db0d46d1dfb247325ed3f.tar.gz
[MC][ELF] Fix accepting abbreviated form with Type change
Follow up to D92052 and D94072, exposed due to D107707 Many assemblers to permit that only the first .section contains all the attributes like '.lds_bss,"w",@nobits' and later section only use the name ('.lds_bss') inheriting those attributes from the first section. I turned out that the case that Type changed was missed when implementing it - and D107707 make it much more likely to hit that issue. That's fixed by this commit. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D114717 (cherry picked from commit c01c62c76c60a5a5da0496e41faae907944c92dd)
-rw-r--r--llvm/lib/MC/MCParser/ELFAsmParser.cpp8
-rw-r--r--llvm/test/MC/ELF/section-omitted-attributes.s5
2 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
index fdaacb572f06..6a9a174a1b6a 100644
--- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
@@ -676,14 +676,14 @@ EndStmt:
getContext().getELFSection(SectionName, Type, Flags, Size, GroupName,
IsComdat, UniqueID, LinkedToSym);
getStreamer().SwitchSection(Section, Subsection);
- if (Section->getType() != Type &&
+ // 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 (!TypeName.empty() && Section->getType() != Type &&
!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
- // to leave out in subsequent uses of the same sections; for compatibility,
- // do likewise.
if ((extraFlags || Size || !TypeName.empty()) && Section->getFlags() != Flags)
Error(loc, "changed section flags for " + SectionName + ", expected: 0x" +
utohexstr(Section->getFlags()));
diff --git a/llvm/test/MC/ELF/section-omitted-attributes.s b/llvm/test/MC/ELF/section-omitted-attributes.s
index 5f89cdabd84f..108ecd0b3401 100644
--- a/llvm/test/MC/ELF/section-omitted-attributes.s
+++ b/llvm/test/MC/ELF/section-omitted-attributes.s
@@ -4,6 +4,7 @@
# CHECK: .section .foo,"aM",@progbits,1
# CHECK: .section .rodata.cst8,"aM",@progbits,8
+# CHECK: .section .lds_bss,"w",@nobits
.section .foo,"aM",@progbits,1
@@ -15,3 +16,7 @@
.section .rodata.cst8,"aM",@progbits,8
.section .rodata.cst8
+
+# Likewise for Type changes
+.section .lds_bss,"w",@nobits
+.section .lds_bss