diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-09-15 19:24:16 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-09-15 19:24:16 +0000 |
commit | bcd9b3b6b119420edffd259e5e05c5e0cf5fbc6c (patch) | |
tree | 5de006af58c633678a74ce991c06bfe975f6761f | |
parent | c29a720b362790746ca899a0b44fa35a1b399a42 (diff) | |
download | external_llvm-bcd9b3b6b119420edffd259e5e05c5e0cf5fbc6c.zip external_llvm-bcd9b3b6b119420edffd259e5e05c5e0cf5fbc6c.tar.gz external_llvm-bcd9b3b6b119420edffd259e5e05c5e0cf5fbc6c.tar.bz2 |
MC: Add support for '?' flags in .section directives
Summary:
The '?' flag uses the last section group if the last had a section
group. We treat combining an explicit section group and the '?' as a
hard error.
This fixes PR17198.
Reviewers: rafael, bkramer
Reviewed By: bkramer
CC: llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1686
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190768 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/MC/MCParser/ELFAsmParser.cpp | 22 | ||||
-rw-r--r-- | test/MC/ELF/comdat.s | 2 |
2 files changed, 21 insertions, 3 deletions
diff --git a/lib/MC/MCParser/ELFAsmParser.cpp b/lib/MC/MCParser/ELFAsmParser.cpp index 964f915..67b0e5d 100644 --- a/lib/MC/MCParser/ELFAsmParser.cpp +++ b/lib/MC/MCParser/ELFAsmParser.cpp @@ -16,6 +16,7 @@ #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/Support/ELF.h" using namespace llvm; @@ -278,7 +279,7 @@ static SectionKind computeSectionKind(unsigned Flags) { return SectionKind::getDataRel(); } -static int parseSectionFlags(StringRef flagsStr) { +static int parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) { int flags = 0; for (unsigned i = 0; i < flagsStr.size(); i++) { @@ -310,6 +311,9 @@ static int parseSectionFlags(StringRef flagsStr) { case 'G': flags |= ELF::SHF_GROUP; break; + case '?': + *UseLastGroup = true; + break; default: return -1; } @@ -351,6 +355,7 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush) { StringRef GroupName; unsigned Flags = 0; const MCExpr *Subsection = 0; + bool UseLastGroup = false; // Set the defaults first. if (SectionName == ".fini" || SectionName == ".init" || @@ -376,13 +381,16 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush) { StringRef FlagsStr = getTok().getStringContents(); Lex(); - int extraFlags = parseSectionFlags(FlagsStr); + int extraFlags = parseSectionFlags(FlagsStr, &UseLastGroup); if (extraFlags < 0) return TokError("unknown flag"); Flags |= extraFlags; bool Mergeable = Flags & ELF::SHF_MERGE; bool Group = Flags & ELF::SHF_GROUP; + if (Group && UseLastGroup) + return TokError("Section cannot specifiy a group name while also acting " + "as a member of the last group"); if (getLexer().isNot(AsmToken::Comma)) { if (Mergeable) @@ -460,6 +468,16 @@ EndStmt: return TokError("unknown section type"); } + if (UseLastGroup) { + MCSectionSubPair CurrentSection = getStreamer().getCurrentSection(); + if (const MCSectionELF *Section = + cast_or_null<MCSectionELF>(CurrentSection.first)) + if (const MCSymbol *Group = Section->getGroup()) { + GroupName = Group->getName(); + Flags |= ELF::SHF_GROUP; + } + } + SectionKind Kind = computeSectionKind(Flags); getStreamer().SwitchSection(getContext().getELFSection(SectionName, Type, Flags, Kind, Size, diff --git a/test/MC/ELF/comdat.s b/test/MC/ELF/comdat.s index 6dbe583..3e4a001 100644 --- a/test/MC/ELF/comdat.s +++ b/test/MC/ELF/comdat.s @@ -82,7 +82,7 @@ g1: nop - .section .bar,"axG",@progbits,g1,comdat + .section .bar,"ax?",@progbits nop .section .zed,"axG",@progbits,g2,comdat |