diff options
author | Rui Ueyama <ruiu@google.com> | 2014-12-04 18:29:03 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-12-04 18:29:03 +0000 |
commit | 5ae2050420fa002580e42bc8619acb15363fa53d (patch) | |
tree | ecc9522663dd9566048b9bc4830f5e0c7302e255 /lld/lib/Core/Resolver.cpp | |
parent | 19c39ee077aacccf1e80d9313cca09316d8813b4 (diff) | |
download | bcm5719-llvm-5ae2050420fa002580e42bc8619acb15363fa53d.tar.gz bcm5719-llvm-5ae2050420fa002580e42bc8619acb15363fa53d.zip |
Revert "Rewrite InputGraph's Group"
This reverts commit r223330 because it broke Darwin and ELF
linkers in a way that we couldn't have caught with the existing
test cases.
llvm-svn: 223373
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r-- | lld/lib/Core/Resolver.cpp | 74 |
1 files changed, 21 insertions, 53 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index f92c1155ad1..e4a1b53cc33 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -27,7 +27,7 @@ namespace lld { -bool Resolver::handleFile(const File &file) { +void Resolver::handleFile(const File &file) { bool undefAdded = false; for (const DefinedAtom *atom : file.defined()) doDefinedAtom(*atom); @@ -38,7 +38,13 @@ bool Resolver::handleFile(const File &file) { doSharedLibraryAtom(*atom); for (const AbsoluteAtom *atom : file.absolute()) doAbsoluteAtom(*atom); - return undefAdded; + + // Notify the input file manager of the fact that we have made some progress + // on linking using the current input file. It may want to know the fact for + // --start-group/--end-group. + if (undefAdded) { + _context.getInputGraph().notifyProgress(); + } } void Resolver::forEachUndefines(bool searchForOverrides, @@ -70,19 +76,17 @@ void Resolver::forEachUndefines(bool searchForOverrides, } while (undefineGenCount != _symbolTable.size()); } -bool Resolver::handleArchiveFile(const File &file) { +void Resolver::handleArchiveFile(const File &file) { const ArchiveLibraryFile *archiveFile = cast<ArchiveLibraryFile>(&file); bool searchForOverrides = _context.searchArchivesToOverrideTentativeDefinitions(); - bool undefAdded = false; forEachUndefines(searchForOverrides, [&](StringRef undefName, bool dataSymbolOnly) { if (const File *member = archiveFile->find(undefName, dataSymbolOnly)) { member->setOrdinal(_context.getNextOrdinalAndIncrement()); - undefAdded = undefAdded || handleFile(*member); + handleFile(*member); } }); - return undefAdded; } void Resolver::handleSharedLibrary(const File &file) { @@ -229,66 +233,31 @@ void Resolver::addAtoms(const std::vector<const DefinedAtom *> &newAtoms) { doDefinedAtom(*newAtom); } -// Returns true if at least one of N previous files has created an -// undefined symbol. -bool Resolver::undefinesAdded(int n) { - for (size_t i = _fileIndex - n; i < _fileIndex; ++i) - if (_newUndefinesAdded[_files[i]]) - return true; - return false; -} - -ErrorOr<File &> Resolver::nextFile(bool &inGroup) { - if (size_t groupSize = _context.getInputGraph().getGroupSize()) { - // We are at the end of the current group. If one or more new - // undefined atom has been added in the last groupSize files, we - // reiterate over the files. - if (undefinesAdded(groupSize)) - _fileIndex -= groupSize; - _context.getInputGraph().skipGroup(); - return nextFile(inGroup); - } - if (_fileIndex < _files.size()) { - // We are still in the current group. - inGroup = true; - return *_files[_fileIndex++]; - } - // We are not in a group. Get a new file. - ErrorOr<File &> file = _context.getInputGraph().getNextFile(); - if (std::error_code ec = file.getError()) { - if (ec != InputGraphError::no_more_files) - llvm::errs() << "Error occurred in getNextFile: " << ec.message() << "\n"; - return ec; - } - _files.push_back(&*file); - ++_fileIndex; - inGroup = false; - return *file; -} - // Keep adding atoms until _context.getNextFile() returns an error. This // function is where undefined atoms are resolved. bool Resolver::resolveUndefines() { ScopedTask task(getDefaultDomain(), "resolveUndefines"); for (;;) { - bool inGroup = false; - bool undefAdded = false; - ErrorOr<File &> file = nextFile(inGroup); - if (std::error_code ec = file.getError()) - return ec == InputGraphError::no_more_files; + ErrorOr<File &> file = _context.getInputGraph().getNextFile(); + std::error_code ec = file.getError(); + if (ec == InputGraphError::no_more_files) + return true; + if (!file) { + llvm::errs() << "Error occurred in getNextFile: " << ec.message() << "\n"; + return false; + } + switch (file->kind()) { case File::kindObject: - if (inGroup) - break; assert(!file->hasOrdinal()); file->setOrdinal(_context.getNextOrdinalAndIncrement()); - undefAdded = handleFile(*file); + handleFile(*file); break; case File::kindArchiveLibrary: if (!file->hasOrdinal()) file->setOrdinal(_context.getNextOrdinalAndIncrement()); - undefAdded = handleArchiveFile(*file); + handleArchiveFile(*file); break; case File::kindSharedLibrary: if (!file->hasOrdinal()) @@ -296,7 +265,6 @@ bool Resolver::resolveUndefines() { handleSharedLibrary(*file); break; } - _newUndefinesAdded[&*file] = undefAdded; } } |