Loading src/main/java/tfm/Main.java +10 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,9 @@ package tfm; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.visitor.VoidVisitor; import edg.graphlib.Vertex; import guru.nidi.graphviz.engine.Format; import guru.nidi.graphviz.engine.Graphviz; import tfm.graphs.CFGGraph; import tfm.graphs.Graph; import tfm.graphs.PDGGraph; Loading @@ -14,6 +17,7 @@ import tfm.visitors.PDGVisitor; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import static guru.nidi.graphviz.model.Factory.graph; import static guru.nidi.graphviz.model.Factory.node; Loading @@ -22,7 +26,7 @@ public class Main { private static long t0; public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws IOException { File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example1.java"); CompilationUnit compilationUnit = JavaParser.parse(file); Loading @@ -43,8 +47,13 @@ public class Main { "* GRAPHVIZ *\n" + "****************************" ); // Graphviz.fromString(graph.toGraphvizRepresentation()).render(Format.PNG).toFile(new File("graph")); Logger.log(graph.toGraphvizRepresentation()); Logger.log(); // for (Vertex<?, ?> vertex : graph.getVerticies()) { // PDGNode node = (PDGNode) vertex; // Logger.format("node %s. Level %s\n", node.getId(), node.getLevel()); // } Logger.format("Done in %.2f ms", (tt - t0) / 10e6); } Loading src/main/java/tfm/graphs/Graph.java +1 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import tfm.arcs.data.ArcData; import tfm.nodes.Node; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** Loading src/main/java/tfm/graphs/PDGGraph.java +44 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import tfm.variables.actions.VariableDefinition; import javax.swing.plaf.nimbus.State; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class PDGGraph extends Graph<PDGNode> { Loading Loading @@ -52,6 +53,21 @@ public abstract class PDGGraph extends Graph<PDGNode> { this.addArc(dataDataDependencyArc); } public List<PDGNode> getNodesAtLevel(int level) { return getVerticies().stream() .map(vertex -> (PDGNode) vertex) .filter(node -> node.getLevel() == level) .collect(Collectors.toList()); } public int getLevels() { return getVerticies().stream() .map(vertex -> (PDGNode) vertex) .max(Comparator.comparingInt(PDGNode::getLevel)) .map(PDGNode::getLevel) .get() + 1; } @Override public String toGraphvizRepresentation() { String lineSep = System.lineSeparator(); Loading @@ -60,6 +76,33 @@ public abstract class PDGGraph extends Graph<PDGNode> { .map(vertex -> ((Node) vertex).toGraphvizRepresentation()) .collect(Collectors.joining(lineSep)); StringBuilder rankedNodes = new StringBuilder(); // No level 0 is needed (only one node) for (int i = 0; i < getLevels(); i++) { List<PDGNode> levelNodes = getNodesAtLevel(i); if (levelNodes.size() <= 1) { continue; } // rank same rankedNodes.append("{ rank = same; ") .append(levelNodes.stream() .map(node -> String.valueOf(node.getId())) .collect(Collectors.joining(";"))) .append(" }") .append(lineSep); // invisible arrows for ordering rankedNodes.append(levelNodes.stream() .sorted(Comparator.comparingInt(PDGNode::getId)) .map(node -> String.valueOf(node.getId())) .collect(Collectors.joining(" -> "))) .append("[style = invis];") .append(lineSep); } String arrows = getArrows().stream() .sorted(Comparator.comparingInt(arrow -> ((Node) arrow.getFrom()).getId())) Loading @@ -70,6 +113,7 @@ public abstract class PDGGraph extends Graph<PDGNode> { return "digraph g{" + lineSep + "splines=true;" + lineSep + nodesDeclaration + lineSep + rankedNodes.toString() + arrows + lineSep + "}"; } Loading src/main/java/tfm/nodes/PDGNode.java +23 −0 Original line number Diff line number Diff line Loading @@ -2,10 +2,13 @@ package tfm.nodes; import com.github.javaparser.ast.stmt.Statement; import tfm.arcs.Arc; import tfm.arcs.pdg.ControlDependencyArc; import tfm.graphs.Graph; import tfm.graphs.PDGGraph; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class PDGNode extends Node { Loading Loading @@ -52,4 +55,24 @@ public class PDGNode extends Node { controlTo ); } public List<ControlDependencyArc> getControlDependencies() { return getIncomingArrows().stream() .filter(arrow -> ((Arc) arrow).isControlDependencyArrow()) .map(arc -> (ControlDependencyArc) arc) .collect(Collectors.toList()); } public int getLevel() { return getLevel(this); } private int getLevel(PDGNode node) { List<ControlDependencyArc> dependencies = node.getControlDependencies(); if (dependencies.isEmpty()) return 0; return 1 + getLevel((PDGNode) dependencies.get(0).getFrom()); } } src/main/java/tfm/programs/Example1.java +12 −5 Original line number Diff line number Diff line Loading @@ -8,16 +8,23 @@ public class Example1 { int x = 1; int y = 2; if (x < y) { // if (x < y) { while (x < y) { // y = x; while(y < x) { y += x; x = y; } x++; } y = x + 1; } else { x = 4; y *= x; } // } else { // x = 4; // y *= x; // } int e = (Integer) x; Loading Loading
src/main/java/tfm/Main.java +10 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,9 @@ package tfm; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.visitor.VoidVisitor; import edg.graphlib.Vertex; import guru.nidi.graphviz.engine.Format; import guru.nidi.graphviz.engine.Graphviz; import tfm.graphs.CFGGraph; import tfm.graphs.Graph; import tfm.graphs.PDGGraph; Loading @@ -14,6 +17,7 @@ import tfm.visitors.PDGVisitor; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import static guru.nidi.graphviz.model.Factory.graph; import static guru.nidi.graphviz.model.Factory.node; Loading @@ -22,7 +26,7 @@ public class Main { private static long t0; public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws IOException { File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example1.java"); CompilationUnit compilationUnit = JavaParser.parse(file); Loading @@ -43,8 +47,13 @@ public class Main { "* GRAPHVIZ *\n" + "****************************" ); // Graphviz.fromString(graph.toGraphvizRepresentation()).render(Format.PNG).toFile(new File("graph")); Logger.log(graph.toGraphvizRepresentation()); Logger.log(); // for (Vertex<?, ?> vertex : graph.getVerticies()) { // PDGNode node = (PDGNode) vertex; // Logger.format("node %s. Level %s\n", node.getId(), node.getLevel()); // } Logger.format("Done in %.2f ms", (tt - t0) / 10e6); } Loading
src/main/java/tfm/graphs/Graph.java +1 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import tfm.arcs.data.ArcData; import tfm.nodes.Node; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** Loading
src/main/java/tfm/graphs/PDGGraph.java +44 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import tfm.variables.actions.VariableDefinition; import javax.swing.plaf.nimbus.State; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class PDGGraph extends Graph<PDGNode> { Loading Loading @@ -52,6 +53,21 @@ public abstract class PDGGraph extends Graph<PDGNode> { this.addArc(dataDataDependencyArc); } public List<PDGNode> getNodesAtLevel(int level) { return getVerticies().stream() .map(vertex -> (PDGNode) vertex) .filter(node -> node.getLevel() == level) .collect(Collectors.toList()); } public int getLevels() { return getVerticies().stream() .map(vertex -> (PDGNode) vertex) .max(Comparator.comparingInt(PDGNode::getLevel)) .map(PDGNode::getLevel) .get() + 1; } @Override public String toGraphvizRepresentation() { String lineSep = System.lineSeparator(); Loading @@ -60,6 +76,33 @@ public abstract class PDGGraph extends Graph<PDGNode> { .map(vertex -> ((Node) vertex).toGraphvizRepresentation()) .collect(Collectors.joining(lineSep)); StringBuilder rankedNodes = new StringBuilder(); // No level 0 is needed (only one node) for (int i = 0; i < getLevels(); i++) { List<PDGNode> levelNodes = getNodesAtLevel(i); if (levelNodes.size() <= 1) { continue; } // rank same rankedNodes.append("{ rank = same; ") .append(levelNodes.stream() .map(node -> String.valueOf(node.getId())) .collect(Collectors.joining(";"))) .append(" }") .append(lineSep); // invisible arrows for ordering rankedNodes.append(levelNodes.stream() .sorted(Comparator.comparingInt(PDGNode::getId)) .map(node -> String.valueOf(node.getId())) .collect(Collectors.joining(" -> "))) .append("[style = invis];") .append(lineSep); } String arrows = getArrows().stream() .sorted(Comparator.comparingInt(arrow -> ((Node) arrow.getFrom()).getId())) Loading @@ -70,6 +113,7 @@ public abstract class PDGGraph extends Graph<PDGNode> { return "digraph g{" + lineSep + "splines=true;" + lineSep + nodesDeclaration + lineSep + rankedNodes.toString() + arrows + lineSep + "}"; } Loading
src/main/java/tfm/nodes/PDGNode.java +23 −0 Original line number Diff line number Diff line Loading @@ -2,10 +2,13 @@ package tfm.nodes; import com.github.javaparser.ast.stmt.Statement; import tfm.arcs.Arc; import tfm.arcs.pdg.ControlDependencyArc; import tfm.graphs.Graph; import tfm.graphs.PDGGraph; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class PDGNode extends Node { Loading Loading @@ -52,4 +55,24 @@ public class PDGNode extends Node { controlTo ); } public List<ControlDependencyArc> getControlDependencies() { return getIncomingArrows().stream() .filter(arrow -> ((Arc) arrow).isControlDependencyArrow()) .map(arc -> (ControlDependencyArc) arc) .collect(Collectors.toList()); } public int getLevel() { return getLevel(this); } private int getLevel(PDGNode node) { List<ControlDependencyArc> dependencies = node.getControlDependencies(); if (dependencies.isEmpty()) return 0; return 1 + getLevel((PDGNode) dependencies.get(0).getFrom()); } }
src/main/java/tfm/programs/Example1.java +12 −5 Original line number Diff line number Diff line Loading @@ -8,16 +8,23 @@ public class Example1 { int x = 1; int y = 2; if (x < y) { // if (x < y) { while (x < y) { // y = x; while(y < x) { y += x; x = y; } x++; } y = x + 1; } else { x = 4; y *= x; } // } else { // x = 4; // y *= x; // } int e = (Integer) x; Loading