summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-02-09 14:59:20 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-02-09 14:59:20 +0000
commitdc1c3011fd2dfb75f6a1f4f20fa73344956a54a4 (patch)
tree468a5687f782aa72ed347cc62bc2ed5f6cc9b437 /llvm/lib/MC
parent6953b324750de9978e7c9d1d50c269a12fb38cc1 (diff)
downloadbcm5719-llvm-dc1c3011fd2dfb75f6a1f4f20fa73344956a54a4.tar.gz
bcm5719-llvm-dc1c3011fd2dfb75f6a1f4f20fa73344956a54a4.zip
Make it possible to set SHF_LINK_ORDER explicitly.
This will make it possible to add support for gcing user metadata (asan for example). llvm-svn: 294589
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp3
-rw-r--r--llvm/lib/MC/MCContext.cpp5
-rw-r--r--llvm/lib/MC/MCParser/ELFAsmParser.cpp27
3 files changed, 29 insertions, 6 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index e9f4f1cce33..3d1a16c904c 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -1157,8 +1157,7 @@ void ELFObjectWriter::writeSection(const SectionIndexMapTy &SectionIndexMap,
break;
}
- if (TargetObjectWriter->getEMachine() == ELF::EM_ARM &&
- Section.getType() == ELF::SHT_ARM_EXIDX)
+ if (Section.getFlags() & ELF::SHF_LINK_ORDER)
sh_link = SectionIndexMap.lookup(Section.getAssociatedSection());
WriteSecHdrEntry(StrTabBuilder.getOffset(Section.getSectionName()),
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index 2bfd8e55cad..19aa73efc21 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -358,13 +358,14 @@ MCSectionELF *MCContext::getELFNamedSection(const Twine &Prefix,
MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,
unsigned Flags, unsigned EntrySize,
- const Twine &Group, unsigned UniqueID) {
+ const Twine &Group, unsigned UniqueID,
+ const MCSectionELF *Associated) {
MCSymbolELF *GroupSym = nullptr;
if (!Group.isTriviallyEmpty() && !Group.str().empty())
GroupSym = cast<MCSymbolELF>(getOrCreateSymbol(Group));
return getELFSection(Section, Type, Flags, EntrySize, GroupSym, UniqueID,
- nullptr);
+ Associated);
}
MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,
diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
index 3bee12f6824..b9426566b5c 100644
--- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
@@ -157,6 +157,7 @@ private:
bool maybeParseSectionType(StringRef &TypeName);
bool parseMergeSize(int64_t &Size);
bool parseGroup(StringRef &GroupName);
+ bool parseMetadataSym(MCSectionELF *&Associated);
bool maybeParseUniqueID(int64_t &UniqueID);
};
@@ -297,6 +298,9 @@ static unsigned parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) {
case 'w':
flags |= ELF::SHF_WRITE;
break;
+ case 'm':
+ flags |= ELF::SHF_LINK_ORDER;
+ break;
case 'M':
flags |= ELF::SHF_MERGE;
break;
@@ -425,6 +429,21 @@ bool ELFAsmParser::parseGroup(StringRef &GroupName) {
return false;
}
+bool ELFAsmParser::parseMetadataSym(MCSectionELF *&Associated) {
+ MCAsmLexer &L = getLexer();
+ if (L.isNot(AsmToken::Comma))
+ return TokError("expected metadata symbol");
+ Lex();
+ StringRef Name;
+ if (getParser().parseIdentifier(Name))
+ return true;
+ MCSymbol *Sym = getContext().lookupSymbol(Name);
+ if (!Sym || !Sym->isInSection())
+ return TokError("symbol is not in a section: " + Name);
+ Associated = cast<MCSectionELF>(&Sym->getSection());
+ return false;
+}
+
bool ELFAsmParser::maybeParseUniqueID(int64_t &UniqueID) {
MCAsmLexer &L = getLexer();
if (L.isNot(AsmToken::Comma))
@@ -460,6 +479,7 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
const MCExpr *Subsection = nullptr;
bool UseLastGroup = false;
StringRef UniqueStr;
+ MCSectionELF *Associated = nullptr;
int64_t UniqueID = ~0;
// Set the defaults first.
@@ -522,6 +542,9 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
if (Group)
if (parseGroup(GroupName))
return true;
+ if (Flags & ELF::SHF_LINK_ORDER)
+ if (parseMetadataSym(Associated))
+ return true;
if (maybeParseUniqueID(UniqueID))
return true;
}
@@ -571,8 +594,8 @@ EndStmt:
}
}
- MCSection *ELFSection = getContext().getELFSection(SectionName, Type, Flags,
- Size, GroupName, UniqueID);
+ MCSection *ELFSection = getContext().getELFSection(
+ SectionName, Type, Flags, Size, GroupName, UniqueID, Associated);
getStreamer().SwitchSection(ELFSection, Subsection);
if (getContext().getGenDwarfForAssembly()) {
OpenPOWER on IntegriCloud