<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 8, 2015 at 3:11 PM, Artem Belevich <span dir="ltr"><<a href="mailto:tra@google.com" target="_blank">tra@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi echristo, rnk, dblaikie,<br>
<br>
<br>
GetOutputStream() owns the stream it returns pointer to and the<br>
pointer should never be freed by us. When we fail to load and exit<br>
early, unique_ptr still holds the pointer and frees it which leads to<br>
compiler crash when CompilerInstance attempts to free it again.<br>
<br>
Added regression test for failed bitcode linking.<br>
<br>
<a href="http://reviews.llvm.org/D9625" target="_blank">http://reviews.llvm.org/D9625</a><br>
<br>
Files:<br>
  lib/CodeGen/CodeGenAction.cpp<br>
  test/CodeGen/link-bitcode-file.c<br>
<br>
Index: lib/CodeGen/CodeGenAction.cpp<br>
===================================================================<br>
--- lib/CodeGen/CodeGenAction.cpp<br>
+++ lib/CodeGen/CodeGenAction.cpp<br>
@@ -629,7 +629,7 @@<br>
 std::unique_ptr<ASTConsumer><br>
 CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {<br>
   BackendAction BA = static_cast<BackendAction>(Act);<br>
-  std::unique_ptr<raw_pwrite_stream> OS(GetOutputStream(CI, InFile, BA));<br>
+  raw_pwrite_stream *OS(GetOutputStream(CI, InFile, BA));<br></blockquote><div><br>Use = rather than () where both are valid (such as here):<br><br>raw_pwrite_stream *OS = GetOutputStream(...);<br><br>Otherwise looks good.<br><br>If you wanted to do some cleanup, perhaps GetOutputStream should return by reference so there's no confusion about ownership passing.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   if (BA != Backend_EmitNothing && !OS)<br>
     return nullptr;<br>
<br>
@@ -666,7 +666,7 @@<br>
   std::unique_ptr<BackendConsumer> Result(new BackendConsumer(<br>
       BA, CI.getDiagnostics(), CI.getCodeGenOpts(), CI.getTargetOpts(),<br>
       CI.getLangOpts(), CI.getFrontendOpts().ShowTimers, InFile,<br>
-      LinkModuleToUse, OS.release(), *VMContext, CoverageInfo));<br>
+      LinkModuleToUse, OS, *VMContext, CoverageInfo));<br>
   BEConsumer = Result.get();<br>
   return std::move(Result);<br>
 }<br>
Index: test/CodeGen/link-bitcode-file.c<br>
===================================================================<br>
--- test/CodeGen/link-bitcode-file.c<br>
+++ test/CodeGen/link-bitcode-file.c<br>
@@ -1,6 +1,9 @@<br>
 // RUN: %clang_cc1 -triple i386-pc-linux-gnu -DBITCODE -emit-llvm-bc -o %t.bc %s<br>
 // RUN: %clang_cc1 -triple i386-pc-linux-gnu -mlink-bitcode-file %t.bc -O3 -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NO-BC %s<br>
 // RUN: not %clang_cc1 -triple i386-pc-linux-gnu -DBITCODE -mlink-bitcode-file %t.bc -O3 -emit-llvm -o - %s 2>&1 | FileCheck -check-prefix=CHECK-BC %s<br>
+// Make sure we deal with failure to load the file.<br>
+// RUN: not %clang_cc1 -triple i386-pc-linux-gnu -mlink-bitcode-file no-such-file.bc \<br>
+// RUN:    -emit-llvm -o - %s 2>&1 | FileCheck -check-prefix=CHECK-NO-FILE %s<br>
<br>
 int f(void);<br>
<br>
@@ -22,3 +25,5 @@<br>
 // CHECK-NO-BC-LABEL: define i32 @f<br>
<br>
 #endif<br>
+<br>
+// CHECK-NO-FILE: fatal error: cannot open file 'no-such-file.bc'<br>
<br>
EMAIL PREFERENCES<br>
  <a href="http://reviews.llvm.org/settings/panel/emailpreferences/" target="_blank">http://reviews.llvm.org/settings/panel/emailpreferences/</a><br>
</blockquote></div><br></div></div>