[LLVMdev] [llvm-commits] [PATCH] Allow per-thread re-direction of outs()/errs()

Justin Holewinski justin.holewinski at gmail.com
Fri Jun 1 23:13:53 PDT 2012


On Fri, Jun 1, 2012 at 10:17 PM, Chris Lattner <clattner at apple.com> wrote:

>
> On Jun 1, 2012, at 7:41 PM, Justin Holewinski wrote:
>
> >
>> > Unfortunately, the use of outs() and (especially) errs() is rampant - a
>> simple grep of the 3.1 source tree shows about 1,500 instances.  One of the
>> first things we had to implement in order to make LLVM usable is something
>> very similar to what Justin has proposed.  Centralizing control of the
>> output in outs()/errs() would seem to be an ideal way to let users of LLVM
>> as a library customize it as they see fit without requiring massive source
>> changes.
>>
>> Virtually all of those are in DEBUG statements or in llvm/tools.  Neither
>> are relevant to the discussion.
>>
>
> In a way, they are.  What if I want a debug trace in a multi-threaded
> context?  Right now, all threads would just spew to the same stream and the
> result would be unreadable.  If you allow threads to setup their own outs()
> and errs() streams (transparently to the rest of LLVM), you can intercept
> these as you see fit, perhaps dumping each to a separate file.  I
> acknowledge that you could also enforce single-threaded execution for debug
> runs, but what if you are in the context of a library with no valid
> stdout/stderr buffers?
>
>
> This doesn't make any sense.  There is very little sense in trying to use
> DEBUG (which gets compiled out of optimized builds) in a multithreaded
> context.  Polluting the purity of outs() and errs() because of this sort of
> use case doesn't make any sense to me.
>
> outs() and errs() are useful independent of how LLVM happens to use them.
>  The extensions that you are proposing doesn't make any sense give nthe
> design of raw_ostream.
>

Is the problem more that outs() and errs() should always point to valid
stdout/stderr streams, regardless of how the hosting compiler is
implemented?

If so, how do you feel about introducing a new global stream, logs()?  This
could replace all uses of outs()/errs() in the LLVM libraries, and default
to errs().  Existing command-line tools could just use this default, but
compilers that are hosted inside of libraries or other non-command line
scenarios can attach a custom stream to logs() that captures all LLVM
output, including DEBUG and any legitimate pass output.  Command-line tools
can continue to use outs()/errs() just as they do now.  Nothing would
really change in the way LLVM operates by default.


>
> -Chris
>
>


-- 

Thanks,

Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120601/3562c559/attachment.html>


More information about the llvm-dev mailing list