diff options
| -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; }; |

