<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 12, 2016 at 12:41 PM, Rui Ueyama via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Fri Feb 12 14:41:43 2016<br>
New Revision: 260724<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=260724&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=260724&view=rev</a><br>
Log:<br>
ELF: Remove use of MapVector from LinkerScript.<br>
<br>
We don't have to use a MapVector here. Instead, just std::vector suffices.<br>
<br>
Modified:<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/LinkerScript.cpp<br>
    lld/trunk/ELF/LinkerScript.h<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=260724&r1=260723&r2=260724&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=260724&r1=260723&r2=260724&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Fri Feb 12 14:41:43 2016<br>
@@ -296,7 +296,6 @@ template <class ELFT> void LinkerDriver:<br>
   SymbolTable<ELFT> Symtab;<br>
   std::unique_ptr<TargetInfo> TI(createTarget());<br>
   Target = TI.get();<br>
-  Script->finalize();<br>
<br>
   if (!Config->Shared) {<br>
     // Add entry symbol.<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=260724&r1=260723&r2=260724&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=260724&r1=260723&r2=260724&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/LinkerScript.cpp (original)<br>
+++ lld/trunk/ELF/LinkerScript.cpp Fri Feb 12 14:41:43 2016<br>
@@ -28,27 +28,22 @@ using namespace lld::elf2;<br>
<br>
 LinkerScript *elf2::Script;<br>
<br>
-void LinkerScript::finalize() {<br>
-  for (const std::pair<StringRef, std::vector<StringRef>> &P : Sections)<br>
-    for (StringRef S : P.second)<br>
-      RevSections[S] = P.first;<br>
-}<br>
-<br>
 StringRef LinkerScript::getOutputSection(StringRef S) {<br>
-  return RevSections.lookup(S);<br>
+  return Sections.lookup(S);<br>
 }<br>
<br>
 bool LinkerScript::isDiscarded(StringRef S) {<br>
-  return RevSections.lookup(S) == "/DISCARD/";<br>
+  return Sections.lookup(S) == "/DISCARD/";<br>
 }<br>
<br>
+// A compartor to sort output sections. Returns -1 or 1 if both<br>
+// A and B are mentioned in linker scripts. Otherwise, returns 0<br>
+// to use the default rule which is implemented in Writer.cpp.<br>
 int LinkerScript::compareSections(StringRef A, StringRef B) {<br>
-  auto I = Sections.find(A);<br>
-  auto E = Sections.end();<br>
-  if (I == E)<br>
-    return 0;<br>
-  auto J = Sections.find(B);<br>
-  if (J == E)<br>
+  auto E = SectionOrder.end();<br>
+  auto I = std::find(SectionOrder.begin(), E, A);<br>
+  auto J = std::find(SectionOrder.begin(), E, B);<br>
+  if (I == E || J == E)<br>
     return 0;<br></blockquote><div><br></div><div><br></div><div>This is called N log N times while we are sorting. If we are doing O(N) work in std::find then the sorting is superlinear.</div><div>I don't expect the number of output sections to be large, but it seems wasteful to be using linear search when the MapVector is not really any more complicated and avoids doing redundant string comparisons.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   return I < J ? -1 : 1;<br>
 }<br>
@@ -349,14 +344,15 @@ void ScriptParser::readSections() {<br>
 }<br>
<br>
 void ScriptParser::readOutputSectionDescription() {<br>
-  std::vector<StringRef> &V = Script->Sections[next()];<br>
+  StringRef OutSec = next();<br>
+  Script->SectionOrder.push_back(OutSec);<br>
   expect(":");<br>
   expect("{");<br>
   while (!Error && !skip("}")) {<br>
     next(); // Skip input file name.<br>
     expect("(");<br>
     while (!Error && !skip(")"))<br>
-      V.push_back(next());<br>
+      Script->Sections[next()] = OutSec;<br>
   }<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=260724&r1=260723&r2=260724&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=260724&r1=260723&r2=260724&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/LinkerScript.h (original)<br>
+++ lld/trunk/ELF/LinkerScript.h Fri Feb 12 14:41:43 2016<br>
@@ -32,15 +32,14 @@ public:<br>
   StringRef getOutputSection(StringRef InputSection);<br>
   bool isDiscarded(StringRef InputSection);<br>
   int compareSections(StringRef A, StringRef B);<br>
-  void finalize();<br>
<br>
 private:<br>
-  // Map for SECTIONS command. The key is output section name<br>
-  // and a value is a list of input section names.<br>
-  llvm::MapVector<StringRef, std::vector<StringRef>> Sections;<br>
+  // A map for SECTIONS command. The key is input section name<br>
+  // and the value is the corresponding output section name.<br>
+  llvm::DenseMap<StringRef, StringRef> Sections;<br>
<br>
-  // Inverse map of Sections.<br>
-  llvm::DenseMap<StringRef, StringRef> RevSections;<br>
+  // Output sections are sorted by this order.<br>
+  std::vector<StringRef> SectionOrder;<br>
<br>
   llvm::BumpPtrAllocator Alloc;<br>
 };<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>