From df7568e9f3a38d9301e99c5ae3229b8622aa86fa Mon Sep 17 00:00:00 2001
From: Rafael Espindola <rafael.espindola@gmail.com>
Date: Tue, 29 Jul 2014 20:46:19 +0000
Subject: [PATCH] gold plugin: Fix handling of corrupted bitcode files.

We should still claim them and tell gold about the error.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214214 91177308-0d34-0410-b5e6-96231b3b80d8
---
 test/tools/gold/Inputs/invalid.bc | Bin 0 -> 272 bytes
 test/tools/gold/invalid.ll        |   7 +++++++
 tools/gold/gold-plugin.cpp        |   5 +++--
 3 files changed, 10 insertions(+), 2 deletions(-)
 create mode 100644 test/tools/gold/Inputs/invalid.bc
 create mode 100644 test/tools/gold/invalid.ll

diff --git a/test/tools/gold/Inputs/invalid.bc b/test/tools/gold/Inputs/invalid.bc
new file mode 100644
index 0000000000000000000000000000000000000000..2e7ca8d2e10568ed273c45e438bd47e58f80285c
GIT binary patch
literal 272
zcmZ>AK5&nLhk?P7fq{X$Nr8b0NDBcmd!zD1#}h1`Yyw7>lNeigR9QJB<yg9t8W>!e
zoF;KQu?QH6Sa3*qav8a(cyLWnR6Y{az$2+xq{4oJLm+9zf)x(OJ}?5!=~Q4~-~iG_
zN*o*tDXlER3QJmm#N(EQ6GVi38hW@}SbPM4@|6+{4DvwQn4>}F$U~Vl5k}h%XN#7@
zJx&eml@;v8GYWa0G4Q_?;QP|RXUyXycj%z(xrH)m2CQIZ&C+L>ZBIDc_AuL?spu&w
zV6Wz2uk>gyC}6KDU@og@FHmTgJR`{WW&+<s1O7Y%{>LBqJ_PU?3mlQXrzmqnQT9-x
J9MEnM001S&N?!l~

literal 0
HcmV?d00001

diff --git a/test/tools/gold/invalid.ll b/test/tools/gold/invalid.ll
new file mode 100644
index 00000000000..8db76446a3d
--- /dev/null
+++ b/test/tools/gold/invalid.ll
@@ -0,0 +1,7 @@
+; RUN: not ld -plugin %llvmshlibdir/LLVMgold.so \
+; RUN:    %p/Inputs/invalid.bc -o %t2 2>&1 | FileCheck %s
+
+; test that only one error gets printed
+
+; CHECK: error: LLVM gold plugin has failed to create LTO module: Malformed block
+; CHECK-NOT: error
diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp
index 8c30ba2a428..d428c6910a8 100644
--- a/tools/gold/gold-plugin.cpp
+++ b/tools/gold/gold-plugin.cpp
@@ -291,6 +291,8 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
   if (!LTOModule::isBitcodeFile(view, file->filesize))
     return LDPS_OK;
 
+  *claimed = 1;
+
   std::string Error;
   LTOModule *M =
       LTOModule::createFromBuffer(view, file->filesize, TargetOpts, Error);
@@ -298,10 +300,9 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
     (*message)(LDPL_ERROR,
                "LLVM gold plugin has failed to create LTO module: %s",
                Error.c_str());
-    return LDPS_OK;
+    return LDPS_ERR;
   }
 
-  *claimed = 1;
   Modules.resize(Modules.size() + 1);
   claimed_file &cf = Modules.back();