From: Chris Lattner Date: Sat, 23 Aug 2008 22:23:09 +0000 (+0000) Subject: Switch the asmprinter (.ll) and all the stuff it requires over to X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=944fac71e082cc2664cc71b4d3f6c72bab7143fb;p=oota-llvm.git Switch the asmprinter (.ll) and all the stuff it requires over to use raw_ostream instead of std::ostream. Among other goodness, this speeds up llvm-dis of kc++ with a release build from 0.85s to 0.49s (88% faster). Other interesting changes: 1) This makes Value::print be non-virtual. 2) AP[S]Int and ConstantRange can no longer print to ostream directly, use raw_ostream instead. 3) This fixes a bug in raw_os_ostream where it didn't flush itself when destroyed. 4) This adds a new SDNode::print method, instead of only allowing "dump". A lot of APIs have both std::ostream and raw_ostream versions, it would be useful to go through and systematically anihilate the std::ostream versions. This passes dejagnu, but there may be minor fallout, plz let me know if so and I'll fix it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55263 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/examples/Fibonacci/fibonacci.cpp b/examples/Fibonacci/fibonacci.cpp index f4c5c3d698a..09f2203c68f 100644 --- a/examples/Fibonacci/fibonacci.cpp +++ b/examples/Fibonacci/fibonacci.cpp @@ -32,7 +32,7 @@ #include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/GenericValue.h" -#include +#include "llvm/Support/raw_ostream.h" using namespace llvm; static Function *CreateFibFunction(Module *M) { @@ -100,15 +100,15 @@ int main(int argc, char **argv) { ExistingModuleProvider *MP = new ExistingModuleProvider(M); ExecutionEngine *EE = ExecutionEngine::create(MP, false); - std::cerr << "verifying... "; + errs() << "verifying... "; if (verifyModule(*M)) { - std::cerr << argv[0] << ": Error constructing function!\n"; + errs() << argv[0] << ": Error constructing function!\n"; return 1; } - std::cerr << "OK\n"; - std::cerr << "We just constructed this LLVM module:\n\n---------\n" << *M; - std::cerr << "---------\nstarting fibonacci(" << n << ") with JIT...\n"; + errs() << "OK\n"; + errs() << "We just constructed this LLVM module:\n\n---------\n" << *M; + errs() << "---------\nstarting fibonacci(" << n << ") with JIT...\n"; // Call the Fibonacci function with argument n: std::vector Args(1); @@ -116,6 +116,6 @@ int main(int argc, char **argv) { GenericValue GV = EE->runFunction(FibF, Args); // import result of execution - std::cout << "Result: " << GV.IntVal << "\n"; + outs() << "Result: " << GV.IntVal << "\n"; return 0; } diff --git a/examples/HowToUseJIT/HowToUseJIT.cpp b/examples/HowToUseJIT/HowToUseJIT.cpp index d50000579ef..0482df6248f 100644 --- a/examples/HowToUseJIT/HowToUseJIT.cpp +++ b/examples/HowToUseJIT/HowToUseJIT.cpp @@ -42,7 +42,7 @@ #include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/GenericValue.h" -#include +#include "llvm/Support/raw_ostream.h" using namespace llvm; int main() { @@ -99,14 +99,15 @@ int main() { ExistingModuleProvider* MP = new ExistingModuleProvider(M); ExecutionEngine* EE = ExecutionEngine::create(MP, false); - std::cout << "We just constructed this LLVM module:\n\n" << *M; - std::cout << "\n\nRunning foo: " << std::flush; + outs() << "We just constructed this LLVM module:\n\n" << *M; + outs() << "\n\nRunning foo: "; + outs().flush(); // Call the `foo' function with no arguments: std::vector noargs; GenericValue gv = EE->runFunction(FooF, noargs); // Import result of execution: - std::cout << "Result: " << gv.IntVal << "\n"; + outs() << "Result: " << gv.IntVal << "\n"; return 0; } diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index 25505c836e4..6baf12383bd 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -19,13 +19,13 @@ #include "llvm/Support/MathExtras.h" #include #include -#include #include namespace llvm { class Serializer; class Deserializer; class FoldingSetNodeID; + class raw_ostream; template class SmallVectorImpl; @@ -1115,8 +1115,7 @@ public: /// @} /// @name Conversion Functions /// @{ - - void print(std::ostream &OS, bool isSigned) const; + void print(raw_ostream &OS, bool isSigned) const; /// toString - Converts an APInt to a string and append it to Str. Str is /// commonly a SmallString. @@ -1385,7 +1384,7 @@ inline bool operator!=(uint64_t V1, const APInt& V2) { return V2 != V1; } -inline std::ostream &operator<<(std::ostream &OS, const APInt &I) { +inline raw_ostream &operator<<(raw_ostream &OS, const APInt &I) { I.print(OS, true); return OS; } diff --git a/include/llvm/ADT/APSInt.h b/include/llvm/ADT/APSInt.h index 00bece62ade..f16f49dc79e 100644 --- a/include/llvm/ADT/APSInt.h +++ b/include/llvm/ADT/APSInt.h @@ -239,7 +239,7 @@ public: void Profile(FoldingSetNodeID& ID) const; }; -inline std::ostream &operator<<(std::ostream &OS, const APSInt &I) { +inline raw_ostream &operator<<(raw_ostream &OS, const APSInt &I) { I.print(OS, I.isSigned()); return OS; } diff --git a/include/llvm/Argument.h b/include/llvm/Argument.h index 650bee3d105..c69caab8314 100644 --- a/include/llvm/Argument.h +++ b/include/llvm/Argument.h @@ -65,11 +65,6 @@ public: /// removeAttr - Remove a ParamAttr from an argument void removeAttr(ParameterAttributes); - virtual void print(std::ostream &OS) const; - void print(std::ostream *OS) const { - if (OS) print(*OS); - } - /// classof - Methods for support type inquiry through isa, cast, and /// dyn_cast: /// diff --git a/include/llvm/Assembly/AsmAnnotationWriter.h b/include/llvm/Assembly/AsmAnnotationWriter.h index 62926bb007a..b2549407221 100644 --- a/include/llvm/Assembly/AsmAnnotationWriter.h +++ b/include/llvm/Assembly/AsmAnnotationWriter.h @@ -17,13 +17,12 @@ #ifndef LLVM_ASSEMBLY_ASMANNOTATIONWRITER_H #define LLVM_ASSEMBLY_ASMANNOTATIONWRITER_H -#include - namespace llvm { class Function; class BasicBlock; class Instruction; +class raw_ostream; struct AssemblyAnnotationWriter { @@ -31,21 +30,21 @@ struct AssemblyAnnotationWriter { // emitFunctionAnnot - This may be implemented to emit a string right before // the start of a function. - virtual void emitFunctionAnnot(const Function *F, std::ostream &OS) {} + virtual void emitFunctionAnnot(const Function *F, raw_ostream &OS) {} // emitBasicBlockStartAnnot - This may be implemented to emit a string right // after the basic block label, but before the first instruction in the block. - virtual void emitBasicBlockStartAnnot(const BasicBlock *BB, std::ostream &OS){ + virtual void emitBasicBlockStartAnnot(const BasicBlock *BB, raw_ostream &OS){ } // emitBasicBlockEndAnnot - This may be implemented to emit a string right // after the basic block. - virtual void emitBasicBlockEndAnnot(const BasicBlock *BB, std::ostream &OS){ + virtual void emitBasicBlockEndAnnot(const BasicBlock *BB, raw_ostream &OS){ } // emitInstructionAnnot - This may be implemented to emit a string right // before an instruction is emitted. - virtual void emitInstructionAnnot(const Instruction *I, std::ostream &OS) {} + virtual void emitInstructionAnnot(const Instruction *I, raw_ostream &OS) {} }; } // End llvm namespace diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h index b4765df7a5a..c9f8edb3524 100644 --- a/include/llvm/Assembly/Writer.h +++ b/include/llvm/Assembly/Writer.h @@ -24,12 +24,14 @@ namespace llvm { class Type; class Module; class Value; +class raw_ostream; // WriteTypeSymbolic - This attempts to write the specified type as a symbolic // type, iff there is an entry in the Module's symbol table for the specified // type or one of its component types. This is slower than a simple x << Type; // void WriteTypeSymbolic(std::ostream &, const Type *, const Module *M); +void WriteTypeSymbolic(raw_ostream &, const Type *, const Module *M); // WriteAsOperand - Write the name of the specified value out to the specified // ostream. This can be useful when you just want to print int %reg126, not the @@ -39,6 +41,8 @@ void WriteTypeSymbolic(std::ostream &, const Type *, const Module *M); // void WriteAsOperand(std::ostream &, const Value *, bool PrintTy = true, const Module *Context = 0); +void WriteAsOperand(raw_ostream &, const Value *, bool PrintTy = true, + const Module *Context = 0); } // End llvm namespace diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 6614a938830..fd729acd28d 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -157,10 +157,6 @@ public: const InstListType &getInstList() const { return InstList; } InstListType &getInstList() { return InstList; } - virtual void print(std::ostream &OS) const { print(OS, 0); } - void print(std::ostream *OS) const { if (OS) print(*OS); } - void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; - /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const BasicBlock *) { return true; } static inline bool classof(const Value *V) { diff --git a/include/llvm/CodeGen/MachineConstantPool.h b/include/llvm/CodeGen/MachineConstantPool.h index ba491ce2556..b6bf566f3f5 100644 --- a/include/llvm/CodeGen/MachineConstantPool.h +++ b/include/llvm/CodeGen/MachineConstantPool.h @@ -29,6 +29,7 @@ class TargetData; class TargetMachine; class Type; class MachineConstantPool; +class raw_ostream; /// Abstract base class for all machine specific constantpool value subclasses. /// @@ -50,8 +51,9 @@ public: /// print - Implement operator<<... /// - virtual void print(std::ostream &O) const = 0; + void print(std::ostream &O) const; void print(std::ostream *O) const { if (O) print(*O); } + virtual void print(raw_ostream &O) const = 0; }; inline std::ostream &operator<<(std::ostream &OS, @@ -59,6 +61,13 @@ inline std::ostream &operator<<(std::ostream &OS, V.print(OS); return OS; } + +inline raw_ostream &operator<<(raw_ostream &OS, + const MachineConstantPoolValue &V) { + V.print(OS); + return OS; +} + /// This class is a data container for one entry in a MachineConstantPool. /// It contains a pointer to the value and an offset from the start of diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 9796e066ddf..6c1565916e6 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -1260,6 +1260,7 @@ public: /// std::string getOperationName(const SelectionDAG *G = 0) const; static const char* getIndexedModeName(ISD::MemIndexedMode AM); + void print(raw_ostream &OS, const SelectionDAG *G = 0) const; void dump() const; void dump(const SelectionDAG *G) const; diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index faaced80410..12e1dd2db94 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -58,9 +58,6 @@ public: /// getNullValue. virtual bool isNullValue() const = 0; - virtual void print(std::ostream &O) const; - void print(std::ostream *O) const { if (O) print(*O); } - /// canTrap - Return true if evaluation of this constant could trap. This is /// true for things like constant expressions that could divide by zero. bool canTrap() const; diff --git a/include/llvm/Function.h b/include/llvm/Function.h index 04e0535acec..f302ff570fc 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -301,10 +301,6 @@ public: size_t arg_size() const; bool arg_empty() const; - virtual void print(std::ostream &OS) const { print(OS, 0); } - void print(std::ostream *OS) const { if (OS) print(*OS); } - void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; - /// viewCFG - This function is meant for use from the debugger. You can just /// say 'call F->viewCFG()' and a ghostview window should pop up from the /// program, displaying the CFG of the current function with the code for each diff --git a/include/llvm/GlobalAlias.h b/include/llvm/GlobalAlias.h index 124cf94fa9a..4dfc9c4d5e0 100644 --- a/include/llvm/GlobalAlias.h +++ b/include/llvm/GlobalAlias.h @@ -62,9 +62,6 @@ public: /// void eraseFromParent(); - virtual void print(std::ostream &OS) const; - void print(std::ostream *OS) const { if (OS) print(*OS); } - /// set/getAliasee - These methods retrive and set alias target. void setAliasee(Constant* GV); const Constant* getAliasee() const { diff --git a/include/llvm/GlobalVariable.h b/include/llvm/GlobalVariable.h index b6910d54c9b..aae17e409da 100644 --- a/include/llvm/GlobalVariable.h +++ b/include/llvm/GlobalVariable.h @@ -133,9 +133,6 @@ public: /// replace constant initializers. virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); - virtual void print(std::ostream &OS) const; - void print(std::ostream *OS) const { if (OS) print(*OS); } - // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const GlobalVariable *) { return true; } static inline bool classof(const Value *V) { diff --git a/include/llvm/InlineAsm.h b/include/llvm/InlineAsm.h index bb046c2a3cb..325b777dd49 100644 --- a/include/llvm/InlineAsm.h +++ b/include/llvm/InlineAsm.h @@ -21,7 +21,6 @@ namespace llvm { -struct AssemblyAnnotationWriter; class PointerType; class FunctionType; class Module; @@ -58,10 +57,6 @@ public: const std::string &getAsmString() const { return AsmString; } const std::string &getConstraintString() const { return Constraints; } - virtual void print(std::ostream &O) const { print(O, 0); } - void print(std::ostream *O) const { if (O) print(*O); } - void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; - /// Verify - This static method can be used by the parser to check to see if /// the specified constraint string is legal for the type. This returns true /// if legal, false if not. diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h index ac33a68bbfe..cec9144e35d 100644 --- a/include/llvm/Instruction.h +++ b/include/llvm/Instruction.h @@ -20,8 +20,6 @@ namespace llvm { -struct AssemblyAnnotationWriter; - template class SymbolTableListTraits; @@ -180,10 +178,6 @@ public: } static bool isTrapping(unsigned op); - virtual void print(std::ostream &OS) const { print(OS, 0); } - void print(std::ostream *OS) const { if (OS) print(*OS); } - void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; - /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const Instruction *) { return true; } static inline bool classof(const Value *V) { diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 56207a0af27..de121578750 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -350,15 +350,11 @@ public: /// @name Utility functions for printing and dumping Module objects /// @{ public: - /// Print the module to an output stream - void print(std::ostream &OS) const { print(OS, 0); } - void print(std::ostream *OS) const { if (OS) print(*OS); } /// Print the module to an output stream with AssemblyAnnotationWriter. + void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const; void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; - void print(std::ostream *OS, AssemblyAnnotationWriter *AAW) const { - if (OS) print(*OS, AAW); - } - /// Dump the module to std::cerr (for debugging). + + /// Dump the module to stderr (for debugging). void dump() const; /// This function causes all the subinstructions to "let go" of all references /// that they are maintaining. This allows one to 'delete' a whole class at @@ -385,9 +381,14 @@ public: /// An iostream inserter for modules. inline std::ostream &operator<<(std::ostream &O, const Module &M) { - M.print(O); + M.print(O, 0); + return O; +} +inline raw_ostream &operator<<(raw_ostream &O, const Module &M) { + M.print(O, 0); return O; } + inline ValueSymbolTable * ilist_traits::getSymTab(Module *M) { diff --git a/include/llvm/Support/ConstantRange.h b/include/llvm/Support/ConstantRange.h index 2e477cf8998..1a8907666fe 100644 --- a/include/llvm/Support/ConstantRange.h +++ b/include/llvm/Support/ConstantRange.h @@ -32,8 +32,6 @@ #include "llvm/ADT/APInt.h" #include "llvm/Support/DataTypes.h" -#include "llvm/Support/Streams.h" -#include namespace llvm { @@ -180,15 +178,14 @@ class ConstantRange { /// print - Print out the bounds to a stream... /// - void print(std::ostream &OS) const; - void print(std::ostream *OS) const { if (OS) print(*OS); } + void print(raw_ostream &OS) const; /// dump - Allow printing from a debugger easily... /// void dump() const; }; -inline std::ostream &operator<<(std::ostream &OS, const ConstantRange &CR) { +inline raw_ostream &operator<<(raw_ostream &OS, const ConstantRange &CR) { CR.print(OS); return OS; } diff --git a/include/llvm/Support/raw_ostream.h b/include/llvm/Support/raw_ostream.h index e78cfe86417..9fb5f6cb387 100644 --- a/include/llvm/Support/raw_ostream.h +++ b/include/llvm/Support/raw_ostream.h @@ -96,7 +96,7 @@ public: raw_ostream &operator<<(long N); raw_ostream &operator<<(unsigned long long N); raw_ostream &operator<<(long long N); - + raw_ostream &operator<<(const void *P); raw_ostream &operator<<(unsigned int N) { return this->operator<<(static_cast(N)); } @@ -201,7 +201,8 @@ class raw_os_ostream : public raw_ostream { std::ostream &OS; public: raw_os_ostream(std::ostream &O) : OS(O) {} - + ~raw_os_ostream(); + /// flush_impl - The is the piece of the class that is implemented by /// subclasses. This outputs the currently buffered data and resets the /// buffer to empty. diff --git a/include/llvm/Type.h b/include/llvm/Type.h index 5bcb654a4a9..ec970565dc3 100644 --- a/include/llvm/Type.h +++ b/include/llvm/Type.h @@ -14,7 +14,6 @@ #include "llvm/AbstractTypeUser.h" #include "llvm/Support/Casting.h" #include "llvm/Support/DataTypes.h" -#include "llvm/Support/Streams.h" #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/iterator.h" #include @@ -26,6 +25,7 @@ class DerivedType; class PointerType; class IntegerType; class TypeMapBase; +class raw_ostream; /// This file contains the declaration of the Type class. For more "Type" type /// stuff, look in DerivedTypes.h. @@ -156,6 +156,7 @@ protected: PATypeHandle *ContainedTys; public: + void print(raw_ostream &O) const; void print(std::ostream &O) const; void print(std::ostream *O) const { if (O) print(*O); } @@ -450,6 +451,7 @@ template <> inline bool isa_impl(const Type &Ty) { } std::ostream &operator<<(std::ostream &OS, const Type &T); +raw_ostream &operator<<(raw_ostream &OS, const Type &T); } // End llvm namespace diff --git a/include/llvm/Value.h b/include/llvm/Value.h index 82e1502e585..ceb1ad246d5 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -35,6 +35,8 @@ class ValueSymbolTable; class TypeSymbolTable; template class StringMapEntry; typedef StringMapEntry ValueName; +class raw_ostream; +class AssemblyAnnotationWriter; //===----------------------------------------------------------------------===// // Value Class @@ -76,10 +78,10 @@ public: // virtual void dump() const; - /// print - Implement operator<< on Value... + /// print - Implement operator<< on Value. /// - virtual void print(std::ostream &O) const = 0; - void print(std::ostream *O) const { if (O) print(*O); } + void print(std::ostream &O, AssemblyAnnotationWriter *AAW = 0) const; + void print(raw_ostream &O, AssemblyAnnotationWriter *AAW = 0) const; /// All values are typed, get the type of this value. /// @@ -237,7 +239,11 @@ inline std::ostream &operator<<(std::ostream &OS, const Value &V) { V.print(OS); return OS; } - +inline raw_ostream &operator<<(raw_ostream &OS, const Value &V) { + V.print(OS); + return OS; +} + void Use::init(Value *V, User *) { Val = V; if (V) V->addUse(*this); diff --git a/lib/Analysis/LoopVR.cpp b/lib/Analysis/LoopVR.cpp index eb7524a9c2f..7f5de259caf 100644 --- a/lib/Analysis/LoopVR.cpp +++ b/lib/Analysis/LoopVR.cpp @@ -6,6 +6,10 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// +// +// FIXME: What does this do? +// +//===----------------------------------------------------------------------===// #define DEBUG_TYPE "loopvr" #include "llvm/Analysis/LoopVR.h" @@ -15,13 +19,11 @@ #include "llvm/Assembly/Writer.h" #include "llvm/Support/CFG.h" #include "llvm/Support/Debug.h" -#include "llvm/Support/Streams.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; char LoopVR::ID = 0; -namespace { static RegisterPass X("loopvr", "Loop Value Ranges", true, true); -} /// getRange - determine the range for a particular SCEV within a given Loop ConstantRange LoopVR::getRange(SCEVHandle S, Loop *L, ScalarEvolution &SE) { @@ -220,11 +222,10 @@ ConstantRange LoopVR::getRange(SCEVHandle S, SCEVHandle T, ScalarEvolution &SE){ bool LoopVR::runOnFunction(Function &F) { Map.clear(); return false; } void LoopVR::print(std::ostream &os, const Module *) const { + raw_os_ostream OS(os); for (std::map::const_iterator I = Map.begin(), E = Map.end(); I != E; ++I) { - os << *I->first << ": "; - I->second->print(os); - os << "\n"; + OS << *I->first << ": " << *I->second << '\n'; } } diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index b243297253f..bc5d59e8be8 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -28,6 +28,7 @@ #include "llvm/Instructions.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/GraphWriter.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" #include @@ -525,6 +526,10 @@ unsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V, return Constants.size()-1; } +void MachineConstantPoolValue::print(std::ostream &o) const { + raw_os_ostream OS(o); + print(OS); +} void MachineConstantPool::print(std::ostream &OS) const { for (unsigned i = 0, e = Constants.size(); i != e; ++i) { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 9275a21f9fb..fa73e73de07 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -24,12 +24,13 @@ #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/PseudoSourceValue.h" -#include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Support/MathExtras.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallSet.h" @@ -4980,169 +4981,166 @@ std::string ISD::ArgFlagsTy::getArgFlagsString() { void SDNode::dump() const { dump(0); } void SDNode::dump(const SelectionDAG *G) const { - cerr << (void*)this << ": "; + print(errs(), G); +} + +void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const { + OS << (void*)this << ": "; for (unsigned i = 0, e = getNumValues(); i != e; ++i) { - if (i) cerr << ","; + if (i) OS << ","; if (getValueType(i) == MVT::Other) - cerr << "ch"; + OS << "ch"; else - cerr << getValueType(i).getMVTString(); + OS << getValueType(i).getMVTString(); } - cerr << " = " << getOperationName(G); + OS << " = " << getOperationName(G); - cerr << " "; + OS << " "; for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { - if (i) cerr << ", "; - cerr << (void*)getOperand(i).Val; + if (i) OS << ", "; + OS << (void*)getOperand(i).Val; if (unsigned RN = getOperand(i).ResNo) - cerr << ":" << RN; + OS << ":" << RN; } if (!isTargetOpcode() && getOpcode() == ISD::VECTOR_SHUFFLE) { SDNode *Mask = getOperand(2).Val; - cerr << "<"; + OS << "<"; for (unsigned i = 0, e = Mask->getNumOperands(); i != e; ++i) { - if (i) cerr << ","; + if (i) OS << ","; if (Mask->getOperand(i).getOpcode() == ISD::UNDEF) - cerr << "u"; + OS << "u"; else - cerr << cast(Mask->getOperand(i))->getValue(); + OS << cast(Mask->getOperand(i))->getValue(); } - cerr << ">"; + OS << ">"; } if (const ConstantSDNode *CSDN = dyn_cast(this)) { - cerr << '<' << CSDN->getAPIntValue() << '>'; + OS << '<' << CSDN->getAPIntValue() << '>'; } else if (const ConstantFPSDNode *CSDN = dyn_cast(this)) { if (&CSDN->getValueAPF().getSemantics()==&APFloat::IEEEsingle) - cerr << '<' << CSDN->getValueAPF().convertToFloat() << '>'; + OS << '<' << CSDN->getValueAPF().convertToFloat() << '>'; else if (&CSDN->getValueAPF().getSemantics()==&APFloat::IEEEdouble) - cerr << '<' << CSDN->getValueAPF().convertToDouble() << '>'; + OS << '<' << CSDN->getValueAPF().convertToDouble() << '>'; else { - cerr << "getValueAPF().convertToAPInt().dump(); - cerr << ")>"; + OS << ")>"; } } else if (const GlobalAddressSDNode *GADN = dyn_cast(this)) { int offset = GADN->getOffset(); - cerr << '<'; - WriteAsOperand(*cerr.stream(), GADN->getGlobal()); - cerr << '>'; + OS << '<'; + WriteAsOperand(OS, GADN->getGlobal()); + OS << '>'; if (offset > 0) - cerr << " + " << offset; + OS << " + " << offset; else - cerr << " " << offset; + OS << " " << offset; } else if (const FrameIndexSDNode *FIDN = dyn_cast(this)) { - cerr << "<" << FIDN->getIndex() << ">"; + OS << "<" << FIDN->getIndex() << ">"; } else if (const JumpTableSDNode *JTDN = dyn_cast(this)) { - cerr << "<" << JTDN->getIndex() << ">"; + OS << "<" << JTDN->getIndex() << ">"; } else if (const ConstantPoolSDNode *CP = dyn_cast(this)){ int offset = CP->getOffset(); if (CP->isMachineConstantPoolEntry()) - cerr << "<" << *CP->getMachineCPVal() << ">"; + OS << "<" << *CP->getMachineCPVal() << ">"; else - cerr << "<" << *CP->getConstVal() << ">"; + OS << "<" << *CP->getConstVal() << ">"; if (offset > 0) - cerr << " + " << offset; + OS << " + " << offset; else - cerr << " " << offset; + OS << " " << offset; } else if (const BasicBlockSDNode *BBDN = dyn_cast(this)) { - cerr << "<"; + OS << "<"; const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); if (LBB) - cerr << LBB->getName() << " "; - cerr << (const void*)BBDN->getBasicBlock() << ">"; + OS << LBB->getName() << " "; + OS << (const void*)BBDN->getBasicBlock() << ">"; } else if (const RegisterSDNode *R = dyn_cast(this)) { if (G && R->getReg() && TargetRegisterInfo::isPhysicalRegister(R->getReg())) { - cerr << " " << G->getTarget().getRegisterInfo()->getName(R->getReg()); + OS << " " << G->getTarget().getRegisterInfo()->getName(R->getReg()); } else { - cerr << " #" << R->getReg(); + OS << " #" << R->getReg(); } } else if (const ExternalSymbolSDNode *ES = dyn_cast(this)) { - cerr << "'" << ES->getSymbol() << "'"; + OS << "'" << ES->getSymbol() << "'"; } else if (const SrcValueSDNode *M = dyn_cast(this)) { if (M->getValue()) - cerr << "<" << M->getValue() << ">"; + OS << "<" << M->getValue() << ">"; else - cerr << ""; + OS << ""; } else if (const MemOperandSDNode *M = dyn_cast(this)) { if (M->MO.getValue()) - cerr << "<" << M->MO.getValue() << ":" << M->MO.getOffset() << ">"; + OS << "<" << M->MO.getValue() << ":" << M->MO.getOffset() << ">"; else - cerr << "MO.getOffset() << ">"; + OS << "MO.getOffset() << ">"; } else if (const ARG_FLAGSSDNode *N = dyn_cast(this)) { - cerr << N->getArgFlags().getArgFlagsString(); + OS << N->getArgFlags().getArgFlagsString(); } else if (const VTSDNode *N = dyn_cast(this)) { - cerr << ":" << N->getVT().getMVTString(); + OS << ":" << N->getVT().getMVTString(); } else if (const LoadSDNode *LD = dyn_cast(this)) { const Value *SrcValue = LD->getSrcValue(); int SrcOffset = LD->getSrcValueOffset(); - cerr << " <"; + OS << " <"; if (SrcValue) - cerr << SrcValue; + OS << SrcValue; else - cerr << "null"; - cerr << ":" << SrcOffset << ">"; + OS << "null"; + OS << ":" << SrcOffset << ">"; bool doExt = true; switch (LD->getExtensionType()) { default: doExt = false; break; - case ISD::EXTLOAD: - cerr << " getMemoryVT().getMVTString() << ">"; + OS << LD->getMemoryVT().getMVTString() << ">"; const char *AM = getIndexedModeName(LD->getAddressingMode()); if (*AM) - cerr << " " << AM; + OS << " " << AM; if (LD->isVolatile()) - cerr << " "; - cerr << " alignment=" << LD->getAlignment(); + OS << " "; + OS << " alignment=" << LD->getAlignment(); } else if (const StoreSDNode *ST = dyn_cast(this)) { const Value *SrcValue = ST->getSrcValue(); int SrcOffset = ST->getSrcValueOffset(); - cerr << " <"; + OS << " <"; if (SrcValue) - cerr << SrcValue; + OS << SrcValue; else - cerr << "null"; - cerr << ":" << SrcOffset << ">"; + OS << "null"; + OS << ":" << SrcOffset << ">"; if (ST->isTruncatingStore()) - cerr << " getMemoryVT().getMVTString() << ">"; + OS << " getMemoryVT().getMVTString() << ">"; const char *AM = getIndexedModeName(ST->getAddressingMode()); if (*AM) - cerr << " " << AM; + OS << " " << AM; if (ST->isVolatile()) - cerr << " "; - cerr << " alignment=" << ST->getAlignment(); + OS << " "; + OS << " alignment=" << ST->getAlignment(); } else if (const AtomicSDNode* AT = dyn_cast(this)) { const Value *SrcValue = AT->getSrcValue(); int SrcOffset = AT->getSrcValueOffset(); - cerr << " <"; + OS << " <"; if (SrcValue) - cerr << SrcValue; + OS << SrcValue; else - cerr << "null"; - cerr << ":" << SrcOffset << ">"; + OS << "null"; + OS << ":" << SrcOffset << ">"; if (AT->isVolatile()) - cerr << " "; - cerr << " alignment=" << AT->getAlignment(); + OS << " "; + OS << " alignment=" << AT->getAlignment(); } } diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index f4153130603..8f506bc720c 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/raw_ostream.h" #include #include #include @@ -41,8 +42,7 @@ inline static uint64_t* getMemory(uint32_t numWords) { return result; } -void APInt::initSlowCase(uint32_t numBits, uint64_t val, bool isSigned) -{ +void APInt::initSlowCase(uint32_t numBits, uint64_t val, bool isSigned) { pVal = getClearedMemory(getNumWords()); pVal[0] = val; if (isSigned && int64_t(val) < 0) @@ -51,7 +51,7 @@ void APInt::initSlowCase(uint32_t numBits, uint64_t val, bool isSigned) } APInt::APInt(uint32_t numBits, uint32_t numWords, const uint64_t bigVal[]) - : BitWidth(numBits), VAL(0) { + : BitWidth(numBits), VAL(0) { assert(BitWidth && "bitwidth too small"); assert(bigVal && "Null pointer detected!"); if (isSingleWord()) @@ -1995,13 +1995,12 @@ void APInt::dump() const { fprintf(stderr, "APInt(%db, %su %ss)", BitWidth, U.c_str(), S.c_str()); } -void APInt::print(std::ostream &OS, bool isSigned) const { +void APInt::print(raw_ostream &OS, bool isSigned) const { SmallString<40> S; this->toString(S, 10, isSigned); OS << S.c_str(); } - // This implements a variety of operations on a representation of // arbitrary precision, two's-complement, bignum integer values. diff --git a/lib/Support/ConstantRange.cpp b/lib/Support/ConstantRange.cpp index 9c83b7c59de..cb8c4b013c3 100644 --- a/lib/Support/ConstantRange.cpp +++ b/lib/Support/ConstantRange.cpp @@ -22,8 +22,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/ConstantRange.h" -#include "llvm/Support/Streams.h" -#include +#include "llvm/Support/raw_ostream.h" using namespace llvm; /// Initialize a full (the default) or empty set for the specified type. @@ -462,12 +461,12 @@ ConstantRange ConstantRange::truncate(uint32_t DstTySize) const { /// print - Print out the bounds to a stream... /// -void ConstantRange::print(std::ostream &OS) const { +void ConstantRange::print(raw_ostream &OS) const { OS << "[" << Lower << "," << Upper << ")"; } /// dump - Allow printing from a debugger easily... /// void ConstantRange::dump() const { - print(cerr); + print(errs()); } diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 432e6031948..9827ca776ad 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -99,6 +99,12 @@ raw_ostream &raw_ostream::operator<<(long long N) { return this->operator<<(static_cast(N)); } +raw_ostream &raw_ostream::operator<<(const void *P) { + // FIXME: This could be much faster if it matters. + return *this << format("%p", P); +} + + raw_ostream &raw_ostream::write(const char *Ptr, unsigned Size) { if (OutBufCur+Size > OutBufEnd) flush_impl(); @@ -250,6 +256,10 @@ raw_ostream &llvm::errs() { // raw_os_ostream //===----------------------------------------------------------------------===// +raw_os_ostream::~raw_os_ostream() { + flush(); +} + /// flush_impl - The is the piece of the class that is implemented by /// subclasses. This outputs the currently buffered data and resets the /// buffer to empty. diff --git a/lib/Target/ARM/ARMConstantPoolValue.cpp b/lib/Target/ARM/ARMConstantPoolValue.cpp index 6add3c38d37..04db1644f8c 100644 --- a/lib/Target/ARM/ARMConstantPoolValue.cpp +++ b/lib/Target/ARM/ARMConstantPoolValue.cpp @@ -15,6 +15,7 @@ #include "llvm/ADT/FoldingSet.h" #include "llvm/GlobalValue.h" #include "llvm/Type.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id, @@ -72,7 +73,7 @@ ARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddInteger(PCAdjust); } -void ARMConstantPoolValue::print(std::ostream &O) const { +void ARMConstantPoolValue::print(raw_ostream &O) const { if (GV) O << GV->getName(); else diff --git a/lib/Target/ARM/ARMConstantPoolValue.h b/lib/Target/ARM/ARMConstantPoolValue.h index 636166349a7..caf8d54f163 100644 --- a/lib/Target/ARM/ARMConstantPoolValue.h +++ b/lib/Target/ARM/ARMConstantPoolValue.h @@ -69,7 +69,7 @@ public: virtual void AddSelectionDAGCSEId(FoldingSetNodeID &ID); - virtual void print(std::ostream &O) const; + virtual void print(raw_ostream &O) const; }; } diff --git a/lib/Target/PIC16/PIC16ConstantPoolValue.cpp b/lib/Target/PIC16/PIC16ConstantPoolValue.cpp index 6e324f9e4d6..152c7377ab7 100644 --- a/lib/Target/PIC16/PIC16ConstantPoolValue.cpp +++ b/lib/Target/PIC16/PIC16ConstantPoolValue.cpp @@ -15,6 +15,7 @@ #include "llvm/ADT/FoldingSet.h" #include "llvm/GlobalValue.h" #include "llvm/Type.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; PIC16ConstantPoolValue::PIC16ConstantPoolValue(GlobalValue *gv, unsigned id, @@ -70,7 +71,7 @@ PIC16ConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddInteger(PCAdjust); } -void PIC16ConstantPoolValue::print(std::ostream &O) const { +void PIC16ConstantPoolValue::print(raw_ostream &O) const { if (GV) O << GV->getName(); else diff --git a/lib/Target/PIC16/PIC16ConstantPoolValue.h b/lib/Target/PIC16/PIC16ConstantPoolValue.h index c8faf593373..657fb15171b 100644 --- a/lib/Target/PIC16/PIC16ConstantPoolValue.h +++ b/lib/Target/PIC16/PIC16ConstantPoolValue.h @@ -69,7 +69,7 @@ public: virtual void AddSelectionDAGCSEId(FoldingSetNodeID &ID); - virtual void print(std::ostream &O) const; + virtual void print(raw_ostream &O) const; }; } diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 2672e4e762a..9a94fad9327 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -922,7 +922,7 @@ namespace { void dump(std::ostream &os) const { os << "{"; for (const_iterator I = begin(), E = end(); I != E; ++I) { - os << I->second << " (" << I->first->getDFSNumIn() << "), "; + os << &I->second << " (" << I->first->getDFSNumIn() << "), "; } os << "}"; } diff --git a/lib/Transforms/Utils/LowerSwitch.cpp b/lib/Transforms/Utils/LowerSwitch.cpp index 7409e779f80..99e938416ec 100644 --- a/lib/Transforms/Utils/LowerSwitch.cpp +++ b/lib/Transforms/Utils/LowerSwitch.cpp @@ -22,6 +22,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/raw_ostream.h" #include using namespace llvm; @@ -144,9 +145,10 @@ BasicBlock* LowerSwitch::switchConvert(CaseItr Begin, CaseItr End, DOUT << "RHS: " << RHS << "\n"; CaseRange& Pivot = *(Begin + Mid); - DEBUG(cerr << "Pivot ==> " - << cast(Pivot.Low)->getValue() << " -" - << cast(Pivot.High)->getValue() << "\n"); + DEBUG(errs() << "Pivot ==> " + << cast(Pivot.Low)->getValue() << " -" + << cast(Pivot.High)->getValue() << "\n"; + errs().flush()); BasicBlock* LBranch = switchConvert(LHS.begin(), LHS.end(), Val, OrigBlock, Default); diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 146cabaeb40..ee73d7225cc 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -31,7 +31,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Support/CFG.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/Streams.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -126,7 +125,7 @@ enum PrefixType { /// PrintLLVMName - Turn the specified name into an 'LLVM name', which is either /// prefixed with % (if the string only contains simple characters) or is /// surrounded with ""'s (if it has special chars in it). Print it out. -static void PrintLLVMName(std::ostream &OS, const char *NameStr, +static void PrintLLVMName(raw_ostream &OS, const char *NameStr, unsigned NameLen, PrefixType Prefix) { assert(NameStr && "Cannot get empty name!"); switch (Prefix) { @@ -184,7 +183,7 @@ static void PrintLLVMName(std::ostream &OS, const char *NameStr, /// PrintLLVMName - Turn the specified name into an 'LLVM name', which is either /// prefixed with % (if the string only contains simple characters) or is /// surrounded with ""'s (if it has special chars in it). Print it out. -static void PrintLLVMName(std::ostream &OS, const Value *V) { +static void PrintLLVMName(raw_ostream &OS, const Value *V) { PrintLLVMName(OS, V->getNameStart(), V->getNameLen(), isa(V) ? GlobalPrefix : LocalPrefix); } @@ -439,7 +438,7 @@ void SlotTracker::CreateFunctionSlot(const Value *V) { // AsmWriter Implementation //===----------------------------------------------------------------------===// -static void WriteAsOperandInternal(std::ostream &Out, const Value *V, +static void WriteAsOperandInternal(raw_ostream &Out, const Value *V, std::map &TypeTable, SlotTracker *Machine); @@ -579,7 +578,7 @@ static void calcTypeName(const Type *Ty, /// printTypeInt - The internal guts of printing out a type that has a /// potentially named portion. /// -static void printTypeInt(std::ostream &Out, const Type *Ty, +static void printTypeInt(raw_ostream &Out, const Type *Ty, std::map &TypeNames) { // Primitive types always print out their description, regardless of whether // they have been named or not. @@ -614,6 +613,11 @@ static void printTypeInt(std::ostream &Out, const Type *Ty, /// void llvm::WriteTypeSymbolic(std::ostream &Out, const Type *Ty, const Module *M) { + raw_os_ostream RO(Out); + WriteTypeSymbolic(RO, Ty, M); +} + +void llvm::WriteTypeSymbolic(raw_ostream &Out, const Type *Ty, const Module *M){ Out << ' '; // If they want us to print out a type, but there is no context, we can't @@ -629,7 +633,7 @@ void llvm::WriteTypeSymbolic(std::ostream &Out, const Type *Ty, // PrintEscapedString - Print each character of the specified string, escaping // it if it is not printable or if it is an escape char. -static void PrintEscapedString(const std::string &Str, std::ostream &Out) { +static void PrintEscapedString(const std::string &Str, raw_ostream &Out) { for (unsigned i = 0, e = Str.size(); i != e; ++i) { unsigned char C = Str[i]; if (isprint(C) && C != '"' && C != '\\') { @@ -675,7 +679,7 @@ static const char *getPredicateText(unsigned predicate) { return pred; } -static void WriteConstantInt(std::ostream &Out, const Constant *CV, +static void WriteConstantInt(raw_ostream &Out, const Constant *CV, std::map &TypeTable, SlotTracker *Machine) { if (const ConstantInt *CI = dyn_cast(CV)) { @@ -873,7 +877,7 @@ static void WriteConstantInt(std::ostream &Out, const Constant *CV, /// ostream. This can be useful when you just want to print int %reg126, not /// the whole instruction that generated it. /// -static void WriteAsOperandInternal(std::ostream &Out, const Value *V, +static void WriteAsOperandInternal(raw_ostream &Out, const Value *V, std::map &TypeTable, SlotTracker *Machine) { Out << ' '; @@ -936,6 +940,12 @@ static void WriteAsOperandInternal(std::ostream &Out, const Value *V, /// void llvm::WriteAsOperand(std::ostream &Out, const Value *V, bool PrintType, const Module *Context) { + raw_os_ostream OS(Out); + WriteAsOperand(OS, V, PrintType, Context); +} + +void llvm::WriteAsOperand(raw_ostream &Out, const Value *V, bool PrintType, + const Module *Context) { std::map TypeNames; if (Context == 0) Context = getModuleFromVal(V); @@ -952,13 +962,13 @@ void llvm::WriteAsOperand(std::ostream &Out, const Value *V, bool PrintType, namespace { class AssemblyWriter { - std::ostream &Out; + raw_ostream &Out; SlotTracker &Machine; const Module *TheModule; std::map TypeNames; AssemblyAnnotationWriter *AnnotationWriter; public: - inline AssemblyWriter(std::ostream &o, SlotTracker &Mac, const Module *M, + inline AssemblyWriter(raw_ostream &o, SlotTracker &Mac, const Module *M, AssemblyAnnotationWriter *AAW) : Out(o), Machine(Mac), TheModule(M), AnnotationWriter(AAW) { @@ -968,10 +978,19 @@ public: fillTypeNameTable(M, TypeNames); } - void write(const Module *M) { printModule(M); } - void write(const GlobalVariable *G) { printGlobal(G); } - void write(const GlobalAlias *G) { printAlias(G); } - void write(const Function *F) { printFunction(F); } + void write(const Module *M) { printModule(M); } + + void write(const GlobalValue *G) { + if (const GlobalVariable *GV = dyn_cast(G)) + printGlobal(GV); + else if (const GlobalAlias *GA = dyn_cast(G)) + printAlias(GA); + else if (const Function *F = dyn_cast(G)) + printFunction(F); + else + assert(0 && "Unknown global"); + } + void write(const BasicBlock *BB) { printBasicBlock(BB); } void write(const Instruction *I) { printInstruction(*I); } void write(const Type *Ty) { printType(Ty); } @@ -1176,7 +1195,7 @@ void AssemblyWriter::printModule(const Module *M) { printFunction(I); } -static void PrintLinkage(GlobalValue::LinkageTypes LT, std::ostream &Out) { +static void PrintLinkage(GlobalValue::LinkageTypes LT, raw_ostream &Out) { switch (LT) { case GlobalValue::InternalLinkage: Out << "internal "; break; case GlobalValue::LinkOnceLinkage: Out << "linkonce "; break; @@ -1195,7 +1214,7 @@ static void PrintLinkage(GlobalValue::LinkageTypes LT, std::ostream &Out) { static void PrintVisibility(GlobalValue::VisibilityTypes Vis, - std::ostream &Out) { + raw_ostream &Out) { switch (Vis) { default: assert(0 && "Invalid visibility style!"); case GlobalValue::DefaultVisibility: break; @@ -1705,74 +1724,75 @@ void AssemblyWriter::printInstruction(const Instruction &I) { //===----------------------------------------------------------------------===// void Module::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const { - SlotTracker SlotTable(this); - AssemblyWriter W(o, SlotTable, this, AAW); - W.write(this); -} - -void GlobalVariable::print(std::ostream &o) const { - SlotTracker SlotTable(getParent()); - AssemblyWriter W(o, SlotTable, getParent(), 0); - W.write(this); -} - -void GlobalAlias::print(std::ostream &o) const { - SlotTracker SlotTable(getParent()); - AssemblyWriter W(o, SlotTable, getParent(), 0); - W.write(this); -} - -void Function::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const { - SlotTracker SlotTable(getParent()); - AssemblyWriter W(o, SlotTable, getParent(), AAW); - - W.write(this); + raw_os_ostream OS(o); + print(OS, AAW); } - -void InlineAsm::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const { - WriteAsOperand(o, this, true, 0); -} - -void BasicBlock::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const { - SlotTracker SlotTable(getParent()); - AssemblyWriter W(o, SlotTable, - getParent() ? getParent()->getParent() : 0, AAW); - W.write(this); -} - -void Instruction::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const { - const Function *F = getParent() ? getParent()->getParent() : 0; - SlotTracker SlotTable(F); - AssemblyWriter W(o, SlotTable, F ? F->getParent() : 0, AAW); - +void Module::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const { + SlotTracker SlotTable(this); + AssemblyWriter W(OS, SlotTable, this, AAW); W.write(this); } -void Constant::print(std::ostream &o) const { - if (this == 0) { o << " constant value\n"; return; } - - o << ' ' << getType()->getDescription() << ' '; - - std::map TypeTable; - WriteConstantInt(o, this, TypeTable, 0); +void Type::print(std::ostream &o) const { + raw_os_ostream OS(o); + print(OS); } -void Type::print(std::ostream &o) const { +void Type::print(raw_ostream &o) const { if (this == 0) o << ""; else o << getDescription(); } -void Argument::print(std::ostream &o) const { - WriteAsOperand(o, this, true, getParent() ? getParent()->getParent() : 0); +void Value::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const { + if (this == 0) { + OS << "printing a value\n"; + return; + } + + if (const Instruction *I = dyn_cast(this)) { + const Function *F = I->getParent() ? I->getParent()->getParent() : 0; + SlotTracker SlotTable(F); + AssemblyWriter W(OS, SlotTable, F ? F->getParent() : 0, AAW); + W.write(I); + } else if (const BasicBlock *BB = dyn_cast(this)) { + SlotTracker SlotTable(BB->getParent()); + AssemblyWriter W(OS, SlotTable, + BB->getParent() ? BB->getParent()->getParent() : 0, AAW); + W.write(BB); + } else if (const GlobalValue *GV = dyn_cast(this)) { + SlotTracker SlotTable(GV->getParent()); + AssemblyWriter W(OS, SlotTable, GV->getParent(), 0); + W.write(GV); + } else if (const Constant *C = dyn_cast(this)) { + OS << ' ' << C->getType()->getDescription() << ' '; + std::map TypeTable; + WriteConstantInt(OS, C, TypeTable, 0); + } else if (const Argument *A = dyn_cast(this)) { + WriteAsOperand(OS, this, true, + A->getParent() ? A->getParent()->getParent() : 0); + } else if (isa(this)) { + WriteAsOperand(OS, this, true, 0); + } else { + assert(0 && "Unknown value to print out!"); + } +} + +void Value::print(std::ostream &O, AssemblyAnnotationWriter *AAW) const { + raw_os_ostream OS(O); + print(OS, AAW); } // Value::dump - allow easy printing of Values from the debugger. // Located here because so much of the needed functionality is here. -void Value::dump() const { print(*cerr.stream()); cerr << '\n'; } +void Value::dump() const { print(errs()); errs() << '\n'; } // Type::dump - allow easy printing of Values from the debugger. // Located here because so much of the needed functionality is here. -void Type::dump() const { print(*cerr.stream()); cerr << '\n'; } +void Type::dump() const { print(errs()); errs() << '\n'; } + +// Module::dump() - Allow printing from debugger +void Module::dump() const { print(errs(), 0); } + diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index 94f5d81e0fc..b95f6e3fa86 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -88,11 +88,6 @@ Module::~Module() { delete TypeSymTab; } -// Module::dump() - Allow printing from debugger -void Module::dump() const { - print(*cerr.stream()); -} - /// Target endian information... Module::Endianness Module::getEndianness() const { std::string temp = DataLayout; diff --git a/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp index 17a8e53607b..81498752186 100644 --- a/tools/llvm-prof/llvm-prof.cpp +++ b/tools/llvm-prof/llvm-prof.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/System/Signals.h" #include #include @@ -71,12 +72,12 @@ namespace { std::map &EF) : FuncFreqs(FF), BlockFreqs(BF), EdgeFreqs(EF) {} - virtual void emitFunctionAnnot(const Function *F, std::ostream &OS) { + virtual void emitFunctionAnnot(const Function *F, raw_ostream &OS) { OS << ";;; %" << F->getName() << " called " << FuncFreqs[F] << " times.\n;;;\n"; } virtual void emitBasicBlockStartAnnot(const BasicBlock *BB, - std::ostream &OS) { + raw_ostream &OS) { if (BlockFreqs.empty()) return; if (unsigned Count = BlockFreqs[BB]) OS << "\t;;; Basic block executed " << Count << " times.\n"; @@ -84,7 +85,7 @@ namespace { OS << "\t;;; Never executed!\n"; } - virtual void emitBasicBlockEndAnnot(const BasicBlock *BB, std::ostream &OS){ + virtual void emitBasicBlockEndAnnot(const BasicBlock *BB, raw_ostream &OS) { if (EdgeFreqs.empty()) return; // Figure out how many times each successor executed. @@ -235,7 +236,7 @@ int main(int argc, char **argv) { if (FunctionsToPrint.empty() || PrintAllCode) M->print(std::cout, &PA); else - // Print just a subset of the functions... + // Print just a subset of the functions. for (std::set::iterator I = FunctionsToPrint.begin(), E = FunctionsToPrint.end(); I != E; ++I) (*I)->print(std::cout, &PA);