<div dir="ltr">This has really visible effect other than speed up. As long as existing tests are okay, it should be okay.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 5, 2015 at 12:23 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">No test ?<div class="HOEnZb"><div class="h5"><br>
<br>
On 3/5/2015 1:25 PM, Rui Ueyama wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: ruiu<br>
Date: Thu Mar  5 13:25:58 2015<br>
New Revision: 231395<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231395&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=231395&view=rev</a><br>
Log:<br>
Resolver: Update preload map after File::beforeLink().<br>
<br>
We maintain a map from symbols to archive files for the archive file<br>
pre-loading. That map is created at the beginning of the resolve()<br>
and is never updated. However, the input file list may be updated by<br>
File::beforeLink(). This is a patch to update the map after beforeLink.<br>
<br>
Modified:<br>
     lld/trunk/include/lld/Core/<u></u>Resolver.h<br>
     lld/trunk/lib/Core/Resolver.<u></u>cpp<br>
<br>
Modified: lld/trunk/include/lld/Core/<u></u>Resolver.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=231395&r1=231394&r2=231395&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/Resolver.h?rev=231395&r1=<u></u>231394&r2=231395&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>Resolver.h (original)<br>
+++ lld/trunk/include/lld/Core/<u></u>Resolver.h Thu Mar  5 13:25:58 2015<br>
@@ -18,6 +18,7 @@<br>
  #include "llvm/ADT/DenseMap.h"<br>
  #include "llvm/ADT/DenseSet.h"<br>
  #include <set><br>
+#include <unordered_set><br>
  #include <vector><br>
    namespace lld {<br>
@@ -64,7 +65,7 @@ private:<br>
    void maybeAddSectionGroupOrGnuLinkO<u></u>nce(const DefinedAtom &atom);<br>
      /// \brief The main function that iterates over the files to resolve<br>
-  void makePreloadArchiveMap();<br>
+  void updatePreloadArchiveMap();<br>
    bool resolveUndefines();<br>
    void updateReferences();<br>
    void deadStripOptimize();<br>
@@ -99,6 +100,7 @@ private:<br>
      // Preloading<br>
    std::map<StringRef, ArchiveLibraryFile *> _archiveMap;<br>
+  std::unordered_set<<u></u>ArchiveLibraryFile *> _archiveSeen;<br>
  };<br>
    } // namespace lld<br>
<br>
Modified: lld/trunk/lib/Core/Resolver.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=231395&r1=231394&r2=231395&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Core/<u></u>Resolver.cpp?rev=231395&r1=<u></u>231394&r2=231395&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Core/Resolver.<u></u>cpp (original)<br>
+++ lld/trunk/lib/Core/Resolver.<u></u>cpp Thu Mar  5 13:25:58 2015<br>
@@ -83,6 +83,7 @@ bool Resolver::handleArchiveFile(<u></u>File &f<br>
      if (File *member = archiveFile->find(undefName, dataSymbolOnly)) {<br>
        member->setOrdinal(_ctx.<u></u>getNextOrdinalAndIncrement());<br>
        member->beforeLink();<br>
+      updatePreloadArchiveMap();<br>
        undefAdded = handleFile(*member) || undefAdded;<br>
      }<br>
    });<br>
@@ -274,14 +275,21 @@ File *Resolver::getFile(int &index) {<br>
    return cast<FileNode>(inputs[index++]<u></u>.get())->getFile();<br>
  }<br>
  -// Make a map of Symbol -> ArchiveFile.<br>
-void Resolver::<u></u>makePreloadArchiveMap() {<br>
+// Update a map of Symbol -> ArchiveFile. The map is used for speculative<br>
+// file loading.<br>
+void Resolver::<u></u>updatePreloadArchiveMap() {<br>
    std::vector<std::unique_ptr<<u></u>Node>> &nodes = _ctx.getNodes();<br>
-  for (int i = nodes.size() - 1; i >= 0; --i)<br>
-    if (auto *fnode = dyn_cast<FileNode>(nodes[i].<u></u>get()))<br>
-      if (auto *archive = dyn_cast<ArchiveLibraryFile>(<u></u>fnode->getFile()))<br>
-        for (StringRef sym : archive->getDefinedSymbols())<br>
-          _archiveMap[sym] = archive;<br>
+  for (int i = nodes.size() - 1; i >= 0; --i) {<br>
+    auto *fnode = dyn_cast<FileNode>(nodes[i].<u></u>get());<br>
+    if (!fnode)<br>
+      continue;<br>
+    auto *archive = dyn_cast<ArchiveLibraryFile>(<u></u>fnode->getFile());<br>
+    if (!archive || _archiveSeen.count(archive))<br>
+      continue;<br>
+    _archiveSeen.insert(archive);<br>
+    for (StringRef sym : archive->getDefinedSymbols())<br>
+      _archiveMap[sym] = archive;<br>
+  }<br>
  }<br>
    // Keep adding atoms until _ctx.getNextFile() returns an error. This<br>
@@ -301,6 +309,7 @@ bool Resolver::resolveUndefines() {<br>
        return false;<br>
      }<br>
      file->beforeLink();<br>
+    updatePreloadArchiveMap();<br>
      switch (file->kind()) {<br>
      case File::kindObject:<br>
        // The same file may be visited more than once if the file is<br>
@@ -477,7 +486,7 @@ void Resolver::<u></u>removeCoalescedAwayAtoms(<br>
  }<br>
    bool Resolver::resolve() {<br>
-  makePreloadArchiveMap();<br>
+  updatePreloadArchiveMap();<br>
    if (!resolveUndefines())<br>
      return false;<br>
    updateReferences();<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
</blockquote>
<br>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</font></span></blockquote></div><br></div>