summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/Resolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r--lld/lib/Core/Resolver.cpp141
1 files changed, 71 insertions, 70 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index d94699a9f13..b8964358c0e 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -33,16 +33,16 @@ ErrorOr<bool> Resolver::handleFile(File &file) {
if (auto ec = _ctx.handleLoadedFile(file))
return ec;
bool undefAdded = false;
- for (auto &atom : file.defined().owning_ptrs())
- doDefinedAtom(std::move(atom));
- for (auto &atom : file.undefined().owning_ptrs()) {
- if (doUndefinedAtom(std::move(atom)))
+ for (const DefinedAtom *atom : file.defined())
+ doDefinedAtom(*atom);
+ for (const UndefinedAtom *atom : file.undefined()) {
+ if (doUndefinedAtom(*atom))
undefAdded = true;
}
- for (auto &atom : file.sharedLibrary().owning_ptrs())
- doSharedLibraryAtom(std::move(atom));
- for (auto &atom : file.absolute().owning_ptrs())
- doAbsoluteAtom(std::move(atom));
+ for (const SharedLibraryAtom *atom : file.sharedLibrary())
+ doSharedLibraryAtom(*atom);
+ for (const AbsoluteAtom *atom : file.absolute())
+ doAbsoluteAtom(*atom);
return undefAdded;
}
@@ -113,9 +113,9 @@ std::error_code Resolver::handleSharedLibrary(File &file) {
undefAddedOrError = forEachUndefines(file, searchForOverrides,
[&](StringRef undefName,
bool dataSymbolOnly)->ErrorOr<bool> {
- auto atom = sharedLibrary->exports(undefName, dataSymbolOnly);
- if (atom.get())
- doSharedLibraryAtom(std::move(atom));
+ if (const SharedLibraryAtom *atom =
+ sharedLibrary->exports(undefName, dataSymbolOnly))
+ doSharedLibraryAtom(*atom);
return false;
});
@@ -124,79 +124,84 @@ std::error_code Resolver::handleSharedLibrary(File &file) {
return std::error_code();
}
-bool Resolver::doUndefinedAtom(OwningAtomPtr<UndefinedAtom> atom) {
+bool Resolver::doUndefinedAtom(const UndefinedAtom &atom) {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
<< " UndefinedAtom: "
- << llvm::format("0x%09lX", atom.get())
- << ", name=" << atom.get()->name() << "\n");
+ << llvm::format("0x%09lX", &atom)
+ << ", name=" << atom.name() << "\n");
+
+ // add to list of known atoms
+ _atoms.push_back(&atom);
// tell symbol table
- bool newUndefAdded = _symbolTable.add(*atom.get());
+ bool newUndefAdded = _symbolTable.add(atom);
if (newUndefAdded)
- _undefines.push_back(atom.get()->name());
-
- // add to list of known atoms
- _atoms.push_back(OwningAtomPtr<Atom>(atom.release()));
+ _undefines.push_back(atom.name());
return newUndefAdded;
}
// Called on each atom when a file is added. Returns true if a given
// atom is added to the symbol table.
-void Resolver::doDefinedAtom(OwningAtomPtr<DefinedAtom> atom) {
+void Resolver::doDefinedAtom(const DefinedAtom &atom) {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
<< " DefinedAtom: "
- << llvm::format("0x%09lX", atom.get())
+ << llvm::format("0x%09lX", &atom)
<< ", file=#"
- << atom.get()->file().ordinal()
+ << atom.file().ordinal()
<< ", atom=#"
- << atom.get()->ordinal()
+ << atom.ordinal()
<< ", name="
- << atom.get()->name()
+ << atom.name()
<< ", type="
- << atom.get()->contentType()
+ << atom.contentType()
<< "\n");
+ // add to list of known atoms
+ _atoms.push_back(&atom);
+ _symbolTable.add(atom);
+
// An atom that should never be dead-stripped is a dead-strip root.
- if (_ctx.deadStrip() &&
- atom.get()->deadStrip() == DefinedAtom::deadStripNever) {
- _deadStripRoots.insert(atom.get());
+ if (_ctx.deadStrip() && atom.deadStrip() == DefinedAtom::deadStripNever) {
+ _deadStripRoots.insert(&atom);
}
-
- // add to list of known atoms
- _symbolTable.add(*atom.get());
- _atoms.push_back(OwningAtomPtr<Atom>(atom.release()));
}
-void Resolver::doSharedLibraryAtom(OwningAtomPtr<SharedLibraryAtom> atom) {
+void Resolver::doSharedLibraryAtom(const SharedLibraryAtom &atom) {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
<< " SharedLibraryAtom: "
- << llvm::format("0x%09lX", atom.get())
+ << llvm::format("0x%09lX", &atom)
<< ", name="
- << atom.get()->name()
+ << atom.name()
<< "\n");
- // tell symbol table
- _symbolTable.add(*atom.get());
-
// add to list of known atoms
- _atoms.push_back(OwningAtomPtr<Atom>(atom.release()));
+ _atoms.push_back(&atom);
+
+ // tell symbol table
+ _symbolTable.add(atom);
}
-void Resolver::doAbsoluteAtom(OwningAtomPtr<AbsoluteAtom> atom) {
+void Resolver::doAbsoluteAtom(const AbsoluteAtom &atom) {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
<< " AbsoluteAtom: "
- << llvm::format("0x%09lX", atom.get())
+ << llvm::format("0x%09lX", &atom)
<< ", name="
- << atom.get()->name()
+ << atom.name()
<< "\n");
+ // add to list of known atoms
+ _atoms.push_back(&atom);
+
// tell symbol table
- if (atom.get()->scope() != Atom::scopeTranslationUnit)
- _symbolTable.add(*atom.get());
+ if (atom.scope() != Atom::scopeTranslationUnit)
+ _symbolTable.add(atom);
+}
- // add to list of known atoms
- _atoms.push_back(OwningAtomPtr<Atom>(atom.release()));
+// utility to add a vector of atoms
+void Resolver::addAtoms(const std::vector<const DefinedAtom *> &newAtoms) {
+ for (const DefinedAtom *newAtom : newAtoms)
+ doDefinedAtom(*newAtom);
}
// Returns true if at least one of N previous files has created an
@@ -311,8 +316,8 @@ void Resolver::updateReferences() {
DEBUG_WITH_TYPE("resolver",
llvm::dbgs() << "******** Updating references:\n");
ScopedTask task(getDefaultDomain(), "updateReferences");
- for (const OwningAtomPtr<Atom> &atom : _atoms) {
- if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get())) {
+ for (const Atom *atom : _atoms) {
+ if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) {
for (const Reference *ref : *defAtom) {
// A reference of type kindAssociate should't be updated.
// Instead, an atom having such reference will be removed
@@ -320,7 +325,7 @@ void Resolver::updateReferences() {
// go away as a group.
if (ref->kindNamespace() == lld::Reference::KindNamespace::all &&
ref->kindValue() == lld::Reference::kindAssociate) {
- if (_symbolTable.isCoalescedAway(atom.get()))
+ if (_symbolTable.isCoalescedAway(atom))
_deadAtoms.insert(ref->target());
continue;
}
@@ -368,19 +373,19 @@ void Resolver::deadStripOptimize() {
// Make a reverse map of such references before traversing the graph.
// While traversing the list of atoms, mark AbsoluteAtoms as live
// in order to avoid reclaim.
- for (const OwningAtomPtr<Atom> &atom : _atoms) {
- if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
+ for (const Atom *atom : _atoms) {
+ if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom))
for (const Reference *ref : *defAtom)
if (isBackref(ref))
- _reverseRef.insert(std::make_pair(ref->target(), atom.get()));
- if (const AbsoluteAtom *absAtom = dyn_cast<AbsoluteAtom>(atom.get()))
+ _reverseRef.insert(std::make_pair(ref->target(), atom));
+ if (const AbsoluteAtom *absAtom = dyn_cast<AbsoluteAtom>(atom))
markLive(absAtom);
}
// By default, shared libraries are built with all globals as dead strip roots
if (_ctx.globalsAreDeadStripRoots())
- for (const OwningAtomPtr<Atom> &atom : _atoms)
- if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
+ for (const Atom *atom : _atoms)
+ if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom))
if (defAtom->scope() == DefinedAtom::scopeGlobal)
_deadStripRoots.insert(defAtom);
@@ -396,9 +401,8 @@ void Resolver::deadStripOptimize() {
markLive(dsrAtom);
// now remove all non-live atoms from _atoms
- _atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(),
- [&](OwningAtomPtr<Atom> &a) {
- return _liveAtoms.count(a.get()) == 0;
+ _atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(), [&](const Atom *a) {
+ return _liveAtoms.count(a) == 0;
}),
_atoms.end());
}
@@ -457,10 +461,8 @@ void Resolver::removeCoalescedAwayAtoms() {
DEBUG_WITH_TYPE("resolver",
llvm::dbgs() << "******** Removing coalesced away atoms:\n");
ScopedTask task(getDefaultDomain(), "removeCoalescedAwayAtoms");
- _atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(),
- [&](OwningAtomPtr<Atom> &a) {
- return _symbolTable.isCoalescedAway(a.get()) ||
- _deadAtoms.count(a.get());
+ _atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(), [&](const Atom *a) {
+ return _symbolTable.isCoalescedAway(a) || _deadAtoms.count(a);
}),
_atoms.end());
}
@@ -486,16 +488,15 @@ bool Resolver::resolve() {
return true;
}
-void Resolver::MergedFile::addAtoms(
- llvm::MutableArrayRef<OwningAtomPtr<Atom>> all) {
+void Resolver::MergedFile::addAtoms(std::vector<const Atom *> &all) {
ScopedTask task(getDefaultDomain(), "addAtoms");
DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "Resolver final atom list:\n");
- for (OwningAtomPtr<Atom> &atom : all) {
+ for (const Atom *atom : all) {
#ifndef NDEBUG
- if (auto *definedAtom = dyn_cast<DefinedAtom>(atom.get())) {
+ if (auto *definedAtom = dyn_cast<DefinedAtom>(atom)) {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
- << llvm::format(" 0x%09lX", definedAtom)
+ << llvm::format(" 0x%09lX", atom)
<< ", file=#"
<< definedAtom->file().ordinal()
<< ", atom=#"
@@ -507,13 +508,13 @@ void Resolver::MergedFile::addAtoms(
<< "\n");
} else {
DEBUG_WITH_TYPE("resolver", llvm::dbgs()
- << llvm::format(" 0x%09lX", atom.get())
+ << llvm::format(" 0x%09lX", atom)
<< ", name="
- << atom.get()->name()
+ << atom->name()
<< "\n");
}
#endif
- addAtom(*atom.release());
+ addAtom(*atom);
}
}
OpenPOWER on IntegriCloud