Change createObjectFile to return an ErrorOr.

llvm-svn: 199776
diff --git a/llvm/lib/Object/Object.cpp b/llvm/lib/Object/Object.cpp
index 1edc217..e454d8e 100644
--- a/llvm/lib/Object/Object.cpp
+++ b/llvm/lib/Object/Object.cpp
@@ -59,7 +59,9 @@
 
 // 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) {
diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp
index 2397f4b..fd2b024 100644
--- a/llvm/lib/Object/ObjectFile.cpp
+++ b/llvm/lib/Object/ObjectFile.cpp
@@ -37,26 +37,22 @@
   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 @@
   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());
 }