From 003140e23d7cdb944b398577dbb454990fcd5fa4 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 31 Oct 2017 16:39:47 +0000 Subject: [PATCH] LTOModule::isBitcodeFile() shouldn't assert when returning false. Fixes a bunch of assert-on-invalid-bitcode regressions after 315483. Expected<> calls assertIsChecked() in its dtor, and operator bool() only calls setChecked() if there's no error. So for functions that don't return an error itself, the Expected<> version needs explicit code to disarm the error that the ErrorOr<> code didn't need. https://reviews.llvm.org/D39437 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317010 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/LTO/LTOModule.cpp | 20 ++++++++++++++++---- test/tools/lto/no-bitcode.s | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 test/tools/lto/no-bitcode.s diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp index 6a0fbb664da..42a5935cab2 100644 --- a/lib/LTO/LTOModule.cpp +++ b/lib/LTO/LTOModule.cpp @@ -62,7 +62,11 @@ LTOModule::~LTOModule() {} bool LTOModule::isBitcodeFile(const void *Mem, size_t Length) { Expected BCData = IRObjectFile::findBitcodeInMemBuffer( MemoryBufferRef(StringRef((const char *)Mem, Length), "")); - return bool(BCData); + if (!BCData) { + consumeError(BCData.takeError()); + return false; + } + return true; } bool LTOModule::isBitcodeFile(StringRef Path) { @@ -73,7 +77,11 @@ bool LTOModule::isBitcodeFile(StringRef Path) { Expected BCData = IRObjectFile::findBitcodeInMemBuffer( BufferOrErr.get()->getMemBufferRef()); - return bool(BCData); + if (!BCData) { + consumeError(BCData.takeError()); + return false; + } + return true; } bool LTOModule::isThinLTO() { @@ -89,8 +97,10 @@ bool LTOModule::isBitcodeForTarget(MemoryBuffer *Buffer, StringRef TriplePrefix) { Expected BCOrErr = IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef()); - if (!BCOrErr) + if (!BCOrErr) { + consumeError(BCOrErr.takeError()); return false; + } LLVMContext Context; ErrorOr TripleOrErr = expectedToErrorOrAndEmitErrors(Context, getBitcodeTargetTriple(*BCOrErr)); @@ -102,8 +112,10 @@ bool LTOModule::isBitcodeForTarget(MemoryBuffer *Buffer, std::string LTOModule::getProducerString(MemoryBuffer *Buffer) { Expected BCOrErr = IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef()); - if (!BCOrErr) + if (!BCOrErr) { + consumeError(BCOrErr.takeError()); return ""; + } LLVMContext Context; ErrorOr ProducerOrErr = expectedToErrorOrAndEmitErrors( Context, getBitcodeProducerString(*BCOrErr)); diff --git a/test/tools/lto/no-bitcode.s b/test/tools/lto/no-bitcode.s new file mode 100644 index 00000000000..360ebf1e998 --- /dev/null +++ b/test/tools/lto/no-bitcode.s @@ -0,0 +1,4 @@ +; libLTO.dylib shouldn't assert on invalid inputs. +; RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -filetype=obj -o %t.o +; RUN: llvm-ar r %t.a %t.o +; RUN: %ld64 -lto_library %llvmshlibdir/libLTO.dylib -arch x86_64 -dylib -mllvm -O0 -o %t.dylib %t.a -- 2.40.0