Restore the ability to check if LLVMCreateObjectFile was successful
authorBjorn Steinbrink <bsteinbr@gmail.com>
Fri, 5 Sep 2014 21:22:09 +0000 (21:22 +0000)
committerBjorn Steinbrink <bsteinbr@gmail.com>
Fri, 5 Sep 2014 21:22:09 +0000 (21:22 +0000)
Summary:
Until r216870 LLVMCreateObjectFile returned nullptr in case of an error,
so callers could check if the call was successful. Now, it always
returns an OwningBinary wrapped as an LLVMObjectFileRef, so callers
can't check if the call was successul.

This results in a segfault running e.g.

 llvm-c-test --object-list-sections < /dev/null

So the old behaviour should be restored.

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D5143

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217279 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/Object.cpp
test/Bindings/llvm-c/objectfile.ll [new file with mode: 0644]

index 4d3478bc14f097baf5688b8805244b44cc029d57..fea3411328582f86d31732dfed99cbd2de29503c 100644 (file)
@@ -64,9 +64,10 @@ LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
   ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr(
       ObjectFile::createObjectFile(Buf->getMemBufferRef()));
   std::unique_ptr<ObjectFile> Obj;
-  if (ObjOrErr)
-    Obj = std::move(ObjOrErr.get());
-  auto *Ret = new OwningBinary<ObjectFile>(std::move(Obj), std::move(Buf));
+  if (!ObjOrErr)
+    return nullptr;
+
+  auto *Ret = new OwningBinary<ObjectFile>(std::move(ObjOrErr.get()), std::move(Buf));
   return wrap(Ret);
 }
 
diff --git a/test/Bindings/llvm-c/objectfile.ll b/test/Bindings/llvm-c/objectfile.ll
new file mode 100644 (file)
index 0000000..b6cb4a0
--- /dev/null
@@ -0,0 +1,2 @@
+; RUN: not llvm-c-test --object-list-sections < /dev/null
+; This used to cause a segfault