int temp2 = x; // x = 1 or 3\r
return temp2;\r
}\r
+ \r
+ public static int method3(int x) {\r
+ int sum = 0;\r
+ for (int i = 0; i < x; i++) {\r
+ sum += i;\r
+ }\r
+ return sum;\r
+ }\r
}\r
public class ClassHierarchyPerformance {\r
\r
public static void main(String[] args) {\r
+ args = new String[]{"bin/demo/testdata"};\r
+ \r
long start = System.currentTimeMillis();\r
\r
JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
package demo.soba;\r
\r
+import demo.util.MemoryInfo;\r
import soba.core.ClassInfo;\r
import soba.core.JavaProgram;\r
import soba.core.MethodInfo;\r
public class ControlDependencePerformance {\r
\r
public static void main(String[] args) {\r
+ args = new String[]{"bin/demo/testdata"};\r
+ \r
+ long start = System.currentTimeMillis();\r
+ \r
JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
for (ClassInfo c: program.getClasses()) {\r
for (MethodInfo m: c.getMethods()) {\r
cd.forEachEdge(new IntPairProc() {\r
@Override\r
public boolean execute(int elem1, int elem2) {\r
- System.out.println("[Control] " + elem1 + " -> " + elem2);\r
+// System.out.println(elem1 + " -> " + elem2);\r
return true;\r
}\r
});\r
}\r
}\r
+ \r
+ long end = System.currentTimeMillis();\r
+ \r
+ System.out.println((end - start) + " [ms]");\r
+ System.out.println(MemoryInfo.getMemoryInfo());\r
}\r
\r
}\r
package demo.soba;\r
\r
+import demo.util.MemoryInfo;\r
import soba.core.ClassInfo;\r
import soba.core.JavaProgram;\r
import soba.core.MethodInfo;\r
public class DataDependencePerformance {\r
\r
public static void main(String[] args) {\r
+ args = new String[]{"bin/demo/testdata"};\r
+ \r
+ long start = System.currentTimeMillis();\r
+ \r
JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
for (ClassInfo c: program.getClasses()) {\r
for (MethodInfo m: c.getMethods()) {\r
DataDependence dd = m.getDataDependence();\r
for (DataFlowEdge e: dd.getEdges()) {\r
- System.out.println(e.toString());\r
+// System.out.println(e.toString());\r
}\r
}\r
}\r
+ \r
+ long end = System.currentTimeMillis();\r
+ \r
+ System.out.println((end - start) + " [ms]");\r
+ System.out.println(MemoryInfo.getMemoryInfo());\r
}\r
\r
}\r
package demo.soot;\r
\r
import java.io.File;\r
-import java.util.ArrayList;\r
import java.util.Arrays;\r
+import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.function.Consumer;\r
\r
-import demo.util.MemoryInfo;\r
+import soot.MethodOrMethodContext;\r
import soot.PackManager;\r
import soot.Scene;\r
import soot.SceneTransformer;\r
import soot.Transform;\r
import soot.jimple.toolkits.callgraph.CallGraph;\r
import soot.jimple.toolkits.callgraph.Edge;\r
+import demo.util.DemoUtil;\r
+import demo.util.MemoryInfo;\r
\r
public class ClassHierarchyPerformance {\r
\r
"-cp",\r
"bin" + File.pathSeparator + \r
"bin/testers" + File.pathSeparator + \r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\rt.jar" + File.pathSeparator +\r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\jce.jar",\r
+ DemoUtil.RT_PATH + File.pathSeparator +\r
+ DemoUtil.JCE_PATH,\r
"-whole-program",\r
"-main-class",\r
"testers.CallGraphs",//main-class\r
"testers.A" //\r
});\r
\r
-\r
long start = System.currentTimeMillis();\r
\r
PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() {\r
@Override\r
protected void internalTransform(String phaseName, Map options) {\r
CallGraph cg = Scene.v().getCallGraph();\r
- cg.forEach(new Consumer<Edge>() {\r
- @Override\r
- public void accept(Edge edge) {\r
+ for (Iterator<MethodOrMethodContext> callers = cg.sourceMethods(); callers.hasNext();) {\r
+ MethodOrMethodContext caller = callers.next();\r
+ for (Iterator<Edge> edges = cg.edgesOutOf(caller); edges.hasNext();) {\r
+ Edge edge = edges.next();\r
// System.out.println(edge.getSrc().method().toString() + " -> " + edge.getTgt().method().toString());\r
}\r
- });\r
+ }\r
\r
long end = System.currentTimeMillis();\r
\r
package demo.soot;\r
\r
import java.io.File;\r
-import java.util.ArrayList;\r
import java.util.Arrays;\r
-import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
\r
import soot.Body;\r
import soot.BodyTransformer;\r
-import soot.Local;\r
import soot.PackManager;\r
import soot.PhaseOptions;\r
-import soot.SootMethod;\r
import soot.Transform;\r
-import soot.Unit;\r
-import soot.Value;\r
-import soot.ValueBox;\r
-import soot.toolkits.graph.Block;\r
-import soot.toolkits.graph.BlockGraph;\r
-import soot.toolkits.graph.BlockGraphConverter;\r
-import soot.toolkits.graph.DirectedGraph;\r
-import soot.toolkits.graph.DominatorsFinder;\r
import soot.toolkits.graph.ExceptionalUnitGraph;\r
-import soot.toolkits.graph.MHGDominatorsFinder;\r
-import soot.toolkits.graph.MHGPostDominatorsFinder;\r
import soot.toolkits.graph.UnitGraph;\r
import soot.toolkits.graph.pdg.ConditionalPDGNode;\r
-import soot.toolkits.graph.pdg.EnhancedBlockGraph;\r
import soot.toolkits.graph.pdg.HashMutablePDG;\r
import soot.toolkits.graph.pdg.PDGNode;\r
import soot.toolkits.graph.pdg.ProgramDependenceGraph;\r
-import soot.toolkits.scalar.LiveLocals;\r
-import soot.toolkits.scalar.LocalDefs;\r
-import soot.toolkits.scalar.SimpleLiveLocals;\r
-import soot.toolkits.scalar.SmartLocalDefs;\r
+import demo.util.DemoUtil;\r
+import demo.util.MemoryInfo;\r
\r
public class ControlDependencePerformance {\r
\r
"-cp",\r
"bin" + File.pathSeparator + \r
"bin/demo/testdata" + File.pathSeparator + \r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\rt.jar" + File.pathSeparator +\r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\jce.jar",\r
+ DemoUtil.RT_PATH + File.pathSeparator +\r
+ DemoUtil.JCE_PATH,\r
"-whole-program",\r
"-main-class",\r
"demo.testdata.TestClass",//main-class\r
- "-app",\r
- "demo.testdata.TestClass",\r
- "demo.testdata.TestClass",//argument classes\r
+// "-app",\r
+// "demo.testdata.TestClass",\r
+// "demo.testdata.TestClass",//argument classes\r
"-p",\r
"cg.cha",\r
"apponly:true,verbose:true",\r
- "-keep-line-number"\r
+ "demo.testdata.TestClass"\r
+// "-keep-line-number"\r
});\r
-\r
+ \r
PackManager.v().getPack("jap").add(new Transform("jap.myTransform", new BodyTransformer() {\r
@Override\r
protected void internalTransform(Body body, String phase, Map options) {\r
- SootMethod method = body.getMethod();\r
- if (method.getName().equals("method1")) {\r
- BlockGraph graph = new EnhancedBlockGraph(body);\r
- DominatorsFinder<Block> domFinder = new MHGPostDominatorsFinder<>(graph);\r
- for (Block b2: graph.getBlocks()) {\r
+ try {\r
+ UnitGraph graph = new ExceptionalUnitGraph(body);\r
+ ProgramDependenceGraph pdg = new HashMutablePDG(graph);\r
+ for (PDGNode node1: pdg.getNodes()) {\r
+ // Extracts only control-dependence edges\r
+ if (node1 instanceof ConditionalPDGNode) {\r
+ for (PDGNode node2: pdg.getDependents(node1)) {\r
+// System.out.println(node1.toShortString() + " -> " + node2.toShortString());\r
+ }\r
+ }\r
}\r
-// DominatorsFinder<Block> domFinder = new MHGDominatorsFinder<>(graph);\r
-// DirectedGraph<Block> postDomGraph = domFinder.getGraph();\r
-// for (Iterator<Block> itr = postDomGraph.iterator(); itr.hasNext();) {\r
-// Block b1 = itr.next();\r
-// for (Block b2: postDomGraph.getSuccsOf(b1)) {\r
-// System.out.println(b1.toShortString() + " -> " + b2.toShortString());\r
-// }\r
-// }\r
+ } catch (RuntimeException e) {\r
+ System.err.println(body.getMethod());\r
}\r
}\r
}));\r
PhaseOptions.v().setPhaseOption("jap.npc", "on");\r
\r
args = argsList.toArray(new String[0]);\r
+\r
+ long start = System.currentTimeMillis();\r
soot.Main.main(args);\r
+ long end = System.currentTimeMillis();\r
+ \r
+ System.out.println((end - start) + " [ms]");\r
+ System.out.println(MemoryInfo.getMemoryInfo());\r
}\r
\r
}\r
import java.util.List;\r
import java.util.Map;\r
\r
+import demo.util.DemoUtil;\r
+import demo.util.MemoryInfo;\r
import soot.Body;\r
import soot.BodyTransformer;\r
import soot.Local;\r
import soot.Unit;\r
import soot.Value;\r
import soot.ValueBox;\r
+import soot.toolkits.graph.BriefUnitGraph;\r
import soot.toolkits.graph.ExceptionalUnitGraph;\r
import soot.toolkits.graph.UnitGraph;\r
import soot.toolkits.scalar.LiveLocals;\r
"-cp",\r
"bin" + File.pathSeparator + \r
"bin/demo/testdata" + File.pathSeparator + \r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\rt.jar" + File.pathSeparator +\r
- "C:\\Program Files\\Java\\jre1.8.0_71\\lib\\jce.jar",\r
+ DemoUtil.RT_PATH + File.pathSeparator +\r
+ DemoUtil.JCE_PATH,\r
"-whole-program",\r
"-main-class",\r
"demo.testdata.TestClass",//main-class\r
- "-app",\r
- "demo.testdata.TestClass",\r
- "demo.testdata.TestClass",//argument classes\r
+// "-app",\r
+// "demo.testdata.TestClass",\r
+// "demo.testdata.TestClass",//argument classes\r
"-p",\r
"cg.cha",\r
"apponly:true,verbose:true",\r
+ "demo.testdata.TestClass"\r
// "-keep-line-number"\r
});\r
-\r
+ \r
PackManager.v().getPack("jap").add(new Transform("jap.myTransform", new BodyTransformer() {\r
@Override\r
protected void internalTransform(Body body, String phase, Map options) {\r
- UnitGraph graph = new ExceptionalUnitGraph(body);\r
+// UnitGraph graph = new ExceptionalUnitGraph(body);\r
+ UnitGraph graph = new BriefUnitGraph(body);\r
LiveLocals live = new SimpleLiveLocals(graph);\r
LocalDefs defs = new SmartLocalDefs(graph, live);\r
\r
PhaseOptions.v().setPhaseOption("jap.npc", "on");\r
\r
args = argsList.toArray(new String[0]);\r
+ \r
+ long start = System.currentTimeMillis();\r
soot.Main.main(args);\r
+ long end = System.currentTimeMillis();\r
+ \r
+ System.out.println((end - start) + " [ms]");\r
+ System.out.println(MemoryInfo.getMemoryInfo());\r
}\r
\r
}\r
package demo.util;\r
\r
+import java.io.File;\r
+import java.util.Arrays;\r
+\r
public class DemoUtil {\r
\r
public static final String REGRESSION_EXCLUSIONS = "Java60RegressionExclusions.txt";\r
+ \r
+ public static final String[] SUN_BOOT_CLASS_PATH = System.getProperty("sun.boot.class.path").split(File.pathSeparator);\r
+ \r
+ public static final String RT_PATH = Arrays.stream(SUN_BOOT_CLASS_PATH)\r
+ .filter(path -> path.endsWith("rt.jar"))\r
+ .findFirst().get();\r
+ \r
+ public static final String JCE_PATH = Arrays.stream(SUN_BOOT_CLASS_PATH)\r
+ .filter(path -> path.endsWith("jce.jar"))\r
+ .findFirst().get();\r
}\r
try {\r
long start = System.currentTimeMillis();\r
\r
- String appJar = "bin/testers";\r
-// AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, new File(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
+ String appJar = "bin/demo/testdata";\r
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS));\r
\r
ClassHierarchy cha = ClassHierarchy.make(scope);\r
CallGraph cg = builder.makeCallGraph(options, null);\r
\r
for (int i = 0; i < cg.getMaxNumber(); i++) {\r
- CGNode node = cg.getNode(i);\r
- for (Iterator<CGNode> callees = cg.getSuccNodes(node); callees.hasNext();) {\r
+ CGNode caller = cg.getNode(i);\r
+ for (Iterator<CGNode> callees = cg.getSuccNodes(caller); callees.hasNext();) {\r
CGNode callee = callees.next();\r
-// System.out.println(node.getMethod().toString() + " -> " + callee.getMethod().toString());\r
+// System.out.println(caller.getMethod().toString() + " -> " + callee.getMethod().toString());\r
}\r
}\r
\r
public static void main(String[] args) {\r
try {\r
String appJar = "bin/demo/testdata";\r
-// String appJar = "C:\\Users\\t-hatano\\git\\soba-core\\bin";\r
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS));\r
\r
ClassHierarchy cha = ClassHierarchy.make(scope);\r
package demo.wala;\r
\r
import java.util.Iterator;\r
-import java.util.function.Consumer;\r
\r
import com.ibm.wala.cfg.cdg.ControlDependenceGraph;\r
import com.ibm.wala.classLoader.IClass;\r
import com.ibm.wala.ssa.ISSABasicBlock;\r
import com.ibm.wala.ssa.SSAInstruction;\r
import com.ibm.wala.ssa.SSAOptions;\r
-import com.ibm.wala.types.MethodReference;\r
import com.ibm.wala.util.config.AnalysisScopeReader;\r
import com.ibm.wala.util.debug.Assertions;\r
-import com.ibm.wala.util.graph.NumberedEdgeManager;\r
import com.ibm.wala.util.io.FileProvider;\r
-import com.ibm.wala.util.strings.StringStuff;\r
\r
import demo.util.DemoUtil;\r
\r
try {\r
String appJar = "bin/demo/testdata";\r
\r
-// AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS));\r
\r
ClassHierarchy cha = ClassHierarchy.make(scope);\r
}\r
}\r
}\r
-// \r
-// MethodReference mr = StringStuff.makeMethodReference(methodSig);\r
-//\r
-// IMethod m = cha.resolveMethod(mr);\r
-// if (m == null) {\r
-// System.err.println("could not resolve " + mr);\r
-// throw new RuntimeException();\r
-// }\r
-// AnalysisOptions options = new AnalysisOptions();\r
-// options.getSSAOptions().setPiNodePolicy(SSAOptions.getAllBuiltInPiNodes());\r
-// AnalysisCache cache = new AnalysisCache();\r
-// IR ir = cache.getSSACache().findOrCreateIR(m, Everywhere.EVERYWHERE, options.getSSAOptions() );\r
-//\r
-// if (ir == null) {\r
-// Assertions.UNREACHABLE("Null IR for " + m);\r
-// }\r
-//\r
-// ControlDependenceGraph<SSAInstruction, ISSABasicBlock> cdg = new ControlDependenceGraph<>(ir.getControlFlowGraph());\r
-//\r
-// NumberedEdgeManager<ISSABasicBlock> manager = cdg.getEdgeManager();\r
-// for (Iterator<ISSABasicBlock> itr1 = cdg.iterator(); itr1.hasNext();) {\r
-// ISSABasicBlock b1 = itr1.next();\r
-// for (Iterator<ISSABasicBlock> itr2 = cdg.iterator(); itr2.hasNext();) {\r
-// ISSABasicBlock b2 = itr2.next();\r
-// if (manager.hasEdge(b1, b2)) {\r
-// StringBuilder sb = new StringBuilder();\r
-// b1.forEach(new Consumer<SSAInstruction>() {\r
-// @Override\r
-// public void accept(SSAInstruction t) {\r
-// sb.append(t.iindex);\r
-// sb.append(";");\r
-// }\r
-// });\r
-// sb.append(" -> ");\r
-// b2.forEach(new Consumer<SSAInstruction>() {\r
-// @Override\r
-// public void accept(SSAInstruction t) {\r
-// sb.append(t.iindex);\r
-// sb.append(";");\r
-// }\r
-// });\r
-// System.out.println(sb.toString());\r
-// }\r
-// }\r
-// }\r
- \r
} catch (Exception e) {\r
e.printStackTrace();\r
}\r
long start = System.currentTimeMillis();\r
\r
String appJar = "bin/demo/testdata";\r
-// String appJar = "C:\\Users\\t-hatano\\git\\soba-core\\bin";\r
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS));\r
\r
ClassHierarchy cha = ClassHierarchy.make(scope);\r
// build the call graph\r
CallGraphBuilder cgb = Util.makeZeroCFABuilder(options, new AnalysisCache(),cha, scope, null, null);\r
CallGraph cg = cgb.makeCallGraph(options, null);\r
-// PointerAnalysis<InstanceKey> pa = cgb.getPointerAnalysis();\r
PointerAnalysis<InstanceKey> pa = null;\r
\r
for (int i = 0; i < cg.getMaxNumber(); i++) {\r
long start = System.currentTimeMillis();\r
\r
String appJar = "bin/demo/testdata";\r
-// String appJar = "C:\\Users\\t-hatano\\git\\soba-core\\bin";\r
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS));\r
\r
ClassHierarchy cha = ClassHierarchy.make(scope);\r