[llvm] r199776 - Change createObjectFile to return an ErrorOr.

Rafael Espindola rafael.espindola at gmail.com
Tue Jan 21 16:14:49 PST 2014


Author: rafael
Date: Tue Jan 21 18:14:49 2014
New Revision: 199776

URL: http://llvm.org/viewvc/llvm-project?rev=199776&view=rev
Log:
Change createObjectFile to return an ErrorOr.

Modified:
    llvm/trunk/include/llvm/Object/ObjectFile.h
    llvm/trunk/lib/DebugInfo/DWARFUnit.cpp
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h
    llvm/trunk/lib/Object/Object.cpp
    llvm/trunk/lib/Object/ObjectFile.cpp
    llvm/trunk/tools/lli/lli.cpp
    llvm/trunk/tools/llvm-ar/llvm-ar.cpp
    llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp

Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ObjectFile.h Tue Jan 21 18:14:49 2014
@@ -376,8 +376,8 @@ public:
   /// @param ObjectPath The path to the object file. ObjectPath.isObject must
   ///        return true.
   /// @brief Create ObjectFile from path.
-  static ObjectFile *createObjectFile(StringRef ObjectPath);
-  static ObjectFile *createObjectFile(MemoryBuffer *Object);
+  static ErrorOr<ObjectFile *> createObjectFile(StringRef ObjectPath);
+  static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object);
 
   static inline bool classof(const Binary *v) {
     return v->isObject();

Modified: llvm/trunk/lib/DebugInfo/DWARFUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFUnit.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARFUnit.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARFUnit.cpp Tue Jan 21 18:14:49 2014
@@ -263,12 +263,12 @@ bool DWARFUnit::parseDWO() {
     sys::path::append(AbsolutePath, CompilationDir);
   }
   sys::path::append(AbsolutePath, DWOFileName);
-  object::ObjectFile *DWOFile =
+  ErrorOr<object::ObjectFile *> DWOFile =
       object::ObjectFile::createObjectFile(AbsolutePath);
   if (!DWOFile)
     return false;
   // Reset DWOHolder.
-  DWO.reset(new DWOHolder(DWOFile));
+  DWO.reset(new DWOHolder(DWOFile.get()));
   DWARFUnit *DWOCU = DWO->getUnit();
   // Verify that compile unit in .dwo file is valid.
   if (DWOCU == 0 || DWOCU->getDWOId() != getDWOId()) {

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h Tue Jan 21 18:14:49 2014
@@ -44,7 +44,8 @@ public:
   ObjectImageCommon(ObjectBuffer* Input)
   : ObjectImage(Input) // saves Input as Buffer and takes ownership
   {
-    ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer());
+    ObjFile =
+        object::ObjectFile::createObjectFile(Buffer->getMemBuffer()).get();
   }
   ObjectImageCommon(object::ObjectFile* Input)
   : ObjectImage(NULL), ObjFile(Input)  {}

Modified: llvm/trunk/lib/Object/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Object.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/lib/Object/Object.cpp (original)
+++ llvm/trunk/lib/Object/Object.cpp Tue Jan 21 18:14:49 2014
@@ -59,7 +59,9 @@ wrap(const relocation_iterator *SI) {
 
 // ObjectFile creation
 LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
-  return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
+  ErrorOr<ObjectFile*> ObjOrErr(ObjectFile::createObjectFile(unwrap(MemBuf)));
+  ObjectFile *Obj = ObjOrErr ? ObjOrErr.get() : 0;
+  return wrap(Obj);
 }
 
 void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {

Modified: llvm/trunk/lib/Object/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ObjectFile.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/lib/Object/ObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/ObjectFile.cpp Tue Jan 21 18:14:49 2014
@@ -37,26 +37,22 @@ section_iterator ObjectFile::getRelocate
   return section_iterator(SectionRef(Sec, this));
 }
 
-ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
-  if (Object->getBufferSize() < 64) {
-    delete Object;
-    return 0;
-  }
-
+ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object) {
+  OwningPtr<MemoryBuffer> ScopedObj(Object);
   sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer());
+
   switch (Type) {
   case sys::fs::file_magic::unknown:
   case sys::fs::file_magic::bitcode:
   case sys::fs::file_magic::archive:
   case sys::fs::file_magic::macho_universal_binary:
   case sys::fs::file_magic::windows_resource:
-    delete Object;
-    return 0;
+    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(Object).get();
+    return createELFObjectFile(ScopedObj.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:
@@ -67,18 +63,18 @@ ObjectFile *ObjectFile::createObjectFile
   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(Object).get();
+    return createMachOObjectFile(ScopedObj.take());
   case sys::fs::file_magic::coff_object:
   case sys::fs::file_magic::coff_import_library:
   case sys::fs::file_magic::pecoff_executable:
-    return createCOFFObjectFile(Object).get();
+    return createCOFFObjectFile(ScopedObj.take());
   }
   llvm_unreachable("Unexpected Object File Type");
 }
 
-ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) {
+ErrorOr<ObjectFile *> ObjectFile::createObjectFile(StringRef ObjectPath) {
   OwningPtr<MemoryBuffer> File;
-  if (MemoryBuffer::getFile(ObjectPath, File))
-    return NULL;
+  if (error_code EC = MemoryBuffer::getFile(ObjectPath, File))
+    return EC;
   return createObjectFile(File.take());
 }

Modified: llvm/trunk/tools/lli/lli.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/lli.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/tools/lli/lli.cpp (original)
+++ llvm/trunk/tools/lli/lli.cpp Tue Jan 21 18:14:49 2014
@@ -527,13 +527,13 @@ int main(int argc, char **argv, char * c
   }
 
   for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) {
-    object::ObjectFile *Obj = object::ObjectFile::createObjectFile(
-                                                         ExtraObjects[i]);
+    ErrorOr<object::ObjectFile *> Obj =
+        object::ObjectFile::createObjectFile(ExtraObjects[i]);
     if (!Obj) {
       Err.print(argv[0], errs());
       return 1;
     }
-    EE->addObjectFile(Obj);
+    EE->addObjectFile(Obj.get());
   }
 
   for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) {

Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)
+++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Tue Jan 21 18:14:49 2014
@@ -670,7 +670,11 @@ static void writeSymbolTable(
     object::ObjectFile *Obj;
     if (I->isNewMember()) {
       const char *Filename = I->getNew();
-      Obj = object::ObjectFile::createObjectFile(Filename);
+      if (ErrorOr<object::ObjectFile *> ObjOrErr =
+              object::ObjectFile::createObjectFile(Filename))
+        Obj = ObjOrErr.get();
+      else
+        Obj = NULL;
     } else {
       object::Archive::child_iterator OldMember = I->getOld();
       OwningPtr<object::Binary> Binary;

Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=199776&r1=199775&r2=199776&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
+++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Tue Jan 21 18:14:49 2014
@@ -93,11 +93,12 @@ static void DumpInput(const StringRef &F
     return;
   }
 
-  OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take()));
-  if (!Obj) {
-    errs() << Filename << ": Unknown object file format\n";
+  ErrorOr<ObjectFile*> ObjOrErr(ObjectFile::createObjectFile(Buff.take()));
+  if (error_code EC = ObjOrErr.getError()) {
+    errs() << Filename << ": " << EC.message() << '\n';
     return;
   }
+  OwningPtr<ObjectFile> Obj(ObjOrErr.get());
 
   OwningPtr<DIContext> DICtx(DIContext::getDWARFContext(Obj.get()));
 





More information about the llvm-commits mailing list