- for (const_iterator BB = begin(); BB != end(); ++BB) {
- BasicBlock *LBB = BB->getBasicBlock();
- OS << "\n" << LBB->getName() << " ("
- << (const void*)BB->getBasicBlock() << "):\n";
- for (MachineBasicBlock::const_iterator I = BB->begin(); I != BB->end();++I){
- OS << "\t";
- (*I)->print(OS, Target);
+ const MRegisterInfo *MRI = getTarget().getRegisterInfo();
+
+ if (livein_begin() != livein_end()) {
+ OS << "Live Ins:";
+ for (livein_iterator I = livein_begin(), E = livein_end(); I != E; ++I) {
+ if (MRI)
+ OS << " " << MRI->getName(I->first);
+ else
+ OS << " Reg #" << I->first;
+ }
+ OS << "\n";
+ }
+ if (liveout_begin() != liveout_end()) {
+ OS << "Live Outs:";
+ for (liveout_iterator I = liveout_begin(), E = liveout_end(); I != E; ++I)
+ if (MRI)
+ OS << " " << MRI->getName(*I);
+ else
+ OS << " Reg #" << *I;
+ OS << "\n";
+ }
+
+ for (const_iterator BB = begin(); BB != end(); ++BB)
+ BB->print(OS);
+
+ OS << "\n# End machine code for " << Fn->getName () << "().\n\n";
+}
+
+/// CFGOnly flag - This is used to control whether or not the CFG graph printer
+/// prints out the contents of basic blocks or not. This is acceptable because
+/// this code is only really used for debugging purposes.
+///
+static bool CFGOnly = false;
+
+namespace llvm {
+ template<>
+ struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
+ static std::string getGraphName(const MachineFunction *F) {
+ return "CFG for '" + F->getFunction()->getName() + "' function";
+ }
+
+ static std::string getNodeLabel(const MachineBasicBlock *Node,
+ const MachineFunction *Graph) {
+ if (CFGOnly && Node->getBasicBlock() &&
+ !Node->getBasicBlock()->getName().empty())
+ return Node->getBasicBlock()->getName() + ":";
+
+ std::ostringstream Out;
+ if (CFGOnly) {
+ Out << Node->getNumber() << ':';
+ return Out.str();
+ }
+
+ Node->print(Out);
+
+ std::string OutStr = Out.str();
+ if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
+
+ // Process string output to make it nicer...
+ for (unsigned i = 0; i != OutStr.length(); ++i)
+ if (OutStr[i] == '\n') { // Left justify
+ OutStr[i] = '\\';
+ OutStr.insert(OutStr.begin()+i+1, 'l');
+ }
+ return OutStr;