package vaporize.library; import cs132.vapor.ast.*; import st.*; import misc.*; import java.util.*; public class CFGSimp extends VInstr.VisitorPR { private VaporProgram vp; private Kettle kettle; private ArrayList cfgs; private CFGNode curr; public CFGSimp(VaporProgram vp, ArrayList vapor) { this.vp = vp; this.kettle = new Kettle(vapor); this.cfgs = new ArrayList(); this.curr = null; for (VFunction f : this.vp.functions) { ControlFlowGraph cfg = new ControlFlowGraph(); curr = new CFGNode(f.body[0]); cfg.setStart(curr); MinimalLogger.info(String.format("CFGSimp is collecting nodes for %s", this.kettle.parseFuncName(f))); for (VCodeLabel s : f.labels) { MinimalLogger.info(String.format("Label %d \"%s\"", s.sourcePos.line, this.kettle.get(s).trim())); cfg.addNode(new CFGNode(s)); } for (VInstr s : f.body) { MinimalLogger.info(String.format(" Body %d \"%s\"", s.sourcePos.line, this.kettle.get(s).trim())); cfg.addNode(new CFGNode(s)); } // 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.cfgs.add(cfg); } } public ArrayList getCFGs() { return this.cfgs; } public String visit(ControlFlowGraph cfg, VMemRead n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VMemWrite n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VAssign n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VBranch n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle .findLabelIndex(n.target.toString())))); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VGoto n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle .findLabelIndex(n.target.toString())))); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VCall n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VBuiltIn n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } public String visit(ControlFlowGraph cfg, VReturn n) throws RuntimeException { MinimalLogger.info(String.format("->%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); /////////////////////////////////////////////////////////////// CFGNode curr = cfg.getNode(n); cfg.addEdge(this.curr, cfg.getNode(n)); this.curr = curr; /////////////////////////////////////////////////////////////// MinimalLogger.info(String.format("<-%s (\"%s\":%s)", n.getClass().getSimpleName(), this.kettle.get(n).trim(), n.sourcePos.toString())); return null; } }