X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FFlowGraph.java;h=feed5777c3278b1307dc93172ba33fcfb8665852;hp=2ab6dad9ce625cac5d96cda64b5d4f1f989c8b6a;hb=2dcc891b7dfc2a791c10b820da51755813adefd7;hpb=9dfdca00acf795117136425841493a1b0f036f10 diff --git a/Robust/src/Analysis/SSJava/FlowGraph.java b/Robust/src/Analysis/SSJava/FlowGraph.java index 2ab6dad9..feed5777 100644 --- a/Robust/src/Analysis/SSJava/FlowGraph.java +++ b/Robust/src/Analysis/SSJava/FlowGraph.java @@ -13,7 +13,9 @@ import IR.ClassDescriptor; import IR.Descriptor; import IR.FieldDescriptor; import IR.MethodDescriptor; +import IR.NameDescriptor; import IR.VarDescriptor; +import IR.Tree.MethodInvokeNode; public class FlowGraph { @@ -37,6 +39,8 @@ public class FlowGraph { // DS for the lattice generation Map mapIdxToFlowNode; + Map mapMethodInvokeNodeToFlowReturnNode; + public static int interseed = 0; boolean debug = true; @@ -52,6 +56,7 @@ public class FlowGraph { this.mapIdxToFlowNode = new HashMap(); this.mapFlowNodeToOutEdgeSet = new HashMap>(); this.mapFlowNodeToInEdgeSet = new HashMap>(); + this.mapMethodInvokeNodeToFlowReturnNode = new HashMap(); if (!md.isStatic()) { // create a node for 'this' varialbe @@ -109,7 +114,26 @@ public class FlowGraph { mapDescTupleToInferNode.put(tuple, newNode); // nodeSet.add(newNode); - System.out.println("create new intermediate node= " + newNode); + System.out.println("create new intermediate node= " + newNode); + + return newNode; + } + + public FlowReturnNode getFlowReturnNode(MethodInvokeNode min) { + return mapMethodInvokeNodeToFlowReturnNode.get(min); + } + + public FlowReturnNode createReturnNode(MethodInvokeNode min) { + NTuple tuple = new NTuple(); + NameDescriptor n = new NameDescriptor("RETURNLOC" + (LocationInference.locSeed++)); + tuple.add(n); + + FlowReturnNode newNode = new FlowReturnNode(tuple, min); + mapDescTupleToInferNode.put(tuple, newNode); + mapMethodInvokeNodeToFlowReturnNode.put(min, newNode); + // nodeSet.add(newNode); + + System.out.println("create new set node= " + newNode); return newNode; } @@ -235,7 +259,7 @@ public class FlowGraph { return; } - System.out.println("create an edge from " + fromNode + " to " + toNode); + // System.out.println("create an edge from " + fromNode + " to " + toNode); int fromTupleSize = fromDescTuple.size(); NTuple curFromTuple = new NTuple(); @@ -534,50 +558,28 @@ public class FlowGraph { if (node.equals(getFlowNode(flowEdge.getEndTuple()))) { FlowNode incomingNode = getFlowNode(flowEdge.getInitTuple()); - if (!visited.contains(incomingNode)) { - visited.add(incomingNode); - getIncomingFlowNodeSet(incomingNode, visited); - } - } - } - } - - } - - public Set> getIncomingFlowTupleSet(FlowNode fn) { - - NTuple dstTuple = fn.getDescTuple(); - - Set> set = new HashSet>(); - - ClassDescriptor cd = null; - - for (Iterator iterator = getNodeSet().iterator(); iterator.hasNext();) { - FlowNode node = (FlowNode) iterator.next(); - - Set edgeSet = getOutEdgeSet(node); - for (Iterator iterator2 = edgeSet.iterator(); iterator2.hasNext();) { - FlowEdge flowEdge = (FlowEdge) iterator2.next(); - if (dstTuple.equals(flowEdge.getEndTuple())) { - NTuple initTuple = flowEdge.getInitTuple(); - NTuple locTuple = new NTuple(); - for (int i = 0; i < initTuple.size(); i++) { - Descriptor d = initTuple.get(i); - Location loc; - if (i == 0) { - loc = new Location(md, d.getSymbol()); - cd = ((VarDescriptor) d).getType().getClassDesc(); - } else { - loc = new Location(cd, d.getSymbol()); - cd = ((FieldDescriptor) d).getType().getClassDesc(); + if (incomingNode instanceof FlowReturnNode) { + FlowReturnNode rnode = (FlowReturnNode) incomingNode; + Set> nodeTupleSet = rnode.getTupleSet(); + for (Iterator iterator3 = nodeTupleSet.iterator(); iterator3.hasNext();) { + NTuple nodeTuple = (NTuple) iterator3.next(); + FlowNode fn = getFlowNode(nodeTuple); + if (!visited.contains(fn)) { + visited.add(fn); + getIncomingFlowNodeSet(fn, visited); + } + } + } else { + if (!visited.contains(incomingNode)) { + visited.add(incomingNode); + getIncomingFlowNodeSet(incomingNode, visited); } - locTuple.add(loc); } - set.add(locTuple); + } } } - return set; + } public boolean isParameter(NTuple tuple) { @@ -704,7 +706,13 @@ public class FlowGraph { } private void drawNode(FlowNode node, BufferedWriter bw) throws IOException { - bw.write(node.getID() + " [label=\"" + node.getPrettyID() + "\"]" + ";\n"); + if (node instanceof FlowReturnNode) { + FlowReturnNode rnode = (FlowReturnNode) node; + bw.write(node.getID() + " [label=\"" + node.getPrettyID() + "\"]" + ";\n"); + } else { + bw.write(node.getID() + " [label=\"" + node.getPrettyID() + "\"]" + ";\n"); + } + } public void writeGraph() throws java.io.IOException {