Pass the computed magic to createBinary and createObjectFile if available.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Jan 2014 16:04:52 +0000 (16:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Jan 2014 16:04:52 +0000 (16:04 +0000)
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

include/llvm/Object/Binary.h
include/llvm/Object/ObjectFile.h
lib/Object/Binary.cpp
lib/Object/ObjectFile.cpp
tools/llvm-nm/llvm-nm.cpp

index 6a73e0a5b1e4cf38b446c46df41e8fefd66a6a09..7742f83cd0844ed616718c8f01b981de69c80d10 100644 (file)
@@ -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);
 }
index 4aa1e06676360fa53cae34d1817e798941c6e1c2..77833cbf94071a2da619e4455e423f5ab70515d8 100644 (file)
@@ -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();
index 4f35d9752626353d49e4029463e7051218f435e9..a0c412a64b282b83975a09a8f29de3b12288b00d 100644 (file)
@@ -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");
 }
index fd2b024687c8462ef6475b0e12cd086bbb2c1782..6b14e78ff3d83b5dd94cc6871cda487a487bd385 100644 (file)
@@ -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:
index 71f5046fca2175d80b75ef199ee820322322e747..e4e62091d54dadcb18f8f897e5375b3c074440eb 100644 (file)
@@ -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());