60 lines
2.4 KiB
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();
|
|
}
|
|
|
|
}
|