[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