diff options
-rw-r--r-- | include/llvm/Object/Binary.h | 5 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 5 | ||||
-rw-r--r-- | lib/Object/Binary.cpp | 20 | ||||
-rw-r--r-- | lib/Object/ObjectFile.cpp | 6 | ||||
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 6 |
5 files changed, 25 insertions, 17 deletions
diff --git a/include/llvm/Object/Binary.h b/include/llvm/Object/Binary.h index 6a73e0a5b1..7742f83cd0 100644 --- a/include/llvm/Object/Binary.h +++ b/include/llvm/Object/Binary.h @@ -16,6 +16,7 @@ #include "llvm/Object/Error.h" #include "llvm/Support/ErrorOr.h" +#include "llvm/Support/FileSystem.h" namespace llvm { @@ -115,7 +116,9 @@ public: /// @param Source The data to create the Binary from. Ownership is transferred /// to the Binary if successful. If an error is returned, /// Source is destroyed by createBinary before returning. -ErrorOr<Binary *> createBinary(MemoryBuffer *Source); +ErrorOr<Binary *> createBinary(MemoryBuffer *Source, + sys::fs::file_magic Type = + sys::fs::file_magic::unknown); ErrorOr<Binary *> createBinary(StringRef Path); } diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 4aa1e06676..77833cbf94 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -18,6 +18,7 @@ #include "llvm/Object/Binary.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include <cstring> #include <vector> @@ -377,7 +378,9 @@ public: /// return true. /// @brief Create ObjectFile from path. static ErrorOr<ObjectFile *> createObjectFile(StringRef ObjectPath); - static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object); + static ErrorOr<ObjectFile *> + createObjectFile(MemoryBuffer *Object, + sys::fs::file_magic Type = sys::fs::file_magic::unknown); static inline bool classof(const Binary *v) { return v->isObject(); diff --git a/lib/Object/Binary.cpp b/lib/Object/Binary.cpp index 4f35d97526..a0c412a64b 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 fd2b024687..6b14e78ff3 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: diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 71f5046fca..e4e62091d5 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -580,7 +580,7 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { delete Result; } } else if (magic == sys::fs::file_magic::archive) { - ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take()); + ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take(), magic); if (error(BinaryOrErr.getError(), Filename)) return; OwningPtr<Binary> arch(BinaryOrErr.get()); @@ -631,7 +631,7 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { } } } else if (magic == sys::fs::file_magic::macho_universal_binary) { - ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take()); + ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take(), magic); if (error(BinaryOrErr.getError(), Filename)) return; OwningPtr<Binary> Bin(BinaryOrErr.get()); @@ -649,7 +649,7 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { } } } else if (magic.is_object()) { - ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take()); + ErrorOr<Binary *> BinaryOrErr = object::createBinary(Buffer.take(), magic); if (error(BinaryOrErr.getError(), Filename)) return; OwningPtr<Binary> obj(BinaryOrErr.get()); |