diff options
Diffstat (limited to 'vaporize/library')
-rw-r--r-- | vaporize/library/CFGNode.java | 9 | ||||
-rw-r--r-- | vaporize/library/CFGSimp.java | 28 | ||||
-rw-r--r-- | vaporize/library/ControlFlowGraph.java | 24 |
3 files changed, 38 insertions, 23 deletions
diff --git a/vaporize/library/CFGNode.java b/vaporize/library/CFGNode.java index 0afce60..b79ee6b 100644 --- a/vaporize/library/CFGNode.java +++ b/vaporize/library/CFGNode.java @@ -33,9 +33,12 @@ class CFGNode { */ // FIXME public boolean equals(Object other) { - return (other instanceof Node && - (((Node) other).sourcePos == - this.instruction.sourcePos)) || + return (other instanceof CFGNode && + (((CFGNode) other).instruction == + this.instruction)) || + (other instanceof Node && + (((Node) other).sourcePos == + this.instruction.sourcePos)) || (other instanceof Integer && (((Integer) other) .equals(this.instruction.sourcePos.line))); diff --git a/vaporize/library/CFGSimp.java b/vaporize/library/CFGSimp.java index f4d63cf..0cefb5a 100644 --- a/vaporize/library/CFGSimp.java +++ b/vaporize/library/CFGSimp.java @@ -9,6 +9,8 @@ import java.util.*; public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeException> { + private boolean use_graphviz = true; // if true, generates svg files of the edges in each function + private VaporProgram vp; private Kettle kettle; private ArrayList<ControlFlowGraph> cfgs; @@ -44,13 +46,13 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE } - // edges MinimalLogger.info(String.format("CFGSimp is collecting edges for %s", this.kettle.parseFuncName(f))); for (VInstr s : f.body) s.accept(cfg, this); - this.createDotGraph(this.kettle.parseFuncName(f)); + if (this.use_graphviz) + this.createDotGraph(this.kettle.parseFuncName(f)); this.cfgs.add(cfg); } @@ -71,6 +73,8 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE String type = "svg"; gv.decreaseDpi(); gv.decreaseDpi(); + gv.decreaseDpi(); + gv.decreaseDpi(); File out = new File(file_name+"."+ type); gv.writeGraphToFile( gv.getGraph( gv.getDotSource(), type ), out ); } @@ -82,7 +86,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -99,7 +103,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -116,7 +120,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -133,7 +137,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.dot_format += cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle .findLabelIndex(n.target.toString())))); @@ -152,9 +156,9 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// - CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle - .findLabelIndex(n.target.toString())))); + CFGNode curr = cfg.getNode(new Integer(this.kettle + .findLabelIndex(n.target.toString()))); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// @@ -172,7 +176,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -189,7 +193,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -206,7 +210,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); - this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); + this.dot_format += cfg.addEdge(this.curr, curr); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", diff --git a/vaporize/library/ControlFlowGraph.java b/vaporize/library/ControlFlowGraph.java index 364cec1..b4c995c 100644 --- a/vaporize/library/ControlFlowGraph.java +++ b/vaporize/library/ControlFlowGraph.java @@ -38,16 +38,24 @@ public class ControlFlowGraph { } protected String addEdge(CFGNode source, CFGNode dest) { - String ret = String.format("%d -> %d", - source.getInstruction().sourcePos.line, - dest.getInstruction().sourcePos.line); - MinimalLogger.info(String.format("Edge %s", - ret)); + /** + * Iff the CFGNodes are different, construct an edge between them. + * Returns a string capable of being manipulated by graphviz. + */ + String ret = ""; + if (!source.equals(dest)) { + ret = String.format("%d -> %d", + source.getInstruction().sourcePos.line, + dest.getInstruction().sourcePos.line); + MinimalLogger.info(String.format("Edge %s", + ret)); - source.addDest(dest); - dest.addSource(source); + source.addDest(dest); + dest.addSource(source); + ret += ";"; + } - return ret +";"; + return ret; } protected void setStart(CFGNode start) { |