diff options
Diffstat (limited to 'lld/lib/Core')
-rw-r--r-- | lld/lib/Core/File.cpp | 2 | ||||
-rw-r--r-- | lld/lib/Core/Resolver.cpp | 141 |
2 files changed, 72 insertions, 71 deletions
diff --git a/lld/lib/Core/File.cpp b/lld/lib/Core/File.cpp index b84132bfecd..ac95f101679 100644 --- a/lld/lib/Core/File.cpp +++ b/lld/lib/Core/File.cpp @@ -13,7 +13,7 @@ namespace lld { -File::~File() { } +File::~File() {} File::AtomVector<DefinedAtom> File::_noDefinedAtoms; File::AtomVector<UndefinedAtom> File::_noUndefinedAtoms; 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); } } |