sp-04/src/ch/usi/inf/sp/dom/DominatorTreeRenderer.java

60 lines
2.4 KiB
Java

package ch.usi.inf.sp.dom;
import ch.usi.inf.sp.cfg.BasicBlock;
import ch.usi.inf.sp.cfg.ControlFlowEdge;
import ch.usi.inf.sp.cfg.ControlFlowGraph;
public class DominatorTreeRenderer {
public static String renderDominatorTree(final String label, final DominatorTree tree) {
final StringBuffer sb = new StringBuffer();
sb.append("digraph dominatorTree {\n");
sb.append(" label=\"" + label + "\"\n");
for (final DominatorTreeNode node : tree.getNodes()) {
if (node == tree.getRoot()) {
sb.append(" " + node.toString() + " [style=filled]\n");
} else {
sb.append(" " + node.toString() + "\n");
}
}
for (final DominanceEdge edge : tree.getEdges()) {
sb.append(" " + edge.getFrom().toString() + " -> " + edge.getTo().toString()+"\n");
}
sb.append("}\n");
return sb.toString();
}
public static String renderCombined(final String label, final ControlFlowGraph cfg, final DominatorTree dt) {
final StringBuffer sb = new StringBuffer();
sb.append("digraph combined {\n");
sb.append(" label=\"" + label + "\"\n");
// render basic blocks
for (final BasicBlock block : cfg.getNodes()) {
if (block == cfg.getEntry()) {
sb.append(" " + block.getId() + " [shape=record,style=filled,label=\""+block.getId()+"|entry\"]\n");
} else if (block == cfg.getExit()) {
sb.append(" " + block.getId() + " [shape=record,label=\""+block.getId()+"|exit\"]\n");
} else {
sb.append(" " + block.getId() + " [shape=record,label=\""+block.getId()+"|{");
// use \l to tell dot to left-align each line
sb.append(String.join("\\l|", block.getInstructions()));
sb.append("\\l}\"]\n");
}
}
// render control flow edges (solid)
for (final ControlFlowEdge edge : cfg.getEdges()) {
sb.append(" " + edge.getFrom().getId() + " -> " + edge.getTo().getId());
sb.append(" [label=\"" + edge.getLabel() + "\"]\n");
}
// render dominance edges (dotted)
for (final DominanceEdge edge : dt.getEdges()) {
sb.append(" " + edge.getFrom().getBlock().getId() + " -> " + edge.getTo().getBlock().getId()+" [style=dotted]\n");
}
sb.append("}\n");
return sb.toString();
}
}