[llvm] r199813 - Pass the computed magic to createBinary and createObjectFile if available.

Rafael Espindola rafael.espindola at gmail.com
Wed Jan 22 08:04:52 PST 2014


Author: rafael
Date: Wed Jan 22 10:04:52 2014
New Revision: 199813

URL: http://llvm.org/viewvc/llvm-project?rev=199813&view=rev
Log:
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.

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

Modified: llvm/trunk/include/llvm/Object/Binary.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Binary.h?rev=199813&r1=199812&r2=199813&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/Binary.h (original)
+++ llvm/trunk/include/llvm/Object/Binary.h Wed Jan 22 10:04:52 2014
@@ -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);
 }

Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=199813&r1=199812&r2=199813&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ObjectFile.h Wed Jan 22 10:04:52 2014
@@ -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();

Modified: llvm/trunk/lib/Object/Binary.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Binary.cpp?rev=199813&r1=199812&r2=199813&view=diff
==============================================================================
--- llvm/trunk/lib/Object/Binary.cpp (original)
+++ llvm/trunk/lib/Object/Binary.cpp Wed Jan 22 10:04:52 2014
@@ -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(M
     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");
 }

Modified: llvm/trunk/lib/Object/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ObjectFile.cpp?rev=199813&r1=199812&r2=199813&view=diff
==============================================================================
--- llvm/trunk/lib/Object/ObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/ObjectFile.cpp Wed Jan 22 10:04:52 2014
@@ -37,9 +37,11 @@ section_iterator ObjectFile::getRelocate
   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:

Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=199813&r1=199812&r2=199813&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Wed Jan 22 10:04:52 2014
@@ -580,7 +580,7 @@ static void DumpSymbolNamesFromFile(std:
       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:
       }
     }
   } 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:
       }
     }
   } 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());





More information about the llvm-commits mailing list