diff --git a/lld/include/lld/Core/TargetInfo.h b/lld/include/lld/Core/TargetInfo.h index c0fdbdae2751..4c7a7771d3ca 100644 --- a/lld/include/lld/Core/TargetInfo.h +++ b/lld/include/lld/Core/TargetInfo.h @@ -260,18 +260,17 @@ public: /// \param [out] result The instantiated lld::File object is returned here. /// The \p result is a vector because some input files parse into more than /// one lld::File (e.g. YAML). - virtual error_code - parseFile(std::unique_ptr inputBuff, - std::vector> &result) const = 0; - + virtual error_code parseFile(std::unique_ptr &inputBuff, + std::vector> &result) const = 0; + /// This is a wrapper around parseFile() where the input file is specified /// by file system path. The default implementation reads the input file /// into a memory buffer and calls parseFile(). /// /// \param path This is the file system path to the input file. /// \param [out] result The instantiated lld::File object is returned here. - virtual error_code - readFile(StringRef path, std::vector> &result) const; + virtual error_code readFile(StringRef path, + std::vector> &result) const; /// This method is called by core linking to give the Writer a chance /// to add file format specific "files" to set of files to be linked. This is diff --git a/lld/include/lld/ReaderWriter/CoreTargetInfo.h b/lld/include/lld/ReaderWriter/CoreTargetInfo.h index 907456bc54d8..339f6196ee87 100644 --- a/lld/include/lld/ReaderWriter/CoreTargetInfo.h +++ b/lld/include/lld/ReaderWriter/CoreTargetInfo.h @@ -30,10 +30,10 @@ public: virtual ErrorOr relocKindFromString(StringRef str) const; virtual ErrorOr stringFromRelocKind(Reference::Kind kind) const; - virtual error_code - parseFile(std::unique_ptr mb, - std::vector> &result) const; + virtual error_code parseFile(std::unique_ptr &mb, + std::vector> &result) const; + void addPassNamed(StringRef name) { _passNames.push_back(name); } diff --git a/lld/include/lld/ReaderWriter/ELFTargetInfo.h b/lld/include/lld/ReaderWriter/ELFTargetInfo.h index 44aa4eac04db..dabd6dbd9150 100644 --- a/lld/include/lld/ReaderWriter/ELFTargetInfo.h +++ b/lld/include/lld/ReaderWriter/ELFTargetInfo.h @@ -57,10 +57,10 @@ public: } virtual bool validate(raw_ostream &diagnostics); - virtual error_code - parseFile(std::unique_ptr mb, - std::vector> &result) const; + virtual error_code parseFile(std::unique_ptr &mb, + std::vector> &result) const; + static std::unique_ptr create(llvm::Triple); /// \brief Does this relocation belong in the dynamic plt relocation table? diff --git a/lld/include/lld/ReaderWriter/MachOTargetInfo.h b/lld/include/lld/ReaderWriter/MachOTargetInfo.h index 6f0618cec57d..db5ab3e70d9b 100644 --- a/lld/include/lld/ReaderWriter/MachOTargetInfo.h +++ b/lld/include/lld/ReaderWriter/MachOTargetInfo.h @@ -31,10 +31,9 @@ public: virtual ErrorOr relocKindFromString(StringRef str) const; virtual ErrorOr stringFromRelocKind(Reference::Kind kind) const; virtual bool validate(raw_ostream &diagnostics); - - virtual error_code - parseFile(std::unique_ptr mb, - std::vector> &result) const; + + virtual error_code parseFile(std::unique_ptr &mb, + std::vector> &result) const; uint32_t getCPUType() const; uint32_t getCPUSubType() const; diff --git a/lld/include/lld/ReaderWriter/Reader.h b/lld/include/lld/ReaderWriter/Reader.h index 7d6e60d32074..133dc05e677b 100644 --- a/lld/include/lld/ReaderWriter/Reader.h +++ b/lld/include/lld/ReaderWriter/Reader.h @@ -39,9 +39,8 @@ public: /// file) and create a File object. /// /// On success, the resulting File object takes ownership of the MemoryBuffer. - virtual error_code - parseFile(std::unique_ptr mb, - std::vector> &result) const = 0; + virtual error_code parseFile(std::unique_ptr &mb, + std::vector> &result) const = 0; protected: // only concrete subclasses can be instantiated diff --git a/lld/include/lld/ReaderWriter/ReaderArchive.h b/lld/include/lld/ReaderWriter/ReaderArchive.h index f9650b0faf64..c1e8cd7335f3 100644 --- a/lld/include/lld/ReaderWriter/ReaderArchive.h +++ b/lld/include/lld/ReaderWriter/ReaderArchive.h @@ -35,7 +35,7 @@ public: /// \brief Returns a vector of Files that are contained in the archive file /// pointed to by the Memorybuffer - error_code parseFile(std::unique_ptr mb, + error_code parseFile(std::unique_ptr &mb, std::vector> &result) const; private: diff --git a/lld/include/lld/ReaderWriter/ReaderLinkerScript.h b/lld/include/lld/ReaderWriter/ReaderLinkerScript.h index 8a4725fb4e0a..0dfa5d3c20aa 100644 --- a/lld/include/lld/ReaderWriter/ReaderLinkerScript.h +++ b/lld/include/lld/ReaderWriter/ReaderLinkerScript.h @@ -26,7 +26,7 @@ public: /// \brief Returns a vector of Files that are contained in the archive file /// pointed to by the Memorybuffer - error_code parseFile(std::unique_ptr mb, + error_code parseFile(std::unique_ptr &mb, std::vector> &result) const; }; diff --git a/lld/lib/Core/TargetInfo.cpp b/lld/lib/Core/TargetInfo.cpp index 8793b73f02e3..eb69bc5772cb 100644 --- a/lld/lib/Core/TargetInfo.cpp +++ b/lld/lib/Core/TargetInfo.cpp @@ -38,7 +38,8 @@ error_code TargetInfo::readFile(StringRef path, if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb)) return ec; - return this->parseFile(std::unique_ptr(opmb.take()), result); + std::unique_ptr mb(opmb.take()); + return this->parseFile(mb, result); } error_code TargetInfo::writeFile(const File &linkedFile) const { diff --git a/lld/lib/ReaderWriter/CoreTargetInfo.cpp b/lld/lib/ReaderWriter/CoreTargetInfo.cpp index 75d3727301b7..a4a4333d6b5d 100644 --- a/lld/lib/ReaderWriter/CoreTargetInfo.cpp +++ b/lld/lib/ReaderWriter/CoreTargetInfo.cpp @@ -358,12 +358,11 @@ void CoreTargetInfo::addPasses(PassManager &pm) const { } } -error_code -CoreTargetInfo::parseFile(std::unique_ptr mb, - std::vector> &result) const { +error_code CoreTargetInfo::parseFile(std::unique_ptr &mb, + std::vector> &result) const { if (!_reader) _reader = createReaderYAML(*this); - return _reader->parseFile(std::move(mb), result); + return _reader->parseFile(mb,result); } Writer &CoreTargetInfo::writer() const { diff --git a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp index 671df194a24d..db3a032feeb7 100644 --- a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp @@ -91,27 +91,27 @@ bool ELFTargetInfo::isDynamic() const { return false; } -error_code -ELFTargetInfo::parseFile(std::unique_ptr mb, - std::vector> &result) const { +error_code ELFTargetInfo::parseFile(std::unique_ptr &mb, + std::vector> &result) const { if (!_elfReader) _elfReader = createReaderELF(*this); - std::string path = mb->getBufferIdentifier(); - auto magic = llvm::sys::fs::identify_magic(mb->getBuffer()); - if (magic == llvm::sys::fs::file_magic::elf_relocatable || - magic == llvm::sys::fs::file_magic::elf_shared_object || - magic == llvm::sys::fs::file_magic::archive) - return _elfReader->parseFile(std::move(mb), result); - // Not an ELF file, check file extension to see if it might be yaml - if (StringRef(path).endswith(".objtxt")) { - if (!_yamlReader) - _yamlReader = createReaderYAML(*this); - return _yamlReader->parseFile(std::move(mb), result); + error_code ec = _elfReader->parseFile(mb, result); + if (ec) { + // Not an ELF file, check file extension to see if it might be yaml + StringRef path = mb->getBufferIdentifier(); + if ( path.endswith(".objtxt") ) { + if (!_yamlReader) + _yamlReader = createReaderYAML(*this); + ec = _yamlReader->parseFile(mb, result); + } + if (ec) { + // Not a yaml file, assume it is a linkerscript + if (!_linkerScriptReader) + _linkerScriptReader.reset(new ReaderLinkerScript(*this)); + ec = _linkerScriptReader->parseFile(mb, result); + } } - // Not a yaml file, assume it is a linkerscript - if (!_linkerScriptReader) - _linkerScriptReader.reset(new ReaderLinkerScript(*this)); - return _linkerScriptReader->parseFile(std::move(mb), result); + return ec; } Writer &ELFTargetInfo::writer() const { diff --git a/lld/lib/ReaderWriter/ELF/Reader.cpp b/lld/lib/ReaderWriter/ELF/Reader.cpp index 28517611bb45..cb6e9cde00fe 100644 --- a/lld/lib/ReaderWriter/ELF/Reader.cpp +++ b/lld/lib/ReaderWriter/ELF/Reader.cpp @@ -82,8 +82,8 @@ public: : lld::Reader(ti), _elfTargetInfo(ti), _readerArchive(ti, *this) { } - error_code parseFile(std::unique_ptr mb, - std::vector> &result) const { + error_code parseFile(std::unique_ptr &mb, + std::vector > &result) const { using llvm::object::ELFType; llvm::sys::LLVMFileType fileType = llvm::sys::IdentifyFileType(mb->getBufferStart(), @@ -96,7 +96,7 @@ public: switch (fileType) { case llvm::sys::ELF_Relocatable_FileType: { std::unique_ptr f(createELF( - getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo, std::move(mb), + getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb), ec)); if (ec) return ec; @@ -105,15 +105,14 @@ public: } case llvm::sys::ELF_SharedObject_FileType: { auto f = createELF( - getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo, - std::move(mb)); + getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb)); if (!f) return f; result.push_back(std::move(*f)); break; } case llvm::sys::Archive_FileType: - ec = _readerArchive.parseFile(std::move(mb), result); + ec = _readerArchive.parseFile(mb, result); break; default: return llvm::make_error_code(llvm::errc::executable_format_error); diff --git a/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp b/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp index bc01ae0082b1..7ada6dad8e25 100644 --- a/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp +++ b/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp @@ -209,16 +209,15 @@ void MachOTargetInfo::addPasses(PassManager &pm) const { pm.add(std::unique_ptr(new LayoutPass())); } -error_code MachOTargetInfo::parseFile( - std::unique_ptr mb, - std::vector> &result) const { +error_code MachOTargetInfo::parseFile(std::unique_ptr &mb, + std::vector> &result) const { // if (!_machoReader) // _machoReader = createReaderMachO(*this); // error_code ec = _machoReader->parseFile(mb,result); // if (ec) { if (!_yamlReader) _yamlReader = createReaderYAML(*this); - return _yamlReader->parseFile(std::move(mb), result); + return _yamlReader->parseFile(mb, result); // } return error_code::success(); diff --git a/lld/lib/ReaderWriter/Native/ReaderNative.cpp b/lld/lib/ReaderWriter/Native/ReaderNative.cpp index bccd8b8652e1..ac3cf3bfe410 100644 --- a/lld/lib/ReaderWriter/Native/ReaderNative.cpp +++ b/lld/lib/ReaderWriter/Native/ReaderNative.cpp @@ -915,9 +915,9 @@ public: Reader(const TargetInfo &ti) : lld::Reader(ti) {} - virtual error_code - parseFile(std::unique_ptr mb, - std::vector> &result) const { + virtual error_code parseFile( + std::unique_ptr &mb, + std::vector > &result) const { return File::make(_targetInfo, mb, mb->getBufferIdentifier(), result); } }; diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp index 5b1fde427208..b752a794117b 100644 --- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp @@ -369,8 +369,8 @@ class ReaderCOFF : public Reader { public: ReaderCOFF(const TargetInfo &ti) : Reader(ti) {} - error_code parseFile(std::unique_ptr mb, - std::vector> &result) const { + error_code parseFile(std::unique_ptr &mb, + std::vector > &result) const { llvm::error_code ec; std::unique_ptr f(new FileCOFF(_targetInfo, std::move(mb), ec)); if (ec) { diff --git a/lld/lib/ReaderWriter/Reader.cpp b/lld/lib/ReaderWriter/Reader.cpp index 7da1f3113585..9f08ed274367 100644 --- a/lld/lib/ReaderWriter/Reader.cpp +++ b/lld/lib/ReaderWriter/Reader.cpp @@ -24,6 +24,7 @@ error_code Reader::readFile(StringRef path, if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb)) return ec; - return parseFile(std::unique_ptr(opmb.take()), result); + std::unique_ptr mb(opmb.take()); + return this->parseFile(mb, result); } } // end namespace lld diff --git a/lld/lib/ReaderWriter/ReaderArchive.cpp b/lld/lib/ReaderWriter/ReaderArchive.cpp index c59a04de9270..1928e2fa0f78 100644 --- a/lld/lib/ReaderWriter/ReaderArchive.cpp +++ b/lld/lib/ReaderWriter/ReaderArchive.cpp @@ -48,7 +48,7 @@ public: if (_targetInfo.logInputFiles()) llvm::outs() << buff->getBufferIdentifier() << "\n"; std::unique_ptr mb(buff.take()); - if (_targetInfo.parseFile(std::move(mb), result)) + if (_targetInfo.parseFile(mb, result)) return nullptr; assert(result.size() == 1); @@ -159,9 +159,8 @@ public: // Returns a vector of Files that are contained in the archive file // pointed to by the MemoryBuffer -error_code -ReaderArchive::parseFile(std::unique_ptr mb, - std::vector> &result) const { +error_code ReaderArchive::parseFile(std::unique_ptr &mb, + std::vector> &result) const { error_code ec; if (_targetInfo.forceLoadAllArchives()) { @@ -177,7 +176,7 @@ ReaderArchive::parseFile(std::unique_ptr mb, std::unique_ptr mbc(buff.take()); if (_targetInfo.logInputFiles()) llvm::outs() << buff->getBufferIdentifier() << "\n"; - if ((ec = _targetInfo.parseFile(std::move(mbc), result))) + if ((ec = _targetInfo.parseFile(mbc, result))) return ec; } } else { diff --git a/lld/lib/ReaderWriter/ReaderLinkerScript.cpp b/lld/lib/ReaderWriter/ReaderLinkerScript.cpp index 12f81c91e746..646f97e7f462 100644 --- a/lld/lib/ReaderWriter/ReaderLinkerScript.cpp +++ b/lld/lib/ReaderWriter/ReaderLinkerScript.cpp @@ -79,9 +79,9 @@ private: } // end anon namespace namespace lld { -error_code ReaderLinkerScript::parseFile( - std::unique_ptr mb, - std::vector> &result) const { +error_code +ReaderLinkerScript::parseFile(std::unique_ptr &mb, + std::vector > &result) const { auto lsf = LinkerScriptFile::create(_targetInfo, std::move(mb)); if (!lsf) return lsf; diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index 26678cc4f3a9..c07bf56a3451 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -1342,7 +1342,7 @@ class ReaderYAML : public Reader { public: ReaderYAML(const TargetInfo &ti) : Reader(ti) {} - error_code parseFile(std::unique_ptr mb, + error_code parseFile(std::unique_ptr &mb, std::vector> &result) const { // Note: we do not take ownership of the MemoryBuffer. That is // because yaml may produce multiple File objects, so there is no