[lld] r231395 - Resolver: Update preload map after File::beforeLink().

Shankar Easwaran shankare at codeaurora.org
Thu Mar 5 12:23:21 PST 2015


No test ?

On 3/5/2015 1:25 PM, Rui Ueyama wrote:
> Author: ruiu
> Date: Thu Mar  5 13:25:58 2015
> New Revision: 231395
>
> URL: http://llvm.org/viewvc/llvm-project?rev=231395&view=rev
> Log:
> Resolver: Update preload map after File::beforeLink().
>
> We maintain a map from symbols to archive files for the archive file
> pre-loading. That map is created at the beginning of the resolve()
> and is never updated. However, the input file list may be updated by
> File::beforeLink(). This is a patch to update the map after beforeLink.
>
> Modified:
>      lld/trunk/include/lld/Core/Resolver.h
>      lld/trunk/lib/Core/Resolver.cpp
>
> Modified: lld/trunk/include/lld/Core/Resolver.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=231395&r1=231394&r2=231395&view=diff
> ==============================================================================
> --- lld/trunk/include/lld/Core/Resolver.h (original)
> +++ lld/trunk/include/lld/Core/Resolver.h Thu Mar  5 13:25:58 2015
> @@ -18,6 +18,7 @@
>   #include "llvm/ADT/DenseMap.h"
>   #include "llvm/ADT/DenseSet.h"
>   #include <set>
> +#include <unordered_set>
>   #include <vector>
>   
>   namespace lld {
> @@ -64,7 +65,7 @@ private:
>     void maybeAddSectionGroupOrGnuLinkOnce(const DefinedAtom &atom);
>   
>     /// \brief The main function that iterates over the files to resolve
> -  void makePreloadArchiveMap();
> +  void updatePreloadArchiveMap();
>     bool resolveUndefines();
>     void updateReferences();
>     void deadStripOptimize();
> @@ -99,6 +100,7 @@ private:
>   
>     // Preloading
>     std::map<StringRef, ArchiveLibraryFile *> _archiveMap;
> +  std::unordered_set<ArchiveLibraryFile *> _archiveSeen;
>   };
>   
>   } // namespace lld
>
> Modified: lld/trunk/lib/Core/Resolver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=231395&r1=231394&r2=231395&view=diff
> ==============================================================================
> --- lld/trunk/lib/Core/Resolver.cpp (original)
> +++ lld/trunk/lib/Core/Resolver.cpp Thu Mar  5 13:25:58 2015
> @@ -83,6 +83,7 @@ bool Resolver::handleArchiveFile(File &f
>       if (File *member = archiveFile->find(undefName, dataSymbolOnly)) {
>         member->setOrdinal(_ctx.getNextOrdinalAndIncrement());
>         member->beforeLink();
> +      updatePreloadArchiveMap();
>         undefAdded = handleFile(*member) || undefAdded;
>       }
>     });
> @@ -274,14 +275,21 @@ File *Resolver::getFile(int &index) {
>     return cast<FileNode>(inputs[index++].get())->getFile();
>   }
>   
> -// Make a map of Symbol -> ArchiveFile.
> -void Resolver::makePreloadArchiveMap() {
> +// Update a map of Symbol -> ArchiveFile. The map is used for speculative
> +// file loading.
> +void Resolver::updatePreloadArchiveMap() {
>     std::vector<std::unique_ptr<Node>> &nodes = _ctx.getNodes();
> -  for (int i = nodes.size() - 1; i >= 0; --i)
> -    if (auto *fnode = dyn_cast<FileNode>(nodes[i].get()))
> -      if (auto *archive = dyn_cast<ArchiveLibraryFile>(fnode->getFile()))
> -        for (StringRef sym : archive->getDefinedSymbols())
> -          _archiveMap[sym] = archive;
> +  for (int i = nodes.size() - 1; i >= 0; --i) {
> +    auto *fnode = dyn_cast<FileNode>(nodes[i].get());
> +    if (!fnode)
> +      continue;
> +    auto *archive = dyn_cast<ArchiveLibraryFile>(fnode->getFile());
> +    if (!archive || _archiveSeen.count(archive))
> +      continue;
> +    _archiveSeen.insert(archive);
> +    for (StringRef sym : archive->getDefinedSymbols())
> +      _archiveMap[sym] = archive;
> +  }
>   }
>   
>   // Keep adding atoms until _ctx.getNextFile() returns an error. This
> @@ -301,6 +309,7 @@ bool Resolver::resolveUndefines() {
>         return false;
>       }
>       file->beforeLink();
> +    updatePreloadArchiveMap();
>       switch (file->kind()) {
>       case File::kindObject:
>         // The same file may be visited more than once if the file is
> @@ -477,7 +486,7 @@ void Resolver::removeCoalescedAwayAtoms(
>   }
>   
>   bool Resolver::resolve() {
> -  makePreloadArchiveMap();
> +  updatePreloadArchiveMap();
>     if (!resolveUndefines())
>       return false;
>     updateReferences();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list