diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-22 16:04:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-22 16:04:52 +0000 |
commit | 2edc3a6b8df2962f4bcc769fd2606e4f6c36fb06 (patch) | |
tree | 4ad876aa8eec3475f0eeb6dc88b45cc2c85b6187 /lib | |
parent | 929b0fb893f2c794a450975d802c0b39752effc0 (diff) |
Pass the computed magic to createBinary and createObjectFile if available.
identify_magic is not free, so we should avoid calling it twice. The argument
also makes it cheap for createBinary to just forward to createObjectFile.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199813 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Object/Binary.cpp | 20 | ||||
-rw-r--r-- | lib/Object/ObjectFile.cpp | 6 |
2 files changed, 14 insertions, 12 deletions
diff --git a/lib/Object/Binary.cpp b/lib/Object/Binary.cpp index 4f35d975262..a0c412a64b2 100644 --- a/lib/Object/Binary.cpp +++ b/lib/Object/Binary.cpp @@ -41,17 +41,19 @@ StringRef Binary::getFileName() const { return Data->getBufferIdentifier(); } -ErrorOr<Binary *> object::createBinary(MemoryBuffer *Source) { +ErrorOr<Binary *> object::createBinary(MemoryBuffer *Source, + sys::fs::file_magic Type) { OwningPtr<MemoryBuffer> scopedSource(Source); - sys::fs::file_magic type = sys::fs::identify_magic(Source->getBuffer()); - switch (type) { + if (Type == sys::fs::file_magic::unknown) + Type = sys::fs::identify_magic(Source->getBuffer()); + + switch (Type) { case sys::fs::file_magic::archive: return Archive::create(scopedSource.take()); 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 ObjectFile::createELFObjectFile(scopedSource.take()); 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: @@ -62,19 +64,17 @@ ErrorOr<Binary *> object::createBinary(MemoryBuffer *Source) { 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 ObjectFile::createMachOObjectFile(scopedSource.take()); - case sys::fs::file_magic::macho_universal_binary: - return MachOUniversalBinary::create(scopedSource.take()); case sys::fs::file_magic::coff_object: case sys::fs::file_magic::coff_import_library: case sys::fs::file_magic::pecoff_executable: - return ObjectFile::createCOFFObjectFile(scopedSource.take()); + return ObjectFile::createObjectFile(scopedSource.take(), Type); + case sys::fs::file_magic::macho_universal_binary: + return MachOUniversalBinary::create(scopedSource.take()); case sys::fs::file_magic::unknown: case sys::fs::file_magic::bitcode: - case sys::fs::file_magic::windows_resource: { + case sys::fs::file_magic::windows_resource: // Unrecognized object file format. return object_error::invalid_file_type; - } } llvm_unreachable("Unexpected Binary File Type"); } diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index fd2b024687c..6b14e78ff3d 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -37,9 +37,11 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { return section_iterator(SectionRef(Sec, this)); } -ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object) { +ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object, + sys::fs::file_magic Type) { OwningPtr<MemoryBuffer> ScopedObj(Object); - sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer()); + if (Type == sys::fs::file_magic::unknown) + Type = sys::fs::identify_magic(Object->getBuffer()); switch (Type) { case sys::fs::file_magic::unknown: |