summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-02-28 05:09:11 +0000
committerRui Ueyama <ruiu@google.com>2016-02-28 05:09:11 +0000
commit3e808976278b52d0fae64d3232e4bff35a3f5bb2 (patch)
tree1997cbcfc1273a0096debab968b9d6848e4c492d
parent7a6c9aed7a1bfdfc918be1d4bc814b63e04beb28 (diff)
downloadbcm5719-llvm-3e808976278b52d0fae64d3232e4bff35a3f5bb2.tar.gz
bcm5719-llvm-3e808976278b52d0fae64d3232e4bff35a3f5bb2.zip
ELF: Remove OutSection class and use a map instead.
It is easier to handle section filler data separately rather than merging with section names. llvm-svn: 262175
-rw-r--r--lld/ELF/LinkerScript.cpp30
-rw-r--r--lld/ELF/LinkerScript.h13
2 files changed, 19 insertions, 24 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 0bdf401e09f..b4580b5fe7c 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -55,21 +55,20 @@ template <class ELFT> bool LinkerScript::shouldKeep(InputSectionBase<ELFT> *S) {
}
ArrayRef<uint8_t> LinkerScript::getFiller(StringRef Name) {
- for (OutSection &C : OutSections)
- if (C.Name == Name)
- return C.Filler;
- return {};
+ auto I = Filler.find(Name);
+ if (I == Filler.end())
+ return {};
+ return I->second;
}
// A compartor to sort output sections. Returns -1 or 1 if both
// A and B are mentioned in linker scripts. Otherwise, returns 0
// to use the default rule which is implemented in Writer.cpp.
int LinkerScript::compareSections(StringRef A, StringRef B) {
- auto Begin = OutSections.begin();
- auto End = OutSections.end();
- auto I = std::find_if(Begin, End, [&](OutSection &C) { return C.Name == A; });
- auto J = std::find_if(Begin, End, [&](OutSection &C) { return C.Name == B; });
- if (I == End || J == End)
+ auto E = SectionOrder.end();
+ auto I = std::find(SectionOrder.begin(), E, A);
+ auto J = std::find(SectionOrder.begin(), E, B);
+ if (I == E || J == E)
return 0;
return I < J ? -1 : 1;
}
@@ -429,18 +428,18 @@ std::vector<uint8_t> ScriptParser::parseHex(StringRef S) {
}
void ScriptParser::readOutputSectionDescription() {
- OutSection OutSec;
- OutSec.Name = next();
+ StringRef OutSec = next();
+ Script->SectionOrder.push_back(OutSec);
expect(":");
expect("{");
while (!Error && !skip("}")) {
StringRef Tok = next();
if (Tok == "*") {
- readSectionPatterns(OutSec.Name, false);
+ readSectionPatterns(OutSec, false);
} else if (Tok == "KEEP") {
expect("(");
next(); // Skip *
- readSectionPatterns(OutSec.Name, true);
+ readSectionPatterns(OutSec, true);
expect(")");
} else {
setError("Unknown command " + Tok);
@@ -452,11 +451,10 @@ void ScriptParser::readOutputSectionDescription() {
setError("Filler should be a HEX value");
return;
}
- Tok = Tok.substr(3); // Skip '=0x'
- OutSec.Filler = parseHex(Tok);
+ Tok = Tok.substr(3);
+ Script->Filler[OutSec] = parseHex(Tok);
next();
}
- Script->OutSections.push_back(OutSec);
}
static bool isUnderSysroot(StringRef Path) {
diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h
index 7517838c886..e4a7a900bfd 100644
--- a/lld/ELF/LinkerScript.h
+++ b/lld/ELF/LinkerScript.h
@@ -40,11 +40,6 @@ private:
StringRef SectionPattern;
};
-struct OutSection {
- StringRef Name;
- std::vector<uint8_t> Filler;
-};
-
// This is a runner of the linker script.
class LinkerScript {
friend class ScriptParser;
@@ -66,9 +61,11 @@ private:
// SECTIONS commands.
std::vector<SectionRule> Sections;
- // Output sections information.
- // They are sorted by the order of the container.
- std::vector<OutSection> OutSections;
+ // Output sections are sorted by this order.
+ std::vector<StringRef> SectionOrder;
+
+ // Section fill attribute for each section.
+ llvm::StringMap<std::vector<uint8_t>> Filler;
llvm::BumpPtrAllocator Alloc;
};
OpenPOWER on IntegriCloud