<div dir="ltr">We've had this argument before. IMO LLVM should not be in the business of closing stdout, and no code in lib/ should print to stdout because users may expect output there (-o -).<br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 23, 2015 at 10:20 AM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On 2015-Jan-23, at 09:52, mats petersson <<a href="mailto:mats@planetcatfish.com">mats@planetcatfish.com</a>> wrote:<br>
><br>
> I was just fixing a bug that was caused by `stdout` being closed<br>
> before the runtime has done `fflush(stdout)` [or however this is<br>
> implemented in the runtime].<br>
><br>
> The cause of this seems to be that `outs()` returns a static object<br>
> created from `raw_fd_stream(STDOUT_FILENO, true)` - the `true` being<br>
> the `shouldClose` parameter.<br>
><br>
> Surely LLVM is not supposed to close `stdout` as part of its operations?<br>
<br>
</span>Looks like this was added in r111643:<br>
<br>
commit 5d56d9df928c48571980efe8d4205de8ab557b7c<br>
Author: Dan Gohman <<a href="mailto:gohman@apple.com">gohman@apple.com</a>><br>
Date:   Fri Aug 20 16:44:56 2010 +0000<br>
<br>
    Make outs() close its file when its stream is destructed, so that<br>
    pending output errors are detected.<br>
<br>
<br>
    git-svn-id: <a href="https://llvm.org/svn/llvm-project/llvm/trunk@111643" target="_blank">https://llvm.org/svn/llvm-project/llvm/trunk@111643</a> 91177308-0d34-0410-b5e6-96231b3b80d8<br>
<br>
Certainly looks intentional.  Comment in the code is:<br>
<br>
    // Delete the file descriptor when the program exits, forcing error<br>
    // detection. If you don't want this behavior, don't use outs().<br>
<br>
I don't really have an opinion on whether this is a good idea, but it<br>
does suggest that any use of `outs()` in `lib/` is a bug.<br>
<br>
$ git grep -l 'outs()' -- lib/<br>
lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp<br>
lib/IR/GCOV.cpp<br>
lib/Support/CommandLine.cpp<br>
lib/Support/FormattedStream.cpp<br>
lib/Support/TargetRegistry.cpp<br>
lib/Support/raw_ostream.cpp<br>
lib/Target/CppBackend/CPPBackend.cpp<br>
<br>
All of these cases seem to be for outputting help text of some sort.  But<br>
probably they should be passed a reference to a `raw_ostream`, so that the<br>
caller gets to choose whether or not to use `outs()`.<br>
<br>
Were you hitting one of these?<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br></div></div>