diff options
author | Rui Ueyama <ruiu@google.com> | 2016-02-28 05:09:11 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-02-28 05:09:11 +0000 |
commit | 3e808976278b52d0fae64d3232e4bff35a3f5bb2 (patch) | |
tree | 1997cbcfc1273a0096debab968b9d6848e4c492d | |
parent | 7a6c9aed7a1bfdfc918be1d4bc814b63e04beb28 (diff) | |
download | bcm5719-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.cpp | 30 | ||||
-rw-r--r-- | lld/ELF/LinkerScript.h | 13 |
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; }; |