That's reasonable. So then a better solution would be to keep everything in the .h file, but change operator<<(OStream&) to call the "print()" function directly. So something like this:
#include <iosfwd> // ... OStream& operator<<(OStream &OS, const MachineBasicBlock &MBB) { if (*OS.stream()) MBB->print(*OS.stream()); return OS; } I'm still working on a nice way of implementing something like this: template <typename StreamTy> class BaseStream { StreamTy *stream; public: operator StreamTy () { return *stream; } }; but I'm having problems figuring out the "null" stream semantics (right now, it uses "stream = 0" as an indication that it's "null"). But the above hack should suffice in the meantime. -bw On Dec 15, 2006, at 3:16 PM, Jeff Cohen wrote: > Chris asked me to not include <ostream> from header files, and to > move stuff out of the header files if possible to make it so. > > Bill Wendling wrote: >> Hold on. If you make these non-inlined, then the only chance for >> the compiler to remove potentially dead code (when o.stream() == >> 0) is through link time optimizations. Because this is still >> compiled by GCC right now, this won't be done and debug outputs >> will still be in the code. That is, they won't output anything, >> but the call will still be there. >> >> -bw >> >> On Dec 15, 2006, at 2:57 PM, Jeff Cohen wrote: >> >>> >>> >>> Changes in directory llvm/lib/CodeGen: >>> >>> LiveInterval.cpp updated: 1.40 -> 1.41 >>> MachineBasicBlock.cpp updated: 1.36 -> 1.37 >>> MachineInstr.cpp updated: 1.138 -> 1.139 >>> --- >>> Log message: >>> >>> An even better unbreakage... >>> >>> --- >>> Diffs of the changes: (+24 -0) >>> >>> LiveInterval.cpp | 7 +++++++ >>> MachineBasicBlock.cpp | 5 +++++ >>> MachineInstr.cpp | 12 ++++++++++++ >>> 3 files changed, 24 insertions(+) >>> >>> >>> Index: llvm/lib/CodeGen/LiveInterval.cpp >>> diff -u llvm/lib/CodeGen/LiveInterval.cpp:1.40 llvm/lib/CodeGen/ >>> LiveInterval.cpp:1.41 >>> --- llvm/lib/CodeGen/LiveInterval.cpp:1.40 Wed Dec 6 19:30:31 >>> 2006 >>> +++ llvm/lib/CodeGen/LiveInterval.cpp Fri Dec 15 16:57:14 2006 >>> @@ -24,6 +24,7 @@ >>> #include "llvm/Target/MRegisterInfo.h" >>> #include <algorithm> >>> #include <map> >>> +#include <ostream> >>> using namespace llvm; >>> >>> // An example for liveAt(): >>> @@ -509,3 +510,9 @@ >>> void LiveInterval::dump() const { >>> cerr << *this << "\n"; >>> } >>> + >>> + >>> +OStream& llvm::operator<<(OStream& os, const LiveRange &LR) { >>> + if (os.stream()) *os.stream() << LR; >>> + return os; >>> +} >>> >>> >>> Index: llvm/lib/CodeGen/MachineBasicBlock.cpp >>> diff -u llvm/lib/CodeGen/MachineBasicBlock.cpp:1.36 llvm/lib/ >>> CodeGen/MachineBasicBlock.cpp:1.37 >>> --- llvm/lib/CodeGen/MachineBasicBlock.cpp:1.36 Thu Dec 7 >>> 14:28:15 2006 >>> +++ llvm/lib/CodeGen/MachineBasicBlock.cpp Fri Dec 15 16:57:14 >>> 2006 >>> @@ -31,6 +31,11 @@ >>> return OS; >>> } >>> >>> +OStream& llvm::operator<<(OStream &OS, const MachineBasicBlock >>> &MBB) { >>> + if (OS.stream()) *OS.stream() << MBB; >>> + return OS; >>> +} >>> + >>> // MBBs start out as #-1. When a MBB is added to a >>> MachineFunction, it >>> // gets the next available unique MBB number. If it is removed >>> from a >>> // MachineFunction, it goes back to being #-1. >>> >>> >>> Index: llvm/lib/CodeGen/MachineInstr.cpp >>> diff -u llvm/lib/CodeGen/MachineInstr.cpp:1.138 llvm/lib/CodeGen/ >>> MachineInstr.cpp:1.139 >>> --- llvm/lib/CodeGen/MachineInstr.cpp:1.138 Wed Dec 6 >>> 19:30:31 2006 >>> +++ llvm/lib/CodeGen/MachineInstr.cpp Fri Dec 15 16:57:14 2006 >>> @@ -18,6 +18,7 @@ >>> #include "llvm/Target/MRegisterInfo.h" >>> #include "llvm/Support/LeakDetector.h" >>> #include "llvm/Support/Streams.h" >>> +#include <ostream> >>> using namespace llvm; >>> >>> /// MachineInstr ctor - This constructor creates a dummy >>> MachineInstr with >>> @@ -363,3 +364,14 @@ >>> >>> return OS; >>> } >>> + >>> +OStream& llvm::operator<<(OStream& os, const MachineInstr& >>> minstr) { >>> + if (os.stream()) *os.stream() << minstr; >>> + return os; >>> +} >>> + >>> +OStream& llvm::operator<<(OStream& os, const MachineOperand& mop) { >>> + if (os.stream()) *os.stream() << mop; >>> + return os; >>> +} >>> + >>> >>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits@cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> >> >> > _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits