[PATCH] PrettyStackTrace should use ManagedStatic for its ThreadLocal

Dan Gohman sunfish at google.com
Thu Sep 12 20:48:29 PDT 2013


On Thu, Sep 12, 2013 at 6:33 PM, Filip Pizlo <fpizlo at apple.com> wrote:
>
> On Sep 12, 2013, at 5:49 PM, Dan Gohman <sunfish at google.com> wrote:
>
> On Thu, Sep 12, 2013 at 5:00 PM, Filip Pizlo <fpizlo at apple.com> wrote:
>
> llvm::outs() has a static local that closes stdout in its destructor.
> Obviously, this *really* has to run atexit, and probably can't run at
> llvm_shutdown() time.  Alternatively, it shouldn't close stdout.
>
>
> Is the issue just that you want it to flush its output?
>
>
> The issue is that it needs to detect pending I/O errors.
>
>
> What would you do with pending I/O errors in an atexit() handler?

The code is out there :-). It calls report_fatal_error.

>
>
> In that case why not do the equivalent of _setvbuf?
>
>
> _setvbuf is for libc buffering. raw_ostream's implementation was
> designed to avoid libc buffering because it wasn't as fast.
>
>
> I understand that _setvbuf is for libc.  But why can't raw_ostream do the
> equivalent for the purpose of llvm::outs()?  Is the concern that a program
> might use outs() (i.e. outputting to stdout) so heavily that buffering
> becomes critical?

I don't understand what you're asking here. raw_ostream is a simple
utility for simple compiler-like tools. It's useful for these tools to
exit with a non-zero exit status if they encounter any output error.
raw_ostream's current design achieves this automatically, and by
default (though it can be overridden).

Dan



More information about the llvm-commits mailing list