ScheduleDAG: colorize the DOT graph and improve formatting.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173431 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick
2013-01-25 07:45:25 +00:00
parent a5a73ad159
commit c6ada8e5f3
7 changed files with 40 additions and 3 deletions

View File

@@ -948,7 +948,8 @@ public:
// //
// Debugging support // Debugging support
// //
void print(raw_ostream &OS, const TargetMachine *TM = 0) const; void print(raw_ostream &OS, const TargetMachine *TM = 0,
bool SkipOpers = false) const;
void dump() const; void dump() const;
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//

View File

@@ -79,6 +79,11 @@ public:
return false; return false;
} }
template<typename GraphType>
static std::string getNodeDescription(const void *, const GraphType &) {
return "";
}
/// If you want to specify custom node attributes, this is the place to do so /// If you want to specify custom node attributes, this is the place to do so
/// ///
template<typename GraphType> template<typename GraphType>

View File

@@ -34,6 +34,10 @@ namespace llvm {
namespace DOT { // Private functions... namespace DOT { // Private functions...
std::string EscapeString(const std::string &Label); std::string EscapeString(const std::string &Label);
/// \brief Get a color string for this node number. Simply round-robin selects
/// from a reasonable number of colors.
StringRef getColorString(unsigned NodeNumber);
} }
namespace GraphProgram { namespace GraphProgram {
@@ -173,6 +177,10 @@ public:
// If we should include the address of the node in the label, do so now. // If we should include the address of the node in the label, do so now.
if (DTraits.hasNodeAddressLabel(Node, G)) if (DTraits.hasNodeAddressLabel(Node, G))
O << "|" << static_cast<const void*>(Node); O << "|" << static_cast<const void*>(Node);
std::string NodeDesc = DTraits.getNodeDescription(Node, G);
if (!NodeDesc.empty())
O << "|" << DOT::EscapeString(NodeDesc);
} }
std::string edgeSourceLabels; std::string edgeSourceLabels;
@@ -193,6 +201,10 @@ public:
// If we should include the address of the node in the label, do so now. // If we should include the address of the node in the label, do so now.
if (DTraits.hasNodeAddressLabel(Node, G)) if (DTraits.hasNodeAddressLabel(Node, G))
O << "|" << static_cast<const void*>(Node); O << "|" << static_cast<const void*>(Node);
std::string NodeDesc = DTraits.getNodeDescription(Node, G);
if (!NodeDesc.empty())
O << "|" << DOT::EscapeString(NodeDesc);
} }
if (DTraits.hasEdgeDestLabels()) { if (DTraits.hasEdgeDestLabels()) {

View File

@@ -1428,7 +1428,8 @@ static void printDebugLoc(DebugLoc DL, const MachineFunction *MF,
} }
} }
void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const { void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM,
bool SkipOpers) const {
// We can be a bit tidier if we know the TargetMachine and/or MachineFunction. // We can be a bit tidier if we know the TargetMachine and/or MachineFunction.
const MachineFunction *MF = 0; const MachineFunction *MF = 0;
const MachineRegisterInfo *MRI = 0; const MachineRegisterInfo *MRI = 0;
@@ -1465,6 +1466,9 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
else else
OS << "UNKNOWN"; OS << "UNKNOWN";
if (SkipOpers)
return;
// Print the rest of the operands. // Print the rest of the operands.
bool OmittedAnyCallClobbers = false; bool OmittedAnyCallClobbers = false;
bool FirstOp = true; bool FirstOp = true;

View File

@@ -994,7 +994,7 @@ std::string ScheduleDAGInstrs::getGraphNodeLabel(const SUnit *SU) const {
else if (SU == &ExitSU) else if (SU == &ExitSU)
oss << "<exit>"; oss << "<exit>";
else else
SU->getInstr()->print(oss); SU->getInstr()->print(oss, &TM, /*SkipOpers=*/true);
return oss.str(); return oss.str();
} }

View File

@@ -41,6 +41,10 @@ namespace llvm {
return true; return true;
} }
static bool isNodeHidden(const SUnit *Node) {
return (Node->NumPreds > 10 || Node->NumSuccs > 10);
}
static bool hasNodeAddressLabel(const SUnit *Node, static bool hasNodeAddressLabel(const SUnit *Node,
const ScheduleDAG *Graph) { const ScheduleDAG *Graph) {
return true; return true;

View File

@@ -53,6 +53,17 @@ std::string llvm::DOT::EscapeString(const std::string &Label) {
return Str; return Str;
} }
/// \brief Get a color string for this node number. Simply round-robin selects
/// from a reasonable number of colors.
StringRef llvm::DOT::getColorString(unsigned ColorNumber) {
static const int NumColors = 20;
static const char* Colors[NumColors] = {
"aaaaaa", "aa0000", "00aa00", "aa5500", "0055ff", "aa00aa", "00aaaa",
"555555", "ff5555", "55ff55", "ffff55", "5555ff", "ff55ff", "55ffff",
"ffaaaa", "aaffaa", "ffffaa", "aaaaff", "ffaaff", "aaffff"};
return Colors[ColorNumber % NumColors];
}
// Execute the graph viewer. Return true if successful. // Execute the graph viewer. Return true if successful.
static bool LLVM_ATTRIBUTE_UNUSED static bool LLVM_ATTRIBUTE_UNUSED
ExecGraphViewer(const sys::Path &ExecPath, std::vector<const char*> &args, ExecGraphViewer(const sys::Path &ExecPath, std::vector<const char*> &args,