diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-24 21:32:21 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-24 21:32:21 +0000 |
commit | afcc3df7f4db85832b13a6f4d58e24ac9e7ccc43 (patch) | |
tree | e608147b8d62c19296d96c7e00de10c220811fe4 /llvm/lib/Object/ObjectFile.cpp | |
parent | 1b392619907d1b5bed4d8533ea8c0cf7e19c5b48 (diff) | |
download | llvm-afcc3df7f4db85832b13a6f4d58e24ac9e7ccc43.zip llvm-afcc3df7f4db85832b13a6f4d58e24ac9e7ccc43.tar.gz llvm-afcc3df7f4db85832b13a6f4d58e24ac9e7ccc43.tar.bz2 |
Make ObjectFile ownership of the MemoryBuffer optional.
This allows llvm-ar to mmap the input files only once.
llvm-svn: 200040
Diffstat (limited to 'llvm/lib/Object/ObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/ObjectFile.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index 6b14e78..2e6b9e6 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -23,9 +23,9 @@ using namespace object; void ObjectFile::anchor() { } -ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source) - : Binary(Type, source) { -} +ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *Source, + bool BufferOwned) + : Binary(Type, Source, BufferOwned) {} error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, uint32_t &Result) const { @@ -38,8 +38,8 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { } ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object, + bool BufferOwned, sys::fs::file_magic Type) { - OwningPtr<MemoryBuffer> ScopedObj(Object); if (Type == sys::fs::file_magic::unknown) Type = sys::fs::identify_magic(Object->getBuffer()); @@ -49,12 +49,14 @@ ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object, case sys::fs::file_magic::archive: case sys::fs::file_magic::macho_universal_binary: case sys::fs::file_magic::windows_resource: + if (BufferOwned) + delete Object; return object_error::invalid_file_type; case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_executable: case sys::fs::file_magic::elf_shared_object: case sys::fs::file_magic::elf_core: - return createELFObjectFile(ScopedObj.take()); + return createELFObjectFile(Object, BufferOwned); case sys::fs::file_magic::macho_object: case sys::fs::file_magic::macho_executable: case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: @@ -65,11 +67,11 @@ ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object, case sys::fs::file_magic::macho_bundle: case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: case sys::fs::file_magic::macho_dsym_companion: - return createMachOObjectFile(ScopedObj.take()); + return createMachOObjectFile(Object, BufferOwned); case sys::fs::file_magic::coff_object: case sys::fs::file_magic::coff_import_library: case sys::fs::file_magic::pecoff_executable: - return createCOFFObjectFile(ScopedObj.take()); + return createCOFFObjectFile(Object, BufferOwned); } llvm_unreachable("Unexpected Object File Type"); } |