From 3e808976278b52d0fae64d3232e4bff35a3f5bb2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 28 Feb 2016 05:09:11 +0000 Subject: [PATCH] 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 --- lld/ELF/LinkerScript.cpp | 30 ++++++++++++++---------------- 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 0bdf401e09f8..b4580b5fe7c6 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -55,21 +55,20 @@ template bool LinkerScript::shouldKeep(InputSectionBase *S) { } ArrayRef 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 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 7517838c8864..e4a7a900bfd1 100644 --- a/lld/ELF/LinkerScript.h +++ b/lld/ELF/LinkerScript.h @@ -40,11 +40,6 @@ private: StringRef SectionPattern; }; -struct OutSection { - StringRef Name; - std::vector Filler; -}; - // This is a runner of the linker script. class LinkerScript { friend class ScriptParser; @@ -66,9 +61,11 @@ private: // SECTIONS commands. std::vector Sections; - // Output sections information. - // They are sorted by the order of the container. - std::vector OutSections; + // Output sections are sorted by this order. + std::vector SectionOrder; + + // Section fill attribute for each section. + llvm::StringMap> Filler; llvm::BumpPtrAllocator Alloc; };