diff options
Diffstat (limited to 'lld/lib/Core')
-rw-r--r-- | lld/lib/Core/Resolver.cpp | 55 | ||||
-rw-r--r-- | lld/lib/Core/SymbolTable.cpp | 10 | ||||
-rw-r--r-- | lld/lib/Core/TargetInfo.cpp | 43 |
3 files changed, 66 insertions, 42 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index 6d3880f31d3..d5e747fc0de 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -10,7 +10,6 @@ #include "lld/Core/Atom.h" #include "lld/Core/File.h" #include "lld/Core/InputFiles.h" -#include "lld/Core/LinkerOptions.h" #include "lld/Core/LLVM.h" #include "lld/Core/Resolver.h" #include "lld/Core/SymbolTable.h" @@ -129,7 +128,7 @@ void Resolver::doDefinedAtom(const DefinedAtom &atom) { // tell symbol table _symbolTable.add(atom); - if (_targetInfo.getLinkerOptions()._deadStrip) { + if (_targetInfo.deadStrip()) { // add to set of dead-strip-roots, all symbols that // the compiler marks as don't strip if (atom.deadStrip() == DefinedAtom::deadStripNever) @@ -182,11 +181,11 @@ void Resolver::addAtoms(const std::vector<const DefinedAtom*>& newAtoms) { // ask symbol table if any definitionUndefined atoms still exist // if so, keep searching libraries until no more atoms being added void Resolver::resolveUndefines() { - const bool searchArchives = _targetInfo.getLinkerOptions(). - _searchArchivesToOverrideTentativeDefinitions; - const bool searchSharedLibs = _targetInfo.getLinkerOptions(). - _searchSharedLibrariesToOverrideTentativeDefinitions; - + const bool searchArchives = + _targetInfo.searchArchivesToOverrideTentativeDefinitions(); + const bool searchSharedLibs = + _targetInfo.searchSharedLibrariesToOverrideTentativeDefinitions(); + // keep looping until no more undefines were added in last loop unsigned int undefineGenCount = 0xFFFFFFFF; while (undefineGenCount != _symbolTable.size()) { @@ -259,14 +258,14 @@ void Resolver::markLive(const Atom &atom) { // remove all atoms not actually used void Resolver::deadStripOptimize() { // only do this optimization with -dead_strip - if (!_targetInfo.getLinkerOptions()._deadStrip) + if (!_targetInfo.deadStrip()) return; // clear liveness on all atoms _liveAtoms.clear(); // By default, shared libraries are built with all globals as dead strip roots - if (_targetInfo.getLinkerOptions()._globalsAreDeadStripRoots) { + if (_targetInfo.globalsAreDeadStripRoots()) { for ( const Atom *atom : _atoms ) { const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom); if (defAtom == nullptr) @@ -277,7 +276,7 @@ void Resolver::deadStripOptimize() { } // Or, use list of names that are dead stip roots. - for (const StringRef &name : _targetInfo.getLinkerOptions()._deadStripRoots) { + for (const StringRef &name : _targetInfo.deadStripRoots()) { const Atom *symAtom = _symbolTable.findByName(name); assert(symAtom->definition() != Atom::definitionUndefined); _deadStripRoots.insert(symAtom); @@ -295,15 +294,15 @@ void Resolver::deadStripOptimize() { // error out if some undefines remain -void Resolver::checkUndefines(bool final) { +bool Resolver::checkUndefines(bool final) { // when using LTO, undefines are checked after bitcode is optimized if (_haveLLVMObjs && !final) - return; + return false; // build vector of remaining undefined symbols std::vector<const UndefinedAtom *> undefinedAtoms; _symbolTable.undefines(undefinedAtoms); - if (_targetInfo.getLinkerOptions()._deadStrip) { + if (_targetInfo.deadStrip()) { // When dead code stripping, we don't care if dead atoms are undefined. undefinedAtoms.erase(std::remove_if( undefinedAtoms.begin(), undefinedAtoms.end(), @@ -311,21 +310,25 @@ void Resolver::checkUndefines(bool final) { } // error message about missing symbols - if (!undefinedAtoms.empty() && - (!_targetInfo.getLinkerOptions()._noInhibitExec || - _targetInfo.getLinkerOptions()._outputKind == OutputKind::Relocatable)) { + if (!undefinedAtoms.empty()) { // FIXME: need diagonstics interface for writing error messages - bool isError = false; + bool foundUndefines = false; for (const UndefinedAtom *undefAtom : undefinedAtoms) { if (undefAtom->canBeNull() == UndefinedAtom::canBeNullNever) { - llvm::errs() << "Undefined Symbol: " << undefAtom->file().path() - << " : " << undefAtom->name() << "\n"; - isError = true; + foundUndefines = true; + if (_targetInfo.printRemainingUndefines()) { + llvm::errs() << "Undefined Symbol: " << undefAtom->file().path() + << " : " << undefAtom->name() << "\n"; + } } } - if (isError) - llvm::report_fatal_error("symbol(s) not found"); + if (foundUndefines) { + if (_targetInfo.printRemainingUndefines()) + llvm::errs() << "symbol(s) not found\n"; + return true; + } } + return false; } @@ -357,16 +360,20 @@ void Resolver::linkTimeOptimize() { // FIX ME } -void Resolver::resolve() { +bool Resolver::resolve() { this->buildInitialAtomList(); this->resolveUndefines(); this->updateReferences(); this->deadStripOptimize(); - this->checkUndefines(false); + if (this->checkUndefines(false)) { + if (!_targetInfo.allowRemainingUndefines()) + return true; + } this->removeCoalescedAwayAtoms(); this->checkDylibSymbolCollisions(); this->linkTimeOptimize(); this->_result.addAtoms(_atoms); + return false; } void Resolver::MergedFile::addAtom(const Atom& atom) { diff --git a/lld/lib/Core/SymbolTable.cpp b/lld/lib/Core/SymbolTable.cpp index 36e52d8ed07..4ded5a62597 100644 --- a/lld/lib/Core/SymbolTable.cpp +++ b/lld/lib/Core/SymbolTable.cpp @@ -13,7 +13,6 @@ #include "lld/Core/DefinedAtom.h" #include "lld/Core/File.h" #include "lld/Core/InputFiles.h" -#include "lld/Core/LinkerOptions.h" #include "lld/Core/LLVM.h" #include "lld/Core/Resolver.h" #include "lld/Core/SharedLibraryAtom.h" @@ -184,8 +183,7 @@ void SymbolTable::addByName(const Atom & newAtom) { useNew = false; } else { - if (_targetInfo.getLinkerOptions(). - _warnIfCoalesableAtomsHaveDifferentCanBeNull) { + if (_targetInfo.warnIfCoalesableAtomsHaveDifferentCanBeNull()) { // FIXME: need diagonstics interface for writing warning messages llvm::errs() << "lld warning: undefined symbol " << existingUndef->name() @@ -210,8 +208,7 @@ void SymbolTable::addByName(const Atom & newAtom) { bool sameName = curShLib->loadName().equals(newShLib->loadName()); if ( !sameName ) { useNew = false; - if (_targetInfo.getLinkerOptions(). - _warnIfCoalesableAtomsHaveDifferentLoadName) { + if (_targetInfo.warnIfCoalesableAtomsHaveDifferentLoadName()) { // FIXME: need diagonstics interface for writing warning messages llvm::errs() << "lld warning: shared library symbol " << curShLib->name() @@ -223,8 +220,7 @@ void SymbolTable::addByName(const Atom & newAtom) { } else if ( ! sameNullness ) { useNew = false; - if (_targetInfo.getLinkerOptions(). - _warnIfCoalesableAtomsHaveDifferentCanBeNull) { + if (_targetInfo.warnIfCoalesableAtomsHaveDifferentCanBeNull()) { // FIXME: need diagonstics interface for writing warning messages llvm::errs() << "lld warning: shared library symbol " << curShLib->name() diff --git a/lld/lib/Core/TargetInfo.cpp b/lld/lib/Core/TargetInfo.cpp index da834fb2c9c..05d7ffa5989 100644 --- a/lld/lib/Core/TargetInfo.cpp +++ b/lld/lib/Core/TargetInfo.cpp @@ -8,28 +8,49 @@ //===----------------------------------------------------------------------===// #include "lld/Core/TargetInfo.h" - -#include "lld/Core/LinkerOptions.h" +#include "lld/ReaderWriter/Writer.h" #include "llvm/ADT/Triple.h" namespace lld { + +TargetInfo::TargetInfo() + : Reader(*this) + , _deadStrip(false) + , _globalsAreDeadStripRoots(false) + , _searchArchivesToOverrideTentativeDefinitions(false) + , _searchSharedLibrariesToOverrideTentativeDefinitions(false) + , _warnIfCoalesableAtomsHaveDifferentCanBeNull(false) + , _warnIfCoalesableAtomsHaveDifferentLoadName(false) + , _forceLoadAllArchives(false) + , _printRemainingUndefines(true) + , _allowRemainingUndefines(false) +{ +} + TargetInfo::~TargetInfo() {} -llvm::Triple TargetInfo::getTriple() const { - return llvm::Triple(llvm::Triple::normalize(_options._target)); + +error_code TargetInfo::readFile(StringRef path, + std::vector<std::unique_ptr<File>> &result) const { + OwningPtr<llvm::MemoryBuffer> opmb; + if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb)) + return ec; + + std::unique_ptr<MemoryBuffer> mb(opmb.take()); + return this->parseFile(mb, result); } -bool TargetInfo::is64Bits() const { - return getTriple().isArch64Bit(); +error_code TargetInfo::writeFile(const File &linkedFile) const { + return this->writer().writeFile(linkedFile, _outputPath); } -bool TargetInfo::isLittleEndian() const { - // TODO: Do this properly. It is not defined purely by arch. - return true; +void TargetInfo::addImplicitFiles(InputFiles& inputs) const { + this->writer().addFiles(inputs); } -StringRef TargetInfo::getEntry() const { - return _options._entrySymbol; +void TargetInfo::addPasses(PassManager &pm) const { } + + } // end namespace lld |