diff options
| -rw-r--r-- | lld/include/lld/Core/Resolver.h | 3 | ||||
| -rw-r--r-- | lld/lib/Core/Resolver.cpp | 8 |
2 files changed, 8 insertions, 3 deletions
diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h index b70b5b58730..e07c449bf5d 100644 --- a/lld/include/lld/Core/Resolver.h +++ b/lld/include/lld/Core/Resolver.h @@ -18,6 +18,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include <set> +#include <unordered_map> #include <unordered_set> #include <vector> @@ -91,7 +92,7 @@ private: llvm::DenseSet<const Atom *> _liveAtoms; llvm::DenseSet<const Atom *> _deadAtoms; std::unique_ptr<MergedFile> _result; - llvm::DenseMap<const Atom *, llvm::DenseSet<const Atom *>> _reverseRef; + std::unordered_multimap<const Atom *, const Atom *> _reverseRef; // --start-group and --end-group std::vector<File *> _files; diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index 53cb6e88cd3..9ce948d4b25 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -17,12 +17,14 @@ #include "lld/Core/SharedLibraryFile.h" #include "lld/Core/SymbolTable.h" #include "lld/Core/UndefinedAtom.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <cassert> +#include <utility> #include <vector> namespace lld { @@ -372,8 +374,10 @@ void Resolver::markLive(const Atom *atom) { if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) { for (const Reference *ref : *defAtom) markLive(ref->target()); - for (const Atom *target : _reverseRef.lookup(defAtom)) + for (auto &p : llvm::make_range(_reverseRef.equal_range(defAtom))) { + const Atom *target = p.second; markLive(target); + } } } @@ -399,7 +403,7 @@ void Resolver::deadStripOptimize() { if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) for (const Reference *ref : *defAtom) if (isBackref(ref)) - _reverseRef[ref->target()].insert(atom); + _reverseRef.insert(std::make_pair(ref->target(), atom)); if (const AbsoluteAtom *absAtom = dyn_cast<AbsoluteAtom>(atom)) markLive(absAtom); } |

