diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-08-19 18:44:46 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-08-19 18:44:46 +0000 |
commit | 548f2b6e8fc5499fa8c9394fe7d110f50c487802 (patch) | |
tree | fac1350c700e14ca8f9ea779ceb6228caeaff1a0 /tools | |
parent | 2ac376ba349bd1b4cc5cdc6bde24547e2824f061 (diff) |
Don't own the buffer in object::Binary.
Owning the buffer is somewhat inflexible. Some Binaries have sub Binaries
(like Archive) and we had to create dummy buffers just to handle that. It is
also a bad fit for IRObjectFile where the Module wants to own the buffer too.
Keeping this ownership would make supporting IR inside native objects
particularly painful.
This patch focuses in lib/Object. If something elsewhere used to own an Binary,
now it also owns a MemoryBuffer.
This patch introduces a few new types.
* MemoryBufferRef. This is just a pair of StringRefs for the data and name.
This is to MemoryBuffer as StringRef is to std::string.
* OwningBinary. A combination of Binary and a MemoryBuffer. This is needed
for convenience functions that take a filename and return both the
buffer and the Binary using that buffer.
The C api now uses OwningBinary to avoid any change in semantics. I will start
a new thread to see if we want to change it and how.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216002 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lli/lli.cpp | 21 | ||||
-rw-r--r-- | tools/llvm-ar/llvm-ar.cpp | 29 | ||||
-rw-r--r-- | tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 7 | ||||
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-objdump/MachODump.cpp | 18 | ||||
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 4 | ||||
-rw-r--r-- | tools/llvm-readobj/llvm-readobj.cpp | 4 | ||||
-rw-r--r-- | tools/llvm-size/llvm-size.cpp | 4 | ||||
-rw-r--r-- | tools/llvm-symbolizer/LLVMSymbolize.cpp | 18 | ||||
-rw-r--r-- | tools/llvm-symbolizer/LLVMSymbolize.h | 6 | ||||
-rw-r--r-- | tools/llvm-vtabledump/llvm-vtabledump.cpp | 4 | ||||
-rw-r--r-- | tools/macho-dump/macho-dump.cpp | 4 | ||||
-rw-r--r-- | tools/obj2yaml/obj2yaml.cpp | 4 |
13 files changed, 72 insertions, 53 deletions
diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index f833f63fc6c..c8edf552945 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -263,7 +263,7 @@ public: } virtual ~LLIObjectCache() {} - void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) override { + void notifyObjectCompiled(const Module *M, MemoryBufferRef Obj) override { const std::string ModuleID = M->getModuleIdentifier(); std::string CacheName; if (!getCacheFilename(ModuleID, CacheName)) @@ -275,7 +275,7 @@ public: sys::fs::create_directories(Twine(dir)); } raw_fd_ostream outfile(CacheName.c_str(), errStr, sys::fs::F_None); - outfile.write(Obj->getBufferStart(), Obj->getBufferSize()); + outfile.write(Obj.getBufferStart(), Obj.getBufferSize()); outfile.close(); } @@ -530,30 +530,35 @@ int main(int argc, char **argv, char * const *envp) { } for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) { - ErrorOr<std::unique_ptr<object::ObjectFile>> Obj = + ErrorOr<object::OwningBinary<object::ObjectFile>> Obj = object::ObjectFile::createObjectFile(ExtraObjects[i]); if (!Obj) { Err.print(argv[0], errs()); return 1; } - EE->addObjectFile(std::move(Obj.get())); + EE->addObjectFile(std::move(Obj.get().getBinary())); } for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) { - ErrorOr<std::unique_ptr<MemoryBuffer>> ArBuf = + ErrorOr<std::unique_ptr<MemoryBuffer>> ArBufOrErr = MemoryBuffer::getFileOrSTDIN(ExtraArchives[i]); - if (!ArBuf) { + if (!ArBufOrErr) { Err.print(argv[0], errs()); return 1; } + std::unique_ptr<MemoryBuffer> &ArBuf = ArBufOrErr.get(); ErrorOr<std::unique_ptr<object::Archive>> ArOrErr = - object::Archive::create(std::move(ArBuf.get())); + object::Archive::create(ArBuf->getMemBufferRef()); if (std::error_code EC = ArOrErr.getError()) { errs() << EC.message(); return 1; } - EE->addArchive(std::move(ArOrErr.get())); + std::unique_ptr<object::Archive> &Ar = ArOrErr.get(); + + object::OwningBinary<object::Archive> OB(std::move(Ar), std::move(ArBuf)); + + EE->addArchive(std::move(OB)); } // If the target is Cygwin/MingW and we are generating remote code, we diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 3d87597f39b..2b32098a490 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -686,7 +686,7 @@ static void writeStringTable(raw_fd_ostream &Out, static void writeSymbolTable(raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members, - MutableArrayRef<std::unique_ptr<MemoryBuffer>> Buffers, + ArrayRef<MemoryBufferRef> Buffers, std::vector<std::pair<unsigned, unsigned>> &MemberOffsetRefs) { unsigned StartOffset = 0; unsigned MemberNum = 0; @@ -697,7 +697,7 @@ writeSymbolTable(raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members, for (ArrayRef<NewArchiveIterator>::iterator I = Members.begin(), E = Members.end(); I != E; ++I, ++MemberNum) { - std::unique_ptr<MemoryBuffer> &MemberBuffer = Buffers[MemberNum]; + MemoryBufferRef MemberBuffer = Buffers[MemberNum]; ErrorOr<std::unique_ptr<object::SymbolicFile>> ObjOrErr = object::SymbolicFile::createSymbolicFile( MemberBuffer, sys::fs::file_magic::unknown, &Context); @@ -725,7 +725,6 @@ writeSymbolTable(raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members, MemberOffsetRefs.push_back(std::make_pair(Out.tell(), MemberNum)); print32BE(Out, 0); } - MemberBuffer.reset(Obj.releaseBuffer()); } Out << NameOS.str(); @@ -759,12 +758,12 @@ static void performWriteOperation(ArchiveOperation Operation, std::vector<std::pair<unsigned, unsigned> > MemberOffsetRefs; - std::vector<std::unique_ptr<MemoryBuffer>> MemberBuffers; - MemberBuffers.resize(NewMembers.size()); + std::vector<std::unique_ptr<MemoryBuffer>> Buffers; + std::vector<MemoryBufferRef> Members; for (unsigned I = 0, N = NewMembers.size(); I < N; ++I) { - std::unique_ptr<MemoryBuffer> &MemberBuffer = MemberBuffers[I]; NewArchiveIterator &Member = NewMembers[I]; + MemoryBufferRef MemberRef; if (Member.isNewMember()) { const char *Filename = Member.getNew(); @@ -773,18 +772,20 @@ static void performWriteOperation(ArchiveOperation Operation, ErrorOr<std::unique_ptr<MemoryBuffer>> MemberBufferOrErr = MemoryBuffer::getOpenFile(FD, Filename, Status.getSize(), false); failIfError(MemberBufferOrErr.getError(), Filename); - MemberBuffer = std::move(MemberBufferOrErr.get()); + Buffers.push_back(std::move(MemberBufferOrErr.get())); + MemberRef = Buffers.back()->getMemBufferRef(); } else { object::Archive::child_iterator OldMember = Member.getOld(); - ErrorOr<std::unique_ptr<MemoryBuffer>> MemberBufferOrErr = - OldMember->getMemoryBuffer(); + ErrorOr<MemoryBufferRef> MemberBufferOrErr = + OldMember->getMemoryBufferRef(); failIfError(MemberBufferOrErr.getError()); - MemberBuffer = std::move(MemberBufferOrErr.get()); + MemberRef = MemberBufferOrErr.get(); } + Members.push_back(MemberRef); } if (Symtab) { - writeSymbolTable(Out, NewMembers, MemberBuffers, MemberOffsetRefs); + writeSymbolTable(Out, NewMembers, Members, MemberOffsetRefs); } std::vector<unsigned> StringMapIndexes; @@ -808,7 +809,7 @@ static void performWriteOperation(ArchiveOperation Operation, } Out.seek(Pos); - const MemoryBuffer *File = MemberBuffers[MemberNum].get(); + MemoryBufferRef File = Members[MemberNum]; if (I->isNewMember()) { const char *FileName = I->getNew(); const sys::fs::file_status &Status = I->getStatus(); @@ -838,7 +839,7 @@ static void performWriteOperation(ArchiveOperation Operation, OldMember->getSize()); } - Out << File->getBuffer(); + Out << File.getBuffer(); if (Out.tell() % 2) Out << '\n'; @@ -943,7 +944,7 @@ static int performOperation(ArchiveOperation Operation) { } if (!EC) { - object::Archive Archive(std::move(Buf.get()), EC); + object::Archive Archive(Buf.get()->getMemBufferRef(), EC); if (EC) { errs() << ToolName << ": error loading '" << ArchiveName diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 4e65d444fc8..6af827683e1 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -66,16 +66,17 @@ DumpType("debug-dump", cl::init(DIDT_All), clEnumValEnd)); static void DumpInput(const StringRef &Filename) { - ErrorOr<std::unique_ptr<MemoryBuffer>> Buff = + ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr = MemoryBuffer::getFileOrSTDIN(Filename); - if (std::error_code EC = Buff.getError()) { + if (std::error_code EC = BuffOrErr.getError()) { errs() << Filename << ": " << EC.message() << "\n"; return; } + std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get()); ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = - ObjectFile::createObjectFile(Buff.get()); + ObjectFile::createObjectFile(Buff->getMemBufferRef()); if (std::error_code EC = ObjOrErr.getError()) { errs() << Filename << ": " << EC.message() << '\n'; return; diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 84d8dd5c973..6c3a9e27b71 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -1010,7 +1010,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { LLVMContext &Context = getGlobalContext(); ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = - createBinary(std::move(*BufferOrErr), &Context); + createBinary(BufferOrErr.get()->getMemBufferRef(), &Context); if (error(BinaryOrErr.getError(), Filename)) return; Binary &Bin = *BinaryOrErr.get(); diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 1cf92360054..de99bea15aa 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -210,15 +210,16 @@ static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF); void llvm::DisassembleInputMachO(StringRef Filename) { - ErrorOr<std::unique_ptr<MemoryBuffer>> Buff = + ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr = MemoryBuffer::getFileOrSTDIN(Filename); - if (std::error_code EC = Buff.getError()) { + if (std::error_code EC = BuffOrErr.getError()) { errs() << "llvm-objdump: " << Filename << ": " << EC.message() << "\n"; return; } + std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get()); - std::unique_ptr<MachOObjectFile> MachOOF = - std::move(ObjectFile::createMachOObjectFile(Buff.get()).get()); + std::unique_ptr<MachOObjectFile> MachOOF = std::move( + ObjectFile::createMachOObjectFile(Buff.get()->getMemBufferRef()).get()); DisassembleInputMachO2(Filename, MachOOF.get()); } @@ -352,13 +353,16 @@ static void DisassembleInputMachO2(StringRef Filename, // A separate DSym file path was specified, parse it as a macho file, // get the sections and supply it to the section name parsing machinery. if (!DSYMFile.empty()) { - ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = + ErrorOr<std::unique_ptr<MemoryBuffer>> BufOrErr = MemoryBuffer::getFileOrSTDIN(DSYMFile); - if (std::error_code EC = Buf.getError()) { + if (std::error_code EC = BufOrErr.getError()) { errs() << "llvm-objdump: " << Filename << ": " << EC.message() << '\n'; return; } - DbgObj = ObjectFile::createMachOObjectFile(Buf.get()).get().release(); + DbgObj = + ObjectFile::createMachOObjectFile(BufOrErr.get()->getMemBufferRef()) + .get() + .release(); } // Setup the DIContext diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 791011ddefa..0074271ba7e 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -892,12 +892,12 @@ static void DumpInput(StringRef file) { } // Attempt to open the binary. - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(file); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(file); if (std::error_code EC = BinaryOrErr.getError()) { errs() << ToolName << ": '" << file << "': " << EC.message() << ".\n"; return; } - Binary &Binary = *BinaryOrErr.get(); + Binary &Binary = *BinaryOrErr.get().getBinary(); if (Archive *a = dyn_cast<Archive>(&Binary)) DumpArchive(a); diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index 5d58b0a6099..a20164a3c23 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -299,12 +299,12 @@ static void dumpInput(StringRef File) { } // Attempt to open the binary. - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(File); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(File); if (std::error_code EC = BinaryOrErr.getError()) { reportError(File, EC); return; } - Binary &Binary = *BinaryOrErr.get(); + Binary &Binary = *BinaryOrErr.get().getBinary(); if (Archive *Arc = dyn_cast<Archive>(&Binary)) dumpArchive(Arc); diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index d5e9956e04b..0b0b00b05cf 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -453,12 +453,12 @@ static void PrintFileSectionSizes(StringRef file) { } // Attempt to open the binary. - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(file); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(file); if (std::error_code EC = BinaryOrErr.getError()) { errs() << ToolName << ": " << file << ": " << EC.message() << ".\n"; return; } - Binary &Bin = *BinaryOrErr.get(); + Binary &Bin = *BinaryOrErr.get().getBinary(); if (Archive *a = dyn_cast<Archive>(&Bin)) { // This is an archive. Iterate over each member and display its sizes. diff --git a/tools/llvm-symbolizer/LLVMSymbolize.cpp b/tools/llvm-symbolizer/LLVMSymbolize.cpp index 14e193a5373..2606beac17b 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ b/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -300,12 +300,12 @@ LLVMSymbolizer::getOrCreateBinary(const std::string &Path) { return I->second; Binary *Bin = nullptr; Binary *DbgBin = nullptr; - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(Path); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(Path); if (!error(BinaryOrErr.getError())) { - std::unique_ptr<Binary> &ParsedBinary = BinaryOrErr.get(); + OwningBinary<Binary> &ParsedBinary = BinaryOrErr.get(); // Check if it's a universal binary. - Bin = ParsedBinary.get(); - ParsedBinariesAndObjects.push_back(std::move(ParsedBinary)); + Bin = ParsedBinary.getBinary().get(); + addOwningBinary(std::move(ParsedBinary)); if (Bin->isMachO() || Bin->isMachOUniversalBinary()) { // On Darwin we may find DWARF in separate object file in // resource directory. @@ -314,8 +314,9 @@ LLVMSymbolizer::getOrCreateBinary(const std::string &Path) { BinaryOrErr = createBinary(ResourcePath); std::error_code EC = BinaryOrErr.getError(); if (EC != errc::no_such_file_or_directory && !error(EC)) { - DbgBin = BinaryOrErr.get().get(); - ParsedBinariesAndObjects.push_back(std::move(BinaryOrErr.get())); + OwningBinary<Binary> B = std::move(BinaryOrErr.get()); + DbgBin = B.getBinary().get(); + addOwningBinary(std::move(B)); } } // Try to locate the debug binary using .gnu_debuglink section. @@ -327,8 +328,9 @@ LLVMSymbolizer::getOrCreateBinary(const std::string &Path) { findDebugBinary(Path, DebuglinkName, CRCHash, DebugBinaryPath)) { BinaryOrErr = createBinary(DebugBinaryPath); if (!error(BinaryOrErr.getError())) { - DbgBin = BinaryOrErr.get().get(); - ParsedBinariesAndObjects.push_back(std::move(BinaryOrErr.get())); + OwningBinary<Binary> B = std::move(BinaryOrErr.get()); + DbgBin = B.getBinary().get(); + addOwningBinary(std::move(B)); } } } diff --git a/tools/llvm-symbolizer/LLVMSymbolize.h b/tools/llvm-symbolizer/LLVMSymbolize.h index cd11e656e79..a56f1329fd6 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.h +++ b/tools/llvm-symbolizer/LLVMSymbolize.h @@ -75,6 +75,12 @@ private: // Owns all the parsed binaries and object files. SmallVector<std::unique_ptr<Binary>, 4> ParsedBinariesAndObjects; + SmallVector<std::unique_ptr<MemoryBuffer>, 4> MemoryBuffers; + void addOwningBinary(OwningBinary<Binary> Bin) { + ParsedBinariesAndObjects.push_back(std::move(Bin.getBinary())); + MemoryBuffers.push_back(std::move(Bin.getBuffer())); + } + // Owns module info objects. typedef std::map<std::string, ModuleInfo *> ModuleMapTy; ModuleMapTy Modules; diff --git a/tools/llvm-vtabledump/llvm-vtabledump.cpp b/tools/llvm-vtabledump/llvm-vtabledump.cpp index 2f6ccb0620a..f089d586c49 100644 --- a/tools/llvm-vtabledump/llvm-vtabledump.cpp +++ b/tools/llvm-vtabledump/llvm-vtabledump.cpp @@ -164,12 +164,12 @@ static void dumpInput(StringRef File) { } // Attempt to open the binary. - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(File); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(File); if (std::error_code EC = BinaryOrErr.getError()) { reportError(File, EC); return; } - Binary &Binary = *BinaryOrErr.get(); + Binary &Binary = *BinaryOrErr.get().getBinary(); if (Archive *Arc = dyn_cast<Archive>(&Binary)) dumpArchive(Arc); diff --git a/tools/macho-dump/macho-dump.cpp b/tools/macho-dump/macho-dump.cpp index 787aebc058d..a457a4bf8f1 100644 --- a/tools/macho-dump/macho-dump.cpp +++ b/tools/macho-dump/macho-dump.cpp @@ -403,10 +403,10 @@ int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv, "llvm Mach-O dumping tool\n"); - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(InputFile); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(InputFile); if (std::error_code EC = BinaryOrErr.getError()) return Error("unable to read input: '" + EC.message() + "'"); - Binary &Binary = *BinaryOrErr.get(); + Binary &Binary = *BinaryOrErr.get().getBinary(); const MachOObjectFile *InputObject = dyn_cast<MachOObjectFile>(&Binary); if (!InputObject) diff --git a/tools/obj2yaml/obj2yaml.cpp b/tools/obj2yaml/obj2yaml.cpp index dbf5a4acd16..b64096d75fa 100644 --- a/tools/obj2yaml/obj2yaml.cpp +++ b/tools/obj2yaml/obj2yaml.cpp @@ -32,11 +32,11 @@ static std::error_code dumpInput(StringRef File) { if (File != "-" && !sys::fs::exists(File)) return obj2yaml_error::file_not_found; - ErrorOr<std::unique_ptr<Binary>> BinaryOrErr = createBinary(File); + ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(File); if (std::error_code EC = BinaryOrErr.getError()) return EC; - Binary &Binary = *BinaryOrErr.get(); + Binary &Binary = *BinaryOrErr.get().getBinary(); // TODO: If this is an archive, then burst it and dump each entry if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary)) return dumpObject(*Obj); |