Correctly pass ownership of MemoryBuffers.

llvm-svn: 178914
This commit is contained in:
Michael J. Spencer 2013-04-05 21:08:30 +00:00
parent 096ea03f31
commit ce1e53e19c
18 changed files with 72 additions and 73 deletions

View File

@ -260,7 +260,8 @@ public:
/// \param [out] result The instantiated lld::File object is returned here. /// \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 /// The \p result is a vector because some input files parse into more than
/// one lld::File (e.g. YAML). /// one lld::File (e.g. YAML).
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &inputBuff, virtual error_code
parseFile(std::unique_ptr<MemoryBuffer> inputBuff,
std::vector<std::unique_ptr<File>> &result) const = 0; std::vector<std::unique_ptr<File>> &result) const = 0;
/// This is a wrapper around parseFile() where the input file is specified /// This is a wrapper around parseFile() where the input file is specified
@ -269,9 +270,8 @@ public:
/// ///
/// \param path This is the file system path to the input file. /// \param path This is the file system path to the input file.
/// \param [out] result The instantiated lld::File object is returned here. /// \param [out] result The instantiated lld::File object is returned here.
virtual error_code readFile(StringRef path, virtual error_code
std::vector<std::unique_ptr<File>> &result) const; readFile(StringRef path, std::vector<std::unique_ptr<File>> &result) const;
/// This method is called by core linking to give the Writer a chance /// 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 /// to add file format specific "files" to set of files to be linked. This is

View File

@ -30,11 +30,10 @@ public:
virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const; virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const; virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
virtual error_code
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const; std::vector<std::unique_ptr<File>> &result) const;
void addPassNamed(StringRef name) { void addPassNamed(StringRef name) {
_passNames.push_back(name); _passNames.push_back(name);
} }

View File

@ -57,8 +57,8 @@ public:
} }
virtual bool validate(raw_ostream &diagnostics); virtual bool validate(raw_ostream &diagnostics);
virtual error_code
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const; std::vector<std::unique_ptr<File>> &result) const;
static std::unique_ptr<ELFTargetInfo> create(llvm::Triple); static std::unique_ptr<ELFTargetInfo> create(llvm::Triple);

View File

@ -32,7 +32,8 @@ public:
virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const; virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
virtual bool validate(raw_ostream &diagnostics); virtual bool validate(raw_ostream &diagnostics);
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, virtual error_code
parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const; std::vector<std::unique_ptr<File>> &result) const;
uint32_t getCPUType() const; uint32_t getCPUType() const;

View File

@ -39,7 +39,8 @@ public:
/// file) and create a File object. /// file) and create a File object.
/// ///
/// On success, the resulting File object takes ownership of the MemoryBuffer. /// On success, the resulting File object takes ownership of the MemoryBuffer.
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, virtual error_code
parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const = 0; std::vector<std::unique_ptr<File>> &result) const = 0;
protected: protected:

View File

@ -35,7 +35,7 @@ public:
/// \brief Returns a vector of Files that are contained in the archive file /// \brief Returns a vector of Files that are contained in the archive file
/// pointed to by the Memorybuffer /// pointed to by the Memorybuffer
error_code parseFile(std::unique_ptr<llvm::MemoryBuffer> &mb, error_code parseFile(std::unique_ptr<llvm::MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const; std::vector<std::unique_ptr<File>> &result) const;
private: private:

View File

@ -26,7 +26,7 @@ public:
/// \brief Returns a vector of Files that are contained in the archive file /// \brief Returns a vector of Files that are contained in the archive file
/// pointed to by the Memorybuffer /// pointed to by the Memorybuffer
error_code parseFile(std::unique_ptr<llvm::MemoryBuffer> &mb, error_code parseFile(std::unique_ptr<llvm::MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const; std::vector<std::unique_ptr<File>> &result) const;
}; };

View File

@ -38,8 +38,7 @@ error_code TargetInfo::readFile(StringRef path,
if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb)) if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb))
return ec; return ec;
std::unique_ptr<MemoryBuffer> mb(opmb.take()); return this->parseFile(std::unique_ptr<MemoryBuffer>(opmb.take()), result);
return this->parseFile(mb, result);
} }
error_code TargetInfo::writeFile(const File &linkedFile) const { error_code TargetInfo::writeFile(const File &linkedFile) const {

View File

@ -358,12 +358,12 @@ void CoreTargetInfo::addPasses(PassManager &pm) const {
} }
} }
error_code
error_code CoreTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb, CoreTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
if (!_reader) if (!_reader)
_reader = createReaderYAML(*this); _reader = createReaderYAML(*this);
return _reader->parseFile(mb,result); return _reader->parseFile(std::move(mb), result);
} }
Writer &CoreTargetInfo::writer() const { Writer &CoreTargetInfo::writer() const {

View File

@ -91,28 +91,27 @@ bool ELFTargetInfo::isDynamic() const {
return false; return false;
} }
error_code
error_code ELFTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb, ELFTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
if (!_elfReader) if (!_elfReader)
_elfReader = createReaderELF(*this); _elfReader = createReaderELF(*this);
error_code ec = _elfReader->parseFile(mb, result); std::string path = mb->getBufferIdentifier();
if (ec) { 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 // Not an ELF file, check file extension to see if it might be yaml
StringRef path = mb->getBufferIdentifier(); if (StringRef(path).endswith(".objtxt")) {
if ( path.endswith(".objtxt") ) {
if (!_yamlReader) if (!_yamlReader)
_yamlReader = createReaderYAML(*this); _yamlReader = createReaderYAML(*this);
ec = _yamlReader->parseFile(mb, result); return _yamlReader->parseFile(std::move(mb), result);
} }
if (ec) {
// Not a yaml file, assume it is a linkerscript // Not a yaml file, assume it is a linkerscript
if (!_linkerScriptReader) if (!_linkerScriptReader)
_linkerScriptReader.reset(new ReaderLinkerScript(*this)); _linkerScriptReader.reset(new ReaderLinkerScript(*this));
ec = _linkerScriptReader->parseFile(mb, result); return _linkerScriptReader->parseFile(std::move(mb), result);
}
}
return ec;
} }
Writer &ELFTargetInfo::writer() const { Writer &ELFTargetInfo::writer() const {

View File

@ -82,7 +82,7 @@ public:
: lld::Reader(ti), _elfTargetInfo(ti), _readerArchive(ti, *this) { : lld::Reader(ti), _elfTargetInfo(ti), _readerArchive(ti, *this) {
} }
error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
using llvm::object::ELFType; using llvm::object::ELFType;
llvm::sys::LLVMFileType fileType = llvm::sys::LLVMFileType fileType =
@ -96,7 +96,7 @@ public:
switch (fileType) { switch (fileType) {
case llvm::sys::ELF_Relocatable_FileType: { case llvm::sys::ELF_Relocatable_FileType: {
std::unique_ptr<File> f(createELF<ELFFileCreateELFTraits>( std::unique_ptr<File> f(createELF<ELFFileCreateELFTraits>(
getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb), getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo, std::move(mb),
ec)); ec));
if (ec) if (ec)
return ec; return ec;
@ -105,14 +105,15 @@ public:
} }
case llvm::sys::ELF_SharedObject_FileType: { case llvm::sys::ELF_SharedObject_FileType: {
auto f = createELF<DynamicFileCreateELFTraits>( auto f = createELF<DynamicFileCreateELFTraits>(
getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb)); getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo,
std::move(mb));
if (!f) if (!f)
return f; return f;
result.push_back(std::move(*f)); result.push_back(std::move(*f));
break; break;
} }
case llvm::sys::Archive_FileType: case llvm::sys::Archive_FileType:
ec = _readerArchive.parseFile(mb, result); ec = _readerArchive.parseFile(std::move(mb), result);
break; break;
default: default:
return llvm::make_error_code(llvm::errc::executable_format_error); return llvm::make_error_code(llvm::errc::executable_format_error);

View File

@ -209,9 +209,8 @@ void MachOTargetInfo::addPasses(PassManager &pm) const {
pm.add(std::unique_ptr<Pass>(new LayoutPass())); pm.add(std::unique_ptr<Pass>(new LayoutPass()));
} }
error_code MachOTargetInfo::parseFile(
std::unique_ptr<MemoryBuffer> mb,
error_code MachOTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
// if (!_machoReader) // if (!_machoReader)
// _machoReader = createReaderMachO(*this); // _machoReader = createReaderMachO(*this);
@ -219,7 +218,7 @@ error_code MachOTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb,
// if (ec) { // if (ec) {
if (!_yamlReader) if (!_yamlReader)
_yamlReader = createReaderYAML(*this); _yamlReader = createReaderYAML(*this);
return _yamlReader->parseFile(mb,result); return _yamlReader->parseFile(std::move(mb), result);
// } // }
return error_code::success(); return error_code::success();

View File

@ -915,8 +915,8 @@ public:
Reader(const TargetInfo &ti) Reader(const TargetInfo &ti)
: lld::Reader(ti) {} : lld::Reader(ti) {}
virtual error_code parseFile( virtual error_code
std::unique_ptr<MemoryBuffer> &mb, parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<lld::File>> &result) const { std::vector<std::unique_ptr<lld::File>> &result) const {
return File::make(_targetInfo, mb, mb->getBufferIdentifier(), result); return File::make(_targetInfo, mb, mb->getBufferIdentifier(), result);
} }

View File

@ -369,7 +369,7 @@ class ReaderCOFF : public Reader {
public: public:
ReaderCOFF(const TargetInfo &ti) : Reader(ti) {} ReaderCOFF(const TargetInfo &ti) : Reader(ti) {}
error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
llvm::error_code ec; llvm::error_code ec;
std::unique_ptr<File> f(new FileCOFF(_targetInfo, std::move(mb), ec)); std::unique_ptr<File> f(new FileCOFF(_targetInfo, std::move(mb), ec));

View File

@ -24,7 +24,6 @@ error_code Reader::readFile(StringRef path,
if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb)) if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb))
return ec; return ec;
std::unique_ptr<MemoryBuffer> mb(opmb.take()); return parseFile(std::unique_ptr<MemoryBuffer>(opmb.take()), result);
return this->parseFile(mb, result);
} }
} // end namespace lld } // end namespace lld

View File

@ -48,7 +48,7 @@ public:
if (_targetInfo.logInputFiles()) if (_targetInfo.logInputFiles())
llvm::outs() << buff->getBufferIdentifier() << "\n"; llvm::outs() << buff->getBufferIdentifier() << "\n";
std::unique_ptr<MemoryBuffer> mb(buff.take()); std::unique_ptr<MemoryBuffer> mb(buff.take());
if (_targetInfo.parseFile(mb, result)) if (_targetInfo.parseFile(std::move(mb), result))
return nullptr; return nullptr;
assert(result.size() == 1); assert(result.size() == 1);
@ -159,7 +159,8 @@ public:
// Returns a vector of Files that are contained in the archive file // Returns a vector of Files that are contained in the archive file
// pointed to by the MemoryBuffer // pointed to by the MemoryBuffer
error_code ReaderArchive::parseFile(std::unique_ptr<llvm::MemoryBuffer> &mb, error_code
ReaderArchive::parseFile(std::unique_ptr<llvm::MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
error_code ec; error_code ec;
@ -176,7 +177,7 @@ error_code ReaderArchive::parseFile(std::unique_ptr<llvm::MemoryBuffer> &mb,
std::unique_ptr<MemoryBuffer> mbc(buff.take()); std::unique_ptr<MemoryBuffer> mbc(buff.take());
if (_targetInfo.logInputFiles()) if (_targetInfo.logInputFiles())
llvm::outs() << buff->getBufferIdentifier() << "\n"; llvm::outs() << buff->getBufferIdentifier() << "\n";
if ((ec = _targetInfo.parseFile(mbc, result))) if ((ec = _targetInfo.parseFile(std::move(mbc), result)))
return ec; return ec;
} }
} else { } else {

View File

@ -79,8 +79,8 @@ private:
} // end anon namespace } // end anon namespace
namespace lld { namespace lld {
error_code error_code ReaderLinkerScript::parseFile(
ReaderLinkerScript::parseFile(std::unique_ptr<llvm::MemoryBuffer> &mb, std::unique_ptr<llvm::MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
auto lsf = LinkerScriptFile::create(_targetInfo, std::move(mb)); auto lsf = LinkerScriptFile::create(_targetInfo, std::move(mb));
if (!lsf) if (!lsf)

View File

@ -1342,7 +1342,7 @@ class ReaderYAML : public Reader {
public: public:
ReaderYAML(const TargetInfo &ti) : Reader(ti) {} ReaderYAML(const TargetInfo &ti) : Reader(ti) {}
error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
std::vector<std::unique_ptr<File>> &result) const { std::vector<std::unique_ptr<File>> &result) const {
// Note: we do not take ownership of the MemoryBuffer. That is // Note: we do not take ownership of the MemoryBuffer. That is
// because yaml may produce multiple File objects, so there is no // because yaml may produce multiple File objects, so there is no