summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/include/lld/Core/Resolver.h3
-rw-r--r--lld/lib/Core/Resolver.cpp8
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);
}
OpenPOWER on IntegriCloud