[LLVMdev] Old DOUT
dag at cray.com
Fri Dec 11 09:44:55 PST 2009
On Friday 11 December 2009 11:35, Chris Lattner wrote:
> > I'm not sure what you mean here. It's not ok to convert code under
> > DEBUG() or #ifndef NDEBUG to use dbgs()?
> > Then what's the point of providing it?
> I don't know what dbgs does, so I don't know!
dbgs() will be a circular-buffering raw_ostream, meaning it saves
the last N bytes (N == unlimited by default) and displays the
output at program termination if requested. By default output
gets generated immediately, just like errs().
I will add a flag -debug-buffer-size=N to set the buffer and turn
on delayed output. This is super useful when trying to debug
very large codes. I have had debug output consume GBs of disk space.
This avoids that problem but it only works if all current debug
output goes to the new stream.
As I said, by default there is no change in behavior. dbgs() works
very similarly to the formatted_raw_ostream in that it uses errs()
underneath to do the actual output and only does the circular buffering
and delayed output if requested.
> > My intent is to have dbgs() == errs() when debug mode is disabled.
> Do you know why DOUT was removed?
Yes and no. I know the reasons given for removing it, but I believe they are
a bit misguided. DOUT was not the problem. Not using DEBUG was the problem.
> The problem is that things like this:
> DOUT << foo();
> evaluate foo even when assertions are disabled. This is bad, and bringing
> it back with a new name is not good.
That's not what I'm proposing.
DOUT << foo();
is broken. It should have been written as:
DEBUG(DOUT << foo());
Today we use:
DEBUG(errs() << foo());
With dbgs() it will be:
DEBUG(dbgs() << foo());
The only functional difference is the ability to use circular buffering.
> > One option is to make the signature SDNode::dump(raw_ostream &) or create
> > a new overload.
> The normal pattern is to define print(raw_ostream&) and have dump() call
Right. And so now it will call print(dbgs()).
More information about the llvm-dev