From 0d50598d71c5cc81c0e777a0ddf3e692e634f565 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 24 Jun 2014 13:56:32 +0000 Subject: Pass a unique_ptr to the constructors in the Binary hierarchy. Once the objects are constructed, they own the buffer. Passing a unique_ptr makes that clear. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211595 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/Archive.cpp | 13 ++++++------- lib/Object/Binary.cpp | 8 ++++---- lib/Object/COFFObjectFile.cpp | 11 +++++++---- lib/Object/ELFObjectFile.cpp | 16 ++++++++-------- lib/Object/IRObjectFile.cpp | 17 +++++++++-------- lib/Object/MachOObjectFile.cpp | 15 ++++++++------- lib/Object/MachOUniversal.cpp | 17 +++++++++-------- lib/Object/ObjectFile.cpp | 6 +++--- lib/Object/SymbolicFile.cpp | 7 ++++--- 9 files changed, 58 insertions(+), 52 deletions(-) (limited to 'lib/Object') diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index cdf987a320..2393ade562 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -186,20 +186,19 @@ Archive::Child::getAsBinary(LLVMContext *Context) const { return createBinary(Buff, Context); } -ErrorOr Archive::create(MemoryBuffer *Source) { +ErrorOr Archive::create(std::unique_ptr Source) { std::error_code EC; - std::unique_ptr Ret(new Archive(Source, EC)); + std::unique_ptr Ret(new Archive(std::move(Source), EC)); if (EC) return EC; return Ret.release(); } -Archive::Archive(MemoryBuffer *source, std::error_code &ec) - : Binary(Binary::ID_Archive, source), SymbolTable(child_end()) { +Archive::Archive(std::unique_ptr Source, std::error_code &ec) + : Binary(Binary::ID_Archive, std::move(Source)), SymbolTable(child_end()) { // Check for sufficient magic. - assert(source); - if (source->getBufferSize() < 8 || - StringRef(source->getBufferStart(), 8) != Magic) { + if (Data->getBufferSize() < 8 || + StringRef(Data->getBufferStart(), 8) != Magic) { ec = object_error::invalid_file_type; return; } diff --git a/lib/Object/Binary.cpp b/lib/Object/Binary.cpp index ee6f58cd75..8d79a96662 100644 --- a/lib/Object/Binary.cpp +++ b/lib/Object/Binary.cpp @@ -27,8 +27,8 @@ using namespace object; Binary::~Binary() {} -Binary::Binary(unsigned int Type, MemoryBuffer *Source) - : TypeID(Type), Data(Source) {} +Binary::Binary(unsigned int Type, std::unique_ptr Source) + : TypeID(Type), Data(std::move(Source)) {} StringRef Binary::getData() const { return Data->getBuffer(); @@ -44,7 +44,7 @@ ErrorOr object::createBinary(std::unique_ptr &Buffer, switch (Type) { case sys::fs::file_magic::archive: - return Archive::create(Buffer.release()); + return Archive::create(std::move(Buffer)); case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_executable: case sys::fs::file_magic::elf_shared_object: @@ -65,7 +65,7 @@ ErrorOr object::createBinary(std::unique_ptr &Buffer, case sys::fs::file_magic::bitcode: return ObjectFile::createSymbolicFile(Buffer, Type, Context); case sys::fs::file_magic::macho_universal_binary: - return MachOUniversalBinary::create(Buffer.release()); + return MachOUniversalBinary::create(std::move(Buffer)); case sys::fs::file_magic::unknown: case sys::fs::file_magic::windows_resource: // Unrecognized object file format. diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 1b149742eb..46ef87d156 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -511,8 +511,9 @@ std::error_code COFFObjectFile::initExportTablePtr() { return object_error::success; } -COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, std::error_code &EC) - : ObjectFile(Binary::ID_COFF, Object), COFFHeader(nullptr), +COFFObjectFile::COFFObjectFile(std::unique_ptr Object, + std::error_code &EC) + : ObjectFile(Binary::ID_COFF, std::move(Object)), COFFHeader(nullptr), PE32Header(nullptr), PE32PlusHeader(nullptr), DataDirectory(nullptr), SectionTable(nullptr), SymbolTable(nullptr), StringTable(nullptr), StringTableSize(0), ImportDirectory(nullptr), NumberOfImportDirectory(0), @@ -1111,9 +1112,11 @@ ExportDirectoryEntryRef::getSymbolName(StringRef &Result) const { return object_error::success; } -ErrorOr ObjectFile::createCOFFObjectFile(MemoryBuffer *Object) { +ErrorOr +ObjectFile::createCOFFObjectFile(std::unique_ptr Object) { std::error_code EC; - std::unique_ptr Ret(new COFFObjectFile(Object, EC)); + std::unique_ptr Ret( + new COFFObjectFile(std::move(Object), EC)); if (EC) return EC; return Ret.release(); diff --git a/lib/Object/ELFObjectFile.cpp b/lib/Object/ELFObjectFile.cpp index a9165af79d..7095caf1a6 100644 --- a/lib/Object/ELFObjectFile.cpp +++ b/lib/Object/ELFObjectFile.cpp @@ -34,7 +34,7 @@ ObjectFile::createELFObjectFile(std::unique_ptr &Obj) { #endif if (MaxAlignment >= 2) R.reset(new ELFObjectFile>( - Obj.release(), EC)); + std::move(Obj), EC)); else return object_error::parse_failed; else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) @@ -45,32 +45,32 @@ ObjectFile::createELFObjectFile(std::unique_ptr &Obj) { else #endif if (MaxAlignment >= 2) - R.reset(new ELFObjectFile>(Obj.release(), + R.reset(new ELFObjectFile>(std::move(Obj), EC)); else return object_error::parse_failed; else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) #if !LLVM_IS_UNALIGNED_ACCESS_FAST if (MaxAlignment >= 8) - R.reset( - new ELFObjectFile>(Obj.release(), EC)); + R.reset(new ELFObjectFile>(std::move(Obj), + EC)); else #endif if (MaxAlignment >= 2) - R.reset( - new ELFObjectFile>(Obj.release(), EC)); + R.reset(new ELFObjectFile>(std::move(Obj), + EC)); else return object_error::parse_failed; else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { #if !LLVM_IS_UNALIGNED_ACCESS_FAST if (MaxAlignment >= 8) R.reset(new ELFObjectFile>( - Obj.release(), EC)); + std::move(Obj), EC)); else #endif if (MaxAlignment >= 2) R.reset(new ELFObjectFile>( - Obj.release(), EC)); + std::move(Obj), EC)); else return object_error::parse_failed; } diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index ef544aa13b..f20ce6cf66 100644 --- a/lib/Object/IRObjectFile.cpp +++ b/lib/Object/IRObjectFile.cpp @@ -17,14 +17,15 @@ #include "llvm/IR/Mangler.h" #include "llvm/IR/Module.h" #include "llvm/Object/IRObjectFile.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; using namespace object; -IRObjectFile::IRObjectFile(MemoryBuffer *Object, std::error_code &EC, - LLVMContext &Context) - : SymbolicFile(Binary::ID_IR, Object) { - ErrorOr MOrErr = getLazyBitcodeModule(Object, Context); +IRObjectFile::IRObjectFile(std::unique_ptr Object, + std::error_code &EC, LLVMContext &Context) + : SymbolicFile(Binary::ID_IR, std::move(Object)) { + ErrorOr MOrErr = getLazyBitcodeModule(Data.get(), Context); if ((EC = MOrErr.getError())) return; @@ -153,11 +154,11 @@ basic_symbol_iterator IRObjectFile::symbol_end_impl() const { return basic_symbol_iterator(BasicSymbolRef(Ret, this)); } -ErrorOr -llvm::object::SymbolicFile::createIRObjectFile(MemoryBuffer *Object, - LLVMContext &Context) { +ErrorOr llvm::object::SymbolicFile::createIRObjectFile( + std::unique_ptr Object, LLVMContext &Context) { std::error_code EC; - std::unique_ptr Ret(new IRObjectFile(Object, EC, Context)); + std::unique_ptr Ret( + new IRObjectFile(std::move(Object), EC, Context)); if (EC) return EC; return Ret.release(); diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 45fc5ea735..09c842c4a0 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -422,9 +422,10 @@ static uint32_t getSectionFlags(const MachOObjectFile *O, return Sect.flags; } -MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, bool IsLittleEndian, - bool Is64bits, std::error_code &EC) - : ObjectFile(getMachOType(IsLittleEndian, Is64bits), Object), +MachOObjectFile::MachOObjectFile(std::unique_ptr Object, + bool IsLittleEndian, bool Is64bits, + std::error_code &EC) + : ObjectFile(getMachOType(IsLittleEndian, Is64bits), std::move(Object)), SymtabLoadCmd(nullptr), DysymtabLoadCmd(nullptr), DataInCodeLoadCmd(nullptr) { uint32_t LoadCommandCount = this->getHeader().ncmds; @@ -1817,13 +1818,13 @@ ObjectFile::createMachOObjectFile(std::unique_ptr &Buffer) { std::error_code EC; std::unique_ptr Ret; if (Magic == "\xFE\xED\xFA\xCE") - Ret.reset(new MachOObjectFile(Buffer.release(), false, false, EC)); + Ret.reset(new MachOObjectFile(std::move(Buffer), false, false, EC)); else if (Magic == "\xCE\xFA\xED\xFE") - Ret.reset(new MachOObjectFile(Buffer.release(), true, false, EC)); + Ret.reset(new MachOObjectFile(std::move(Buffer), true, false, EC)); else if (Magic == "\xFE\xED\xFA\xCF") - Ret.reset(new MachOObjectFile(Buffer.release(), false, true, EC)); + Ret.reset(new MachOObjectFile(std::move(Buffer), false, true, EC)); else if (Magic == "\xCF\xFA\xED\xFE") - Ret.reset(new MachOObjectFile(Buffer.release(), true, true, EC)); + Ret.reset(new MachOObjectFile(std::move(Buffer), true, true, EC)); else return object_error::parse_failed; diff --git a/lib/Object/MachOUniversal.cpp b/lib/Object/MachOUniversal.cpp index 330454ac5a..4ba5d96864 100644 --- a/lib/Object/MachOUniversal.cpp +++ b/lib/Object/MachOUniversal.cpp @@ -86,9 +86,9 @@ std::error_code MachOUniversalBinary::ObjectForArch::getAsArchive( StringRef ParentData = Parent->getData(); StringRef ObjectData = ParentData.substr(Header.offset, Header.size); std::string ObjectName = Parent->getFileName().str(); - MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer( - ObjectData, ObjectName, false); - ErrorOr Obj = Archive::create(ObjBuffer); + std::unique_ptr ObjBuffer( + MemoryBuffer::getMemBuffer(ObjectData, ObjectName, false)); + ErrorOr Obj = Archive::create(std::move(ObjBuffer)); if (std::error_code EC = Obj.getError()) return EC; Result.reset(Obj.get()); @@ -100,19 +100,20 @@ std::error_code MachOUniversalBinary::ObjectForArch::getAsArchive( void MachOUniversalBinary::anchor() { } ErrorOr -MachOUniversalBinary::create(MemoryBuffer *Source) { +MachOUniversalBinary::create(std::unique_ptr Source) { std::error_code EC; std::unique_ptr Ret( - new MachOUniversalBinary(Source, EC)); + new MachOUniversalBinary(std::move(Source), EC)); if (EC) return EC; return Ret.release(); } -MachOUniversalBinary::MachOUniversalBinary(MemoryBuffer *Source, +MachOUniversalBinary::MachOUniversalBinary(std::unique_ptr Source, std::error_code &ec) - : Binary(Binary::ID_MachOUniversalBinary, Source), NumberOfObjects(0) { - if (Source->getBufferSize() < sizeof(MachO::fat_header)) { + : Binary(Binary::ID_MachOUniversalBinary, std::move(Source)), + NumberOfObjects(0) { + if (Data->getBufferSize() < sizeof(MachO::fat_header)) { ec = object_error::invalid_file_type; return; } diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index ee2680e6ba..591ed28262 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -23,8 +23,8 @@ using namespace object; void ObjectFile::anchor() { } -ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *Source) - : SymbolicFile(Type, Source) {} +ObjectFile::ObjectFile(unsigned int Type, std::unique_ptr Source) + : SymbolicFile(Type, std::move(Source)) {} std::error_code ObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const { @@ -77,7 +77,7 @@ ObjectFile::createObjectFile(std::unique_ptr &Object, case sys::fs::file_magic::coff_object: case sys::fs::file_magic::coff_import_library: case sys::fs::file_magic::pecoff_executable: - return createCOFFObjectFile(Object.release()); + return createCOFFObjectFile(std::move(Object)); } llvm_unreachable("Unexpected Object File Type"); } diff --git a/lib/Object/SymbolicFile.cpp b/lib/Object/SymbolicFile.cpp index 46aba3cf05..30cf1a03f4 100644 --- a/lib/Object/SymbolicFile.cpp +++ b/lib/Object/SymbolicFile.cpp @@ -19,8 +19,9 @@ using namespace llvm; using namespace object; -SymbolicFile::SymbolicFile(unsigned int Type, MemoryBuffer *Source) - : Binary(Type, Source) {} +SymbolicFile::SymbolicFile(unsigned int Type, + std::unique_ptr Source) + : Binary(Type, std::move(Source)) {} SymbolicFile::~SymbolicFile() {} @@ -34,7 +35,7 @@ SymbolicFile::createSymbolicFile(std::unique_ptr &Object, switch (Type) { case sys::fs::file_magic::bitcode: if (Context) - return IRObjectFile::createIRObjectFile(Object.release(), *Context); + return IRObjectFile::createIRObjectFile(std::move(Object), *Context); // Fallthrough case sys::fs::file_magic::unknown: case sys::fs::file_magic::archive: -- cgit v1.2.3