diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index cf1919cfbabf..51c789d13b7c 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -294,11 +294,15 @@ void Resolver::updatePreloadArchiveMap() { // Keep adding atoms until _ctx.getNextFile() returns an error. This // function is where undefined atoms are resolved. bool Resolver::resolveUndefines() { + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "******** Resolving undefines:\n"); ScopedTask task(getDefaultDomain(), "resolveUndefines"); int index = 0; std::set seen; for (;;) { bool undefAdded = false; + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "Loading file #" << index << "\n"); File *file = getFile(index); if (!file) return true; @@ -307,6 +311,8 @@ bool Resolver::resolveUndefines() { << ": " << ec.message() << "\n"; return false; } + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "Loaded file: " << file->path() << "\n"); file->beforeLink(); updatePreloadArchiveMap(); switch (file->kind()) { @@ -339,6 +345,8 @@ bool Resolver::resolveUndefines() { // switch all references to undefined or coalesced away atoms // to the new defined atom void Resolver::updateReferences() { + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "******** Updating references:\n"); ScopedTask task(getDefaultDomain(), "updateReferences"); for (const Atom *atom : _atoms) { if (const DefinedAtom *defAtom = dyn_cast(atom)) { @@ -387,6 +395,8 @@ static bool isBackref(const Reference *ref) { // remove all atoms not actually used void Resolver::deadStripOptimize() { + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "******** Dead stripping unused atoms:\n"); ScopedTask task(getDefaultDomain(), "deadStripOptimize"); // only do this optimization with -dead_strip if (!_ctx.deadStrip()) @@ -432,6 +442,9 @@ void Resolver::deadStripOptimize() { // error out if some undefines remain bool Resolver::checkUndefines() { + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "******** Checking for undefines:\n"); + // build vector of remaining undefined symbols std::vector undefinedAtoms = _symbolTable.undefines(); if (_ctx.deadStrip()) { @@ -478,6 +491,8 @@ bool Resolver::checkUndefines() { // remove from _atoms all coaleseced away atoms 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(), [&](const Atom *a) { return _symbolTable.isCoalescedAway(a) || _deadAtoms.count(a); @@ -486,16 +501,24 @@ void Resolver::removeCoalescedAwayAtoms() { } bool Resolver::resolve() { + DEBUG_WITH_TYPE("resolver", + llvm::dbgs() << "******** Resolving atom references:\n"); updatePreloadArchiveMap(); if (!resolveUndefines()) return false; updateReferences(); deadStripOptimize(); - if (checkUndefines()) - if (!_ctx.allowRemainingUndefines()) + if (checkUndefines()) { + DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "Found undefines... "); + if (!_ctx.allowRemainingUndefines()) { + DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "which we don't allow\n"); return false; + } + DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "which we are ok with\n"); + } removeCoalescedAwayAtoms(); _result->addAtoms(_atoms); + DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "******** Finished resolver\n"); return true; } diff --git a/lld/lib/ReaderWriter/MachO/LayoutPass.cpp b/lld/lib/ReaderWriter/MachO/LayoutPass.cpp index 18d8fd9954c1..0c14ee9d39ab 100644 --- a/lld/lib/ReaderWriter/MachO/LayoutPass.cpp +++ b/lld/lib/ReaderWriter/MachO/LayoutPass.cpp @@ -438,6 +438,7 @@ void LayoutPass::undecorate(SimpleFile::DefinedAtomRange &atomRange, /// Perform the actual pass std::error_code LayoutPass::perform(SimpleFile &mergedFile) { + DEBUG(llvm::dbgs() << "******** Laying out atoms:\n"); // sort the atoms ScopedTask task(getDefaultDomain(), "LayoutPass"); SimpleFile::DefinedAtomRange atomRange = mergedFile.definedAtoms(); @@ -469,6 +470,7 @@ std::error_code LayoutPass::perform(SimpleFile &mergedFile) { printDefinedAtoms(atomRange); }); + DEBUG(llvm::dbgs() << "******** Finished laying out atoms\n"); return std::error_code(); }