diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21b4487 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Project exclude paths +/out/ \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 49a9bf2..7fc33af 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,4 +7,7 @@ + + \ No newline at end of file diff --git a/README.md b/README.md index 5de658b..52d562a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Lab 4 - Software Peformance 2023 +# Lab 4 - Software Performance 2023 This is Lab 4 of the **Software Performance** course at USI. @@ -6,29 +6,32 @@ Go to [this Lab on iCorsi](https://www.icorsi.ch/course/view.php?id=16963). ## Submission Info -Property | Value ------------- | ------------- -First Name | ... -Last Name | ... +| Property | Value | +|------------|----------| +| First Name | Claudio | +| Last Name | Maggioni | + +**NOTE:** the combined PDFs for all CFGs, all combined outputs and all DTs can be found in `test-output/all.cfg.pdf`, +`test-output/all.combined.pdf` and `test-output/all.dt.pdf` respectively. ## Submission Checklist Please complete this checklist (turn [ ] into [X]) before you submit: -- [ ] I completed the above Submission Info -- [ ] I built the project in IntelliJ (Build > Build Project) -- [ ] I (re)implemented the ControlFlowGraphBuilder (copy from Lab 3) -- [ ] I (re)implemented the ControlFlowGraphRenderer (copy from Lab 3) -- [ ] I implemented the Traversal -- [ ] I implemented the DominatorAnalyzer -- [ ] I wrote the source code myself and did not look at the source code of my class mates -- [ ] I ran all the JUnit tests and verified that they all pass -- [ ] I manually checked that my implementation is correct by doing this: - - [ ] I studied the test-input/ExampleClass.java source code - - [ ] I ran App to produce the dot files (in test-output/) - - [ ] I ran dot to turn the dot files in test-output into a PDF - - [ ] I manually verified that the PDF contains a set of pages per method of ExampleClass - - [ ] I manually verified that the CFGs in the PDFs correspond to the methods' source code - - [ ] I manually verified that the dominator trees in the PDFs correspond to the method's source code -- [ ] I committed my changes (at least one commit, but possibly many) -- [ ] I pushed my commits to GitHub +- [x] I completed the above Submission Info +- [x] I built the project in IntelliJ (Build > Build Project) +- [x] I (re)implemented the ControlFlowGraphBuilder (copy from Lab 3) +- [x] I (re)implemented the ControlFlowGraphRenderer (copy from Lab 3) +- [x] I implemented the Traversal +- [x] I implemented the DominatorAnalyzer +- [x] I wrote the source code myself and did not look at the source code of my class mates +- [x] I ran all the JUnit tests and verified that they all pass +- [x] I manually checked that my implementation is correct by doing this: + - [x] I studied the test-input/ExampleClass.java source code + - [x] I ran App to produce the dot files (in test-output/) + - [x] I ran dot to turn the dot files in test-output into a PDF + - [x] I manually verified that the PDF contains a set of pages per method of ExampleClass + - [x] I manually verified that the CFGs in the PDFs correspond to the methods' source code + - [x] I manually verified that the dominator trees in the PDFs correspond to the method's source code +- [x] I committed my changes (at least one commit, but possibly many) +- [x] I pushed my commits to GitHub diff --git a/compile-tests.sh b/compile-tests.sh new file mode 100755 index 0000000..04948c3 --- /dev/null +++ b/compile-tests.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -eou pipefail + +cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" +for extkind in cfg combined dt; do + gvpack -u test-output/*.$extkind.dot > test-output/all.$extkind.dot + dot -Tpdf test-output/all.$extkind.dot > test-output/all.$extkind.pdf +done \ No newline at end of file diff --git a/src/ch/usi/inf/sp/cfg/ControlFlowGraph.java b/src/ch/usi/inf/sp/cfg/ControlFlowGraph.java index df92c96..5afcf1b 100644 --- a/src/ch/usi/inf/sp/cfg/ControlFlowGraph.java +++ b/src/ch/usi/inf/sp/cfg/ControlFlowGraph.java @@ -1,7 +1,7 @@ package ch.usi.inf.sp.cfg; -import ch.usi.inf.sp.graph.DiGraph; +import ch.usi.inf.sp.graph.DiGraph; public final class ControlFlowGraph extends DiGraph { @@ -85,26 +85,4 @@ public final class ControlFlowGraph extends DiGraph return exit; } - public String toString() { - final StringBuffer sb = new StringBuffer("digraph CFG {\n"); - for (final BasicBlock node : getNodes()) { - if (node==entry) { - sb.append(" " + node + " [shape=circle,style=filled,label=e]\n"); - } else if (node==exit) { - sb.append(" " + node + " [shape=circle,style=filled,label=x]\n"); - } else { - sb.append(" " + node + " [shape=rectangle]\n"); - } - } - for (final ControlFlowEdge edge : getEdges()) { - if (edge.getLabel().length()>0) { - sb.append(" " + edge + " [label=" + edge.getLabel() + "]\n"); - } else { - sb.append(" " + edge + "\n"); - } - } - sb.append("}\n"); - return sb.toString(); - } - } diff --git a/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java b/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java index 9579528..172d72e 100644 --- a/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java +++ b/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java @@ -1,23 +1,141 @@ package ch.usi.inf.sp.cfg; -import java.util.List; - import ch.usi.inf.sp.bytecode.Disassembler; +import ch.usi.inf.sp.cfg.builder.JumpSource; +import ch.usi.inf.sp.cfg.builder.LookupSwitchInstructionNodeInfo; +import ch.usi.inf.sp.cfg.builder.MultiMap; +import ch.usi.inf.sp.cfg.builder.SwitchInstructionNodeInfo; +import ch.usi.inf.sp.cfg.builder.TableSwitchInstructionNodeInfo; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.JumpInsnNode; -import org.objectweb.asm.tree.LabelNode; -import org.objectweb.asm.tree.LookupSwitchInsnNode; -import org.objectweb.asm.tree.MethodNode; -import org.objectweb.asm.tree.TableSwitchInsnNode; +import org.objectweb.asm.tree.*; +import java.util.*; -public class ControlFlowGraphBuilder { +public final class ControlFlowGraphBuilder { + private static final String DEFAULT_LABEL = "default"; + private static final String TRUE_LABEL = "T"; - public static ControlFlowGraph createControlFlowGraph(final MethodNode method) { - //TODO - return null; + private final MultiMap labelToIncomingEdges = new MultiMap<>(); + private final List labels = new ArrayList<>(); + private final Map insnToBlock = new HashMap<>(); + private final ControlFlowGraph graph = new ControlFlowGraph(); + private final MethodNode method; + private BasicBlock currentBasicBlock; + + private ControlFlowGraphBuilder(MethodNode method) { + this.method = method; + setNewBasicBlock(0); + graph.addEntryEdge(currentBasicBlock); } + public static ControlFlowGraph createControlFlowGraph(final MethodNode method) { + return new ControlFlowGraphBuilder(method).create(); + } + + private void setNewBasicBlock(int id) { + currentBasicBlock = new BasicBlock(id); + graph.addNode(currentBasicBlock); + } + + public ControlFlowGraph create() { + // get the list of all instructions in that method + final InsnList instructions = method.instructions; + for (int i = 0; i < instructions.size(); i++) { + final AbstractInsnNode instruction = instructions.get(i); + + switch (instruction.getType()) { + case AbstractInsnNode.JUMP_INSN: + labelToIncomingEdges.put(((JumpInsnNode) instruction).label, new JumpSource(instruction, TRUE_LABEL)); + break; + case AbstractInsnNode.LOOKUPSWITCH_INSN: + captureSwitchEdges(new LookupSwitchInstructionNodeInfo((LookupSwitchInsnNode) instruction)); + break; + case AbstractInsnNode.TABLESWITCH_INSN: + captureSwitchEdges(new TableSwitchInstructionNodeInfo((TableSwitchInsnNode) instruction)); + } + } + + for (int i = 0; i < instructions.size(); i++) { + final AbstractInsnNode instruction = instructions.get(i); + + currentBasicBlock.appendInstruction(Disassembler.disassembleInstruction(instruction, i, instructions)); + + if (isReturnInstruction(instruction)) { + graph.addExitEdge(currentBasicBlock); + } + + insnToBlock.put(instruction, currentBasicBlock); + + if (isInsnSignificantLabel(instruction)) { + labels.add((LabelNode) instruction); + } + + if (isEndOfBlock(instruction)) { + final BasicBlock previousBasicBlock = currentBasicBlock; + setNewBasicBlock(i + 1); + + // GOTO and SWITCH instructions do not have a fallthrough edge, otherwise add one + if (instruction.getOpcode() != Opcodes.GOTO + && instruction.getType() != AbstractInsnNode.LOOKUPSWITCH_INSN + && instruction.getType() != AbstractInsnNode.TABLESWITCH_INSN) { + graph.addFallthroughEdge(previousBasicBlock, currentBasicBlock); + } + } + } + + for (final LabelNode label : labels) { + final BasicBlock toBB = Objects.requireNonNull(insnToBlock.get(label)); + for (final JumpSource jumpSource : labelToIncomingEdges.getAll(label)) { + final BasicBlock fromBB = jumpSource.block(insnToBlock); + final ControlFlowEdge edge = jumpSource.edge(); + + graph.addEdge(edge); + graph.connect(fromBB, edge, toBB); + } + } + + return graph; + } + + private void captureSwitchEdges(final SwitchInstructionNodeInfo info) { + for (int j = 0; j < info.getCaseCount(); j++) { + final LabelNode label = info.getLabelForCase(j); + final String value = info.getKeyForCase(j); + labelToIncomingEdges.put(label, new JumpSource(info.getNode(), value)); + } + if (info.getDefaultCase() != null) { + labelToIncomingEdges.put(info.getDefaultCase(), new JumpSource(info.getNode(), DEFAULT_LABEL)); + } + } + + private boolean isInsnSignificantLabel(final AbstractInsnNode node) { + return node instanceof LabelNode && labelToIncomingEdges.containsKey((LabelNode) node); + } + + private boolean isReturnInstruction(final AbstractInsnNode instruction) { + final int opcode = instruction.getOpcode(); + return opcode == Opcodes.RETURN || + opcode == Opcodes.ARETURN || + opcode == Opcodes.LRETURN || + opcode == Opcodes.IRETURN || + opcode == Opcodes.FRETURN; + } + + private boolean isEndOfBlock(final AbstractInsnNode instruction) { + final AbstractInsnNode nextInsn = instruction.getNext(); + + if (nextInsn == null) { + return false; // cannot start another bb at the end of the method with 0 instructions + } + + final int type = instruction.getType(); + if (type == AbstractInsnNode.JUMP_INSN || + type == AbstractInsnNode.LOOKUPSWITCH_INSN || + type == AbstractInsnNode.TABLESWITCH_INSN) { + return true; // if we're branching or jumping after this instruction, we NEED to cut the current bb short + } + + // if the next instruction is a label some other bb may jump into then cut, otherwise continue + return isInsnSignificantLabel(nextInsn); + } } diff --git a/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java b/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java index 4ec24b7..9a100a7 100644 --- a/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java +++ b/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java @@ -1,11 +1,63 @@ package ch.usi.inf.sp.cfg; -public class ControlFlowGraphRenderer { +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; - public static String renderControlFlowGraph(final String label, final ControlFlowGraph cfg) { - //TODO - return null; +public class ControlFlowGraphRenderer { + private static final String INDENTATION = " "; + private final StringBuilder code = new StringBuilder(); + private int indentationLevel = 0; + + private static String nodeIdentifier(final BasicBlock bb, final String graphId) { + // as the basic block ID is negative for the entry and exit node, and negative numbers contain + // a dash symbol, we need to quote the identifier to make a syntactically correct DOT file + return String.format("\"%sbb%d\"", graphId, bb.getId()); } + private static String nodeStyle(final BasicBlock bb, final String label) { + if (bb.getInEdges().isEmpty()) { + return "[shape=circle,label=\"e\",xlabel=\"" + label + "\"]"; + } else if (bb.getOutEdges().isEmpty()) { + return "[shape=circle,label=\"x\"]"; + } else { + return "[label=\"" + bb.getId() + "|{" + + StreamSupport.stream(bb.getInstructions().spliterator(), false) + .collect(Collectors.joining("|")) + + "}\"]"; + } + } + + public static String renderControlFlowGraph(final String label, final ControlFlowGraph cfg) { + return new ControlFlowGraphRenderer().render(label, cfg); + } + + private void line(String line) { + code.append(INDENTATION.repeat(indentationLevel)).append(line).append('\n'); + } + + private String render(final String desiredLabel, final ControlFlowGraph graph) { + final String label = desiredLabel.replaceAll("\\W+", ""); + + line("digraph " + label + " {"); + code.append('\n'); + indentationLevel++; + + line("node [shape=record]"); + for (final BasicBlock bb : graph.getNodes()) { + line(nodeIdentifier(bb, label) + " " + nodeStyle(bb, label)); + } + code.append('\n'); + + for (var e : graph.getEdges()) { + final String l = e.getLabel(); + final String suffix = l == null || l.isBlank() ? "" : (" [label=\"" + e.getLabel() + "\"]"); + + line(nodeIdentifier(e.getFrom(), label) + " -> " + nodeIdentifier(e.getTo(), label) + suffix); + } + indentationLevel--; + line("}"); + + return code.toString(); + } } diff --git a/src/ch/usi/inf/sp/cfg/builder/JumpSource.java b/src/ch/usi/inf/sp/cfg/builder/JumpSource.java new file mode 100644 index 0000000..9eb53ae --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/JumpSource.java @@ -0,0 +1,40 @@ +package ch.usi.inf.sp.cfg.builder; + +import ch.usi.inf.sp.cfg.BasicBlock; +import ch.usi.inf.sp.cfg.ControlFlowEdge; +import org.objectweb.asm.tree.AbstractInsnNode; + +import java.util.Map; +import java.util.Objects; + +public final class JumpSource { + private final AbstractInsnNode instruction; + private final String condition; + + public JumpSource(AbstractInsnNode instruction, String condition) { + this.instruction = instruction; + this.condition = condition; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (JumpSource) obj; + return Objects.equals(this.instruction, that.instruction) && + Objects.equals(this.condition, that.condition); + } + + @Override + public int hashCode() { + return Objects.hash(instruction, condition); + } + + public BasicBlock block(Map insnToBlock) { + return Objects.requireNonNull(insnToBlock.get(this.instruction)); + } + + public ControlFlowEdge edge() { + return new ControlFlowEdge(this.condition); + } +} diff --git a/src/ch/usi/inf/sp/cfg/builder/LookupSwitchInstructionNodeInfo.java b/src/ch/usi/inf/sp/cfg/builder/LookupSwitchInstructionNodeInfo.java new file mode 100644 index 0000000..bb88912 --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/LookupSwitchInstructionNodeInfo.java @@ -0,0 +1,38 @@ +package ch.usi.inf.sp.cfg.builder; + +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LookupSwitchInsnNode; + +public class LookupSwitchInstructionNodeInfo implements SwitchInstructionNodeInfo { + private final LookupSwitchInsnNode node; + + public LookupSwitchInstructionNodeInfo(LookupSwitchInsnNode node) { + this.node = node; + } + + @Override + public AbstractInsnNode getNode() { + return node; + } + + @Override + public int getCaseCount() { + return node.labels.size(); + } + + @Override + public LabelNode getLabelForCase(int index) { + return node.labels.get(index); + } + + @Override + public String getKeyForCase(int index) { + return Integer.toString(node.keys.get(index)); + } + + @Override + public LabelNode getDefaultCase() { + return node.dflt; + } +} diff --git a/src/ch/usi/inf/sp/cfg/builder/MultiMap.java b/src/ch/usi/inf/sp/cfg/builder/MultiMap.java new file mode 100644 index 0000000..0d243b7 --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/MultiMap.java @@ -0,0 +1,23 @@ +package ch.usi.inf.sp.cfg.builder; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MultiMap { + private final Map> innerMap = new HashMap<>(); + + public void put(K key, V value) { + innerMap.computeIfAbsent(key, (k) -> new ArrayList<>()); + innerMap.get(key).add(value); + } + + public List getAll(K key) { + return new ArrayList<>(innerMap.getOrDefault(key, List.of())); + } + + public boolean containsKey(K key) { + return innerMap.containsKey(key); + } +} diff --git a/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java b/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java new file mode 100644 index 0000000..c4993b0 --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java @@ -0,0 +1,13 @@ +package ch.usi.inf.sp.cfg.builder; + +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.LabelNode; + +public interface SwitchInstructionNodeInfo { + AbstractInsnNode getNode(); + int getCaseCount(); + LabelNode getLabelForCase(int index); + String getKeyForCase(int index); + + LabelNode getDefaultCase(); +} diff --git a/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java b/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java new file mode 100644 index 0000000..6091c2a --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java @@ -0,0 +1,38 @@ +package ch.usi.inf.sp.cfg.builder; + +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.TableSwitchInsnNode; + +public class TableSwitchInstructionNodeInfo implements SwitchInstructionNodeInfo { + private final TableSwitchInsnNode node; + + public TableSwitchInstructionNodeInfo(TableSwitchInsnNode node) { + this.node = node; + } + + @Override + public AbstractInsnNode getNode() { + return node; + } + + @Override + public int getCaseCount() { + return node.labels.size(); + } + + @Override + public LabelNode getLabelForCase(int index) { + return node.labels.get(index); + } + + @Override + public String getKeyForCase(int index) { + return Integer.toString(node.min + index); + } + + @Override + public LabelNode getDefaultCase() { + return node.dflt; + } +} diff --git a/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java b/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java index adbc072..34b3c02 100644 --- a/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java +++ b/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java @@ -2,18 +2,18 @@ package ch.usi.inf.sp.dom; import ch.usi.inf.sp.cfg.BasicBlock; import ch.usi.inf.sp.cfg.ControlFlowGraph; +import ch.usi.inf.sp.graph.Edge; import ch.usi.inf.sp.graph.Traversal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; public class DominatorAnalyzer { /** * Cooper et al.'s "Engineered Algorithm". + *
      * ================================================================
      * for all nodes, b   // initialize the dominators array
      *     doms[b] ← Undefined
@@ -40,13 +40,71 @@ public class DominatorAnalyzer {
      *             finger2 = doms[finger2]
      *     return finger1
      * ================================================================
+     * 
* Figure 3 of Cooper, Harvey, Kennedy */ public static DominatorTree analyze(final ControlFlowGraph cfg) { - //TODO - return null; + final Map dominators = new HashMap<>(); + final BasicBlock entryNode = cfg.getEntry(); + dominators.put(entryNode, entryNode); + + final List rpo = Traversal.getNodesInReversePostOrder(cfg, entryNode); + + boolean changed = true; + while (changed) { + changed = false; + for (final BasicBlock bb : rpo) { + if (bb == entryNode) { + continue; + } + + final List predecessors = bb.getInEdges().stream() + .map(Edge::getFrom) + .collect(Collectors.toCollection(LinkedList::new)); + + if (predecessors.isEmpty()) { + throw new IllegalStateException("all non-entry nodes should have one predecessor"); + } + + BasicBlock newDominator = predecessors.remove(0); + + for (final BasicBlock pred : predecessors) { + if (dominators.containsKey(pred)) { + newDominator = intersect(pred, newDominator, dominators, Comparator.comparing(rpo::indexOf).reversed()); + } + } + + if (dominators.get(bb) != newDominator) { + dominators.put(bb, newDominator); + changed = true; + } + } + } + + final DominatorTree tree = new DominatorTree(); + tree.setRootBlock(entryNode); + for (final Map.Entry entry : dominators.entrySet()) { + if (entry.getKey() != entryNode) { + tree.addDominanceEdge(entry.getValue(), entry.getKey()); + } + } + + return tree; } - // probably add a method intersect(...) + public static BasicBlock intersect(BasicBlock b1, BasicBlock b2, Map dominators, Comparator postOrder) { + BasicBlock finger1 = b1; + BasicBlock finger2 = b2; + while (postOrder.compare(finger1, finger2) != 0) { + while (postOrder.compare(finger1, finger2) < 0) { + finger1 = dominators.get(finger1); + } + while (postOrder.compare(finger1, finger2) > 0) { + finger2 = dominators.get(finger2); + } + } + + return finger1; + } } diff --git a/src/ch/usi/inf/sp/graph/Traversal.java b/src/ch/usi/inf/sp/graph/Traversal.java index ed5f1b1..3b0d5d7 100644 --- a/src/ch/usi/inf/sp/graph/Traversal.java +++ b/src/ch/usi/inf/sp/graph/Traversal.java @@ -14,7 +14,8 @@ public class Traversal { /** * From: https://eli.thegreenplace.net/2015/directed-graph-traversal-orderings-and-applications-to-data-flow-analysis/ - * + *

+ *

      * def postorder(graph, root):
      *   """Return a post-order ordering of nodes in the graph."""
      *   visited = set()
@@ -27,13 +28,30 @@ public class Traversal {
      *     order.append(node)
      *   dfs_walk(root)
      *   return order
+     * 
*/ public static , N extends Node, E extends Edge> List getNodesInPostOrder(final DiGraph graph, final N entryNode) { - //TODO - return null; + final Set visited = new HashSet<>(); + final List order = new ArrayList<>(); + final Deque visitStack = new ArrayDeque<>(); + visitStack.push(entryNode); + + mainLoop: + while (!visitStack.isEmpty()) { + final N node = visitStack.pop(); + for (final E outEdge : node.getOutEdges()) { + final N successor = outEdge.getTo(); + if (!visited.contains(successor)) { + visited.add(successor); + visitStack.push(node); + visitStack.push(successor); + continue mainLoop; + } + } + order.add(node); + } + + return order; } - - // probably add a method dfsWalk(...) - } diff --git a/starter-lab-04-dominator-analysis.iml b/starter-lab-04-dominator-analysis.iml index 622d288..702823c 100644 --- a/starter-lab-04-dominator-analysis.iml +++ b/starter-lab-04-dominator-analysis.iml @@ -21,5 +21,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test-output/.asm.txt b/test-output/.asm.txt new file mode 100644 index 0000000..b94ec36 --- /dev/null +++ b/test-output/.asm.txt @@ -0,0 +1,6 @@ + Method: ()V + 0: // label + 1: // line number information + 2: ALOAD 0 + 3: INVOKESPECIAL java/lang/Object. ()V + 4: RETURN diff --git a/test-output/.cfg.dot b/test-output/.cfg.dot new file mode 100644 index 0000000..e3cc09e --- /dev/null +++ b/test-output/.cfg.dot @@ -0,0 +1,10 @@ +digraph init { + + node [shape=record] + "initbb-1" [shape=circle,label="e",xlabel="init"] + "initbb-2" [shape=circle,label="x"] + "initbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: INVOKESPECIAL java/lang/Object. ()V|4: RETURN }"] + + "initbb-1" -> "initbb0" + "initbb0" -> "initbb-2" +} diff --git a/test-output/.combined.dot b/test-output/.combined.dot new file mode 100644 index 0000000..6e92ea1 --- /dev/null +++ b/test-output/.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: INVOKESPECIAL java/lang/Object. ()V\l|4: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/.dt.dot b/test-output/.dt.dot new file mode 100644 index 0000000..7dd7d0e --- /dev/null +++ b/test-output/.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/all.cfg.dot b/test-output/all.cfg.dot new file mode 100644 index 0000000..03559fd --- /dev/null +++ b/test-output/all.cfg.dot @@ -0,0 +1,805 @@ +digraph root { + node [label="\N", + shape=record + ]; + subgraph privateInstanceCallMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "privateInstanceCallMethodbb-1" [label=e, + shape=circle, + xlabel=privateInstanceCallMethod]; + privateInstanceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V|4: // label|\ +5: // line number information|6: ICONST_2 |7: IRETURN }"]; + "privateInstanceCallMethodbb-1" -> privateInstanceCallMethodbb0; + "privateInstanceCallMethodbb-2" [label=x, + shape=circle]; + privateInstanceCallMethodbb0 -> "privateInstanceCallMethodbb-2"; + } + subgraph privateInstanceCallTarget { + node [label="\N", + shape=record, + xlabel="" + ]; + "privateInstanceCallTargetbb-1" [label=e, + shape=circle, + xlabel=privateInstanceCallTarget]; + privateInstanceCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"]; + "privateInstanceCallTargetbb-1" -> privateInstanceCallTargetbb0; + "privateInstanceCallTargetbb-2" [label=x, + shape=circle]; + privateInstanceCallTargetbb0 -> "privateInstanceCallTargetbb-2"; + } + subgraph allocAndInit2dArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocAndInit2dArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocAndInit2dArrayMethod]; + allocAndInit2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_1 |3: ANEWARRAY [I|4: DUP |5: ICONST_0 |6: ICONST_1 |7: NEWARRAY T_INT|\ +8: DUP |9: ICONST_0 |10: ICONST_1 |11: IASTORE |12: AASTORE |13: ARETURN }"]; + "allocAndInit2dArrayMethodbb-1" -> allocAndInit2dArrayMethodbb0; + "allocAndInit2dArrayMethodbb-2" [label=x, + shape=circle]; + allocAndInit2dArrayMethodbb0 -> "allocAndInit2dArrayMethodbb-2"; + } + subgraph allocAndInitIntArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocAndInitIntArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocAndInitIntArrayMethod]; + allocAndInitIntArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: NEWARRAY T_INT|4: DUP |5: ICONST_0 |6: ICONST_1 |7: IASTORE |8: DUP |\ +9: ICONST_1 |10: ICONST_2 |11: IASTORE |12: ARETURN }"]; + "allocAndInitIntArrayMethodbb-1" -> allocAndInitIntArrayMethodbb0; + "allocAndInitIntArrayMethodbb-2" [label=x, + shape=circle]; + allocAndInitIntArrayMethodbb0 -> "allocAndInitIntArrayMethodbb-2"; + } + subgraph allocAndInitObjectArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocAndInitObjectArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocAndInitObjectArrayMethod]; + allocAndInitObjectArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY java/lang/Object|4: DUP |5: ICONST_0 |6: LDC 1|7: AASTORE |\ +8: DUP |9: ICONST_1 |10: LDC 2|11: AASTORE |12: ARETURN }"]; + "allocAndInitObjectArrayMethodbb-1" -> allocAndInitObjectArrayMethodbb0; + "allocAndInitObjectArrayMethodbb-2" [label=x, + shape=circle]; + allocAndInitObjectArrayMethodbb0 -> "allocAndInitObjectArrayMethodbb-2"; + } + subgraph allocIncomplete2dArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocIncomplete2dArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocIncomplete2dArrayMethod]; + allocIncomplete2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY [I|4: ARETURN }"]; + "allocIncomplete2dArrayMethodbb-1" -> allocIncomplete2dArrayMethodbb0; + "allocIncomplete2dArrayMethodbb-2" [label=x, + shape=circle]; + allocIncomplete2dArrayMethodbb0 -> "allocIncomplete2dArrayMethodbb-2"; + } + subgraph forMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forMethodbb-1" [label=e, + shape=circle, + xlabel=forMethod]; + forMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\ +7: ISTORE 3}"]; + "forMethodbb-1" -> forMethodbb0; + "forMethodbb-2" [label=x, + shape=circle]; + forMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 23}"]; + forMethodbb0 -> forMethodbb8; + forMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 2|16: ILOAD 3|17: IADD |18: ISTORE 2|19: // label|20: // line number \ +information|21: IINC 1 1|22: GOTO 8}"]; + forMethodbb8 -> forMethodbb13; + forMethodbb23 [label="23|{23: // label|24: // line number information|25: // stack frame map|26: ILOAD 2|27: IRETURN }"]; + forMethodbb8 -> forMethodbb23 [label=T]; + forMethodbb13 -> forMethodbb8 [label=T]; + forMethodbb23 -> "forMethodbb-2"; + } + subgraph forWithBreakMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forWithBreakMethodbb-1" [label=e, + shape=circle, + xlabel=forWithBreakMethod]; + forWithBreakMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\ +7: ISTORE 3}"]; + "forWithBreakMethodbb-1" -> forWithBreakMethodbb0; + "forWithBreakMethodbb-2" [label=x, + shape=circle]; + forWithBreakMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 32}"]; + forWithBreakMethodbb0 -> forWithBreakMethodbb8; + forWithBreakMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"]; + forWithBreakMethodbb8 -> forWithBreakMethodbb13; + forWithBreakMethodbb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: ILOAD 2|36: IRETURN }"]; + forWithBreakMethodbb8 -> forWithBreakMethodbb32 [label=T]; + forWithBreakMethodbb18 [label="18|{18: // label|19: // line number information|20: GOTO 32}"]; + forWithBreakMethodbb13 -> forWithBreakMethodbb18; + forWithBreakMethodbb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2|28: // \ +label|29: // line number information|30: IINC 3 1|31: GOTO 8}"]; + forWithBreakMethodbb13 -> forWithBreakMethodbb21 [label=T]; + forWithBreakMethodbb18 -> forWithBreakMethodbb32 [label=T]; + forWithBreakMethodbb21 -> forWithBreakMethodbb8 [label=T]; + forWithBreakMethodbb32 -> "forWithBreakMethodbb-2"; + } + subgraph forWithContinueMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forWithContinueMethodbb-1" [label=e, + shape=circle, + xlabel=forWithContinueMethod]; + forWithContinueMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\ +7: ISTORE 3}"]; + "forWithContinueMethodbb-1" -> forWithContinueMethodbb0; + "forWithContinueMethodbb-2" [label=x, + shape=circle]; + forWithContinueMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 33}"]; + forWithContinueMethodbb0 -> forWithContinueMethodbb8; + forWithContinueMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"]; + forWithContinueMethodbb8 -> forWithContinueMethodbb13; + forWithContinueMethodbb33 [label="33|{33: // label|34: // line number information|35: // stack frame map|36: ILOAD 2|37: IRETURN }"]; + forWithContinueMethodbb8 -> forWithContinueMethodbb33 [label=T]; + forWithContinueMethodbb18 [label="18|{18: // label|19: // line number information|20: GOTO 28}"]; + forWithContinueMethodbb13 -> forWithContinueMethodbb18; + forWithContinueMethodbb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2}"]; + forWithContinueMethodbb13 -> forWithContinueMethodbb21 [label=T]; + forWithContinueMethodbb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: IINC 3 1|32: GOTO 8}"]; + forWithContinueMethodbb18 -> forWithContinueMethodbb28 [label=T]; + forWithContinueMethodbb21 -> forWithContinueMethodbb28; + forWithContinueMethodbb28 -> forWithContinueMethodbb8 [label=T]; + forWithContinueMethodbb33 -> "forWithContinueMethodbb-2"; + } + subgraph ifElseMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "ifElseMethodbb-1" [label=e, + shape=circle, + xlabel=ifElseMethod]; + ifElseMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \ +IFLE 13}"]; + "ifElseMethodbb-1" -> ifElseMethodbb0; + "ifElseMethodbb-2" [label=x, + shape=circle]; + ifElseMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_0 |11: ISTORE 2|12: GOTO 18}"]; + ifElseMethodbb0 -> ifElseMethodbb8; + ifElseMethodbb13 [label="13|{13: // label|14: // line number information|15: // stack frame map|16: ILOAD 1|17: ISTORE 2}"]; + ifElseMethodbb0 -> ifElseMethodbb13 [label=T]; + ifElseMethodbb18 [label="18|{18: // label|19: // line number information|20: // stack frame map|21: ILOAD 2|22: IRETURN }"]; + ifElseMethodbb8 -> ifElseMethodbb18 [label=T]; + ifElseMethodbb13 -> ifElseMethodbb18; + ifElseMethodbb18 -> "ifElseMethodbb-2"; + } + subgraph instanceCallMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "instanceCallMethodbb-1" [label=e, + shape=circle, + xlabel=instanceCallMethod]; + instanceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V|4: // label|5: // \ +line number information|6: ICONST_2 |7: IRETURN }"]; + "instanceCallMethodbb-1" -> instanceCallMethodbb0; + "instanceCallMethodbb-2" [label=x, + shape=circle]; + instanceCallMethodbb0 -> "instanceCallMethodbb-2"; + } + subgraph instanceCallTarget { + node [label="\N", + shape=record, + xlabel="" + ]; + "instanceCallTargetbb-1" [label=e, + shape=circle, + xlabel=instanceCallTarget]; + instanceCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"]; + "instanceCallTargetbb-1" -> instanceCallTargetbb0; + "instanceCallTargetbb-2" [label=x, + shape=circle]; + instanceCallTargetbb0 -> "instanceCallTargetbb-2"; + } + subgraph interfaceCallMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "interfaceCallMethodbb-1" [label=e, + shape=circle, + xlabel=interfaceCallMethod]; + interfaceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V|4: // \ +label|5: // line number information|6: ICONST_2 |7: IRETURN }"]; + "interfaceCallMethodbb-1" -> interfaceCallMethodbb0; + "interfaceCallMethodbb-2" [label=x, + shape=circle]; + interfaceCallMethodbb0 -> "interfaceCallMethodbb-2"; + } + subgraph nestedFor { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "nestedForbb-1" [label=e, + shape=circle, + xlabel=nestedFor]; + nestedForbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\ +7: ISTORE 3}"]; + "nestedForbb-1" -> nestedForbb0; + "nestedForbb-2" [label=x, + shape=circle]; + nestedForbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 37}"]; + nestedForbb0 -> nestedForbb8; + nestedForbb13 [label="13|{13: // label|14: // line number information|15: ICONST_0 |16: ISTORE 4}"]; + nestedForbb8 -> nestedForbb13; + nestedForbb37 [label="37|{37: // label|38: // line number information|39: // stack frame map|40: ILOAD 2|41: IRETURN }"]; + nestedForbb8 -> nestedForbb37 [label=T]; + nestedForbb17 [label="17|{17: // label|18: // stack frame map|19: ILOAD 4|20: ILOAD 3|21: IF_ICMPGE 32}"]; + nestedForbb13 -> nestedForbb17; + nestedForbb22 [label="22|{22: // label|23: // line number information|24: ILOAD 2|25: ILOAD 4|26: IADD |27: ISTORE 2|28: // label|29: // line number \ +information|30: IINC 4 1|31: GOTO 17}"]; + nestedForbb17 -> nestedForbb22; + nestedForbb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: IINC 3 1|36: GOTO 8}"]; + nestedForbb17 -> nestedForbb32 [label=T]; + nestedForbb22 -> nestedForbb17 [label=T]; + nestedForbb32 -> nestedForbb8 [label=T]; + nestedForbb37 -> "nestedForbb-2"; + } + subgraph nonShortCircuitMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "nonShortCircuitMethodbb-1" [label=e, + shape=circle, + xlabel=nonShortCircuitMethod]; + nonShortCircuitMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"]; + "nonShortCircuitMethodbb-1" -> nonShortCircuitMethodbb0; + "nonShortCircuitMethodbb-2" [label=x, + shape=circle]; + nonShortCircuitMethodbb5 [label="5|{5: ICONST_1 |6: GOTO 10}"]; + nonShortCircuitMethodbb0 -> nonShortCircuitMethodbb5; + nonShortCircuitMethodbb7 [label="7|{7: // label|8: // stack frame map|9: ICONST_0 }"]; + nonShortCircuitMethodbb0 -> nonShortCircuitMethodbb7 [label=T]; + nonShortCircuitMethodbb10 [label="10|{10: // label|11: // stack frame map|12: ILOAD 1|13: ILOAD 3|14: IF_ICMPGE 17}"]; + nonShortCircuitMethodbb5 -> nonShortCircuitMethodbb10 [label=T]; + nonShortCircuitMethodbb7 -> nonShortCircuitMethodbb10; + nonShortCircuitMethodbb15 [label="15|{15: ICONST_1 |16: GOTO 20}"]; + nonShortCircuitMethodbb10 -> nonShortCircuitMethodbb15; + nonShortCircuitMethodbb17 [label="17|{17: // label|18: // stack frame map|19: ICONST_0 }"]; + nonShortCircuitMethodbb10 -> nonShortCircuitMethodbb17 [label=T]; + nonShortCircuitMethodbb20 [label="20|{20: // label|21: // stack frame map|22: IAND |23: IFEQ 28}"]; + nonShortCircuitMethodbb15 -> nonShortCircuitMethodbb20 [label=T]; + nonShortCircuitMethodbb17 -> nonShortCircuitMethodbb20; + nonShortCircuitMethodbb24 [label="24|{24: // label|25: // line number information|26: ICONST_1 |27: IRETURN }"]; + nonShortCircuitMethodbb20 -> nonShortCircuitMethodbb24; + nonShortCircuitMethodbb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: ICONST_0 |32: IRETURN }"]; + nonShortCircuitMethodbb20 -> nonShortCircuitMethodbb28 [label=T]; + nonShortCircuitMethodbb24 -> "nonShortCircuitMethodbb-2"; + nonShortCircuitMethodbb24 -> nonShortCircuitMethodbb28; + nonShortCircuitMethodbb28 -> "nonShortCircuitMethodbb-2"; + } + subgraph shortCircuitMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "shortCircuitMethodbb-1" [label=e, + shape=circle, + xlabel=shortCircuitMethod]; + shortCircuitMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 12}"]; + "shortCircuitMethodbb-1" -> shortCircuitMethodbb0; + "shortCircuitMethodbb-2" [label=x, + shape=circle]; + shortCircuitMethodbb5 [label="5|{5: ILOAD 1|6: ILOAD 3|7: IF_ICMPGE 12}"]; + shortCircuitMethodbb0 -> shortCircuitMethodbb5; + shortCircuitMethodbb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ICONST_0 |16: IRETURN }"]; + shortCircuitMethodbb0 -> shortCircuitMethodbb12 [label=T]; + shortCircuitMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: IRETURN }"]; + shortCircuitMethodbb5 -> shortCircuitMethodbb8; + shortCircuitMethodbb5 -> shortCircuitMethodbb12 [label=T]; + shortCircuitMethodbb8 -> "shortCircuitMethodbb-2"; + shortCircuitMethodbb8 -> shortCircuitMethodbb12; + shortCircuitMethodbb12 -> "shortCircuitMethodbb-2"; + } + subgraph staticCallMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "staticCallMethodbb-1" [label=e, + shape=circle, + xlabel=staticCallMethod]; + staticCallMethodbb0 [label="0|{0: // label|1: // line number information|2: INVOKESTATIC ExampleClass.staticCallTarget ()V|3: // label|4: // line number \ +information|5: ICONST_2 |6: IRETURN }"]; + "staticCallMethodbb-1" -> staticCallMethodbb0; + "staticCallMethodbb-2" [label=x, + shape=circle]; + staticCallMethodbb0 -> "staticCallMethodbb-2"; + } + subgraph staticCallTarget { + node [label="\N", + shape=record, + xlabel="" + ]; + "staticCallTargetbb-1" [label=e, + shape=circle, + xlabel=staticCallTarget]; + staticCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"]; + "staticCallTargetbb-1" -> staticCallTargetbb0; + "staticCallTargetbb-2" [label=x, + shape=circle]; + staticCallTargetbb0 -> "staticCallTargetbb-2"; + } + subgraph staticFieldReadMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "staticFieldReadMethodbb-1" [label=e, + shape=circle, + xlabel=staticFieldReadMethod]; + staticFieldReadMethodbb0 [label="0|{0: // label|1: // line number information|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;|3: ARETURN }"]; + "staticFieldReadMethodbb-1" -> staticFieldReadMethodbb0; + "staticFieldReadMethodbb-2" [label=x, + shape=circle]; + staticFieldReadMethodbb0 -> "staticFieldReadMethodbb-2"; + } + subgraph staticFieldWriteMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "staticFieldWriteMethodbb-1" [label=e, + shape=circle, + xlabel=staticFieldWriteMethod]; + staticFieldWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;|4: // label|\ +5: // line number information|6: RETURN }"]; + "staticFieldWriteMethodbb-1" -> staticFieldWriteMethodbb0; + "staticFieldWriteMethodbb-2" [label=x, + shape=circle]; + staticFieldWriteMethodbb0 -> "staticFieldWriteMethodbb-2"; + } + subgraph switchMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "switchMethodbb-1" [label=e, + shape=circle, + xlabel=switchMethod]; + switchMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \ +TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26}"]; + "switchMethodbb-1" -> switchMethodbb0; + "switchMethodbb-2" [label=x, + shape=circle]; + switchMethodbb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"]; + switchMethodbb0 -> switchMethodbb8 [label=0]; + switchMethodbb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"]; + switchMethodbb0 -> switchMethodbb14 [label=1]; + switchMethodbb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"]; + switchMethodbb0 -> switchMethodbb20 [label=2]; + switchMethodbb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"]; + switchMethodbb0 -> switchMethodbb26 [label=default]; + switchMethodbb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"]; + switchMethodbb8 -> switchMethodbb31 [label=T]; + switchMethodbb14 -> switchMethodbb31 [label=T]; + switchMethodbb20 -> switchMethodbb31 [label=T]; + switchMethodbb26 -> switchMethodbb31; + switchMethodbb31 -> "switchMethodbb-2"; + } + subgraph switchMethod2 { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "switchMethod2bb-1" [label=e, + shape=circle, + xlabel=switchMethod2]; + switchMethod2bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \ +LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26}"]; + "switchMethod2bb-1" -> switchMethod2bb0; + "switchMethod2bb-2" [label=x, + shape=circle]; + switchMethod2bb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"]; + switchMethod2bb0 -> switchMethod2bb8 [label=0]; + switchMethod2bb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"]; + switchMethod2bb0 -> switchMethod2bb14 [label=1000]; + switchMethod2bb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"]; + switchMethod2bb0 -> switchMethod2bb20 [label=2000]; + switchMethod2bb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"]; + switchMethod2bb0 -> switchMethod2bb26 [label=default]; + switchMethod2bb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"]; + switchMethod2bb8 -> switchMethod2bb31 [label=T]; + switchMethod2bb14 -> switchMethod2bb31 [label=T]; + switchMethod2bb20 -> switchMethod2bb31 [label=T]; + switchMethod2bb26 -> switchMethod2bb31; + switchMethod2bb31 -> "switchMethod2bb-2"; + } + subgraph whileMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "whileMethodbb-1" [label=e, + shape=circle, + xlabel=whileMethod]; + whileMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]; + "whileMethodbb-1" -> whileMethodbb0; + "whileMethodbb-2" [label=x, + shape=circle]; + whileMethodbb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 1|8: IFLE 19}"]; + whileMethodbb0 -> whileMethodbb4; + whileMethodbb9 [label="9|{9: // label|10: // line number information|11: ILOAD 2|12: ILOAD 1|13: IADD |14: ISTORE 2|15: // label|16: // line number \ +information|17: IINC 1 -1|18: GOTO 4}"]; + whileMethodbb4 -> whileMethodbb9; + whileMethodbb19 [label="19|{19: // label|20: // line number information|21: // stack frame map|22: ILOAD 2|23: IRETURN }"]; + whileMethodbb4 -> whileMethodbb19 [label=T]; + whileMethodbb9 -> whileMethodbb4 [label=T]; + whileMethodbb19 -> "whileMethodbb-2"; + } + subgraph whileTrueMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "whileTrueMethodbb-1" [label=e, + shape=circle, + xlabel=whileTrueMethod]; + whileTrueMethodbb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: GOTO 0}"]; + "whileTrueMethodbb-1" -> whileTrueMethodbb0; + "whileTrueMethodbb-2" [label=e, + shape=circle, + xlabel=whileTrueMethod]; + whileTrueMethodbb0 -> whileTrueMethodbb0 [label=T]; + } + subgraph alloc2Of3dArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "alloc2Of3dArrayMethodbb-1" [label=e, + shape=circle, + xlabel=alloc2Of3dArrayMethod]; + alloc2Of3dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[[I 2|5: ARETURN }"]; + "alloc2Of3dArrayMethodbb-1" -> alloc2Of3dArrayMethodbb0; + "alloc2Of3dArrayMethodbb-2" [label=x, + shape=circle]; + alloc2Of3dArrayMethodbb0 -> "alloc2Of3dArrayMethodbb-2"; + } + subgraph alloc2dArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "alloc2dArrayMethodbb-1" [label=e, + shape=circle, + xlabel=alloc2dArrayMethod]; + alloc2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[I 2|5: ARETURN }"]; + "alloc2dArrayMethodbb-1" -> alloc2dArrayMethodbb0; + "alloc2dArrayMethodbb-2" [label=x, + shape=circle]; + alloc2dArrayMethodbb0 -> "alloc2dArrayMethodbb-2"; + } + subgraph allocIntArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocIntArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocIntArrayMethod]; + allocIntArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: NEWARRAY T_INT|4: ARETURN }"]; + "allocIntArrayMethodbb-1" -> allocIntArrayMethodbb0; + "allocIntArrayMethodbb-2" [label=x, + shape=circle]; + allocIntArrayMethodbb0 -> "allocIntArrayMethodbb-2"; + } + subgraph allocObjectArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocObjectArrayMethodbb-1" [label=e, + shape=circle, + xlabel=allocObjectArrayMethod]; + allocObjectArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: ANEWARRAY java/lang/Object|4: ARETURN }"]; + "allocObjectArrayMethodbb-1" -> allocObjectArrayMethodbb0; + "allocObjectArrayMethodbb-2" [label=x, + shape=circle]; + allocObjectArrayMethodbb0 -> "allocObjectArrayMethodbb-2"; + } + subgraph allocObjectMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "allocObjectMethodbb-1" [label=e, + shape=circle, + xlabel=allocObjectMethod]; + allocObjectMethodbb0 [label="0|{0: // label|1: // line number information|2: NEW java/lang/Object|3: DUP |4: INVOKESPECIAL java/lang/Object. ()V|5: ARETURN }"]; + "allocObjectMethodbb-1" -> allocObjectMethodbb0; + "allocObjectMethodbb-2" [label=x, + shape=circle]; + allocObjectMethodbb0 -> "allocObjectMethodbb-2"; + } + subgraph arrayLengthMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "arrayLengthMethodbb-1" [label=e, + shape=circle, + xlabel=arrayLengthMethod]; + arrayLengthMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ARRAYLENGTH |4: IRETURN }"]; + "arrayLengthMethodbb-1" -> arrayLengthMethodbb0; + "arrayLengthMethodbb-2" [label=x, + shape=circle]; + arrayLengthMethodbb0 -> "arrayLengthMethodbb-2"; + } + subgraph arrayReadMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "arrayReadMethodbb-1" [label=e, + shape=circle, + xlabel=arrayReadMethod]; + arrayReadMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: AALOAD |5: ARETURN }"]; + "arrayReadMethodbb-1" -> arrayReadMethodbb0; + "arrayReadMethodbb-2" [label=x, + shape=circle]; + arrayReadMethodbb0 -> "arrayReadMethodbb-2"; + } + subgraph arrayWriteMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "arrayWriteMethodbb-1" [label=e, + shape=circle, + xlabel=arrayWriteMethod]; + arrayWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: ALOAD 2|5: AASTORE |6: // label|7: // line number information|\ +8: RETURN }"]; + "arrayWriteMethodbb-1" -> arrayWriteMethodbb0; + "arrayWriteMethodbb-2" [label=x, + shape=circle]; + arrayWriteMethodbb0 -> "arrayWriteMethodbb-2"; + } + subgraph condMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "condMethodbb-1" [label=e, + shape=circle, + xlabel=condMethod]; + condMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"]; + "condMethodbb-1" -> condMethodbb0; + "condMethodbb-2" [label=x, + shape=circle]; + condMethodbb5 [label="5|{5: ILOAD 1|6: GOTO 10}"]; + condMethodbb0 -> condMethodbb5; + condMethodbb7 [label="7|{7: // label|8: // stack frame map|9: ILOAD 2}"]; + condMethodbb0 -> condMethodbb7 [label=T]; + condMethodbb10 [label="10|{10: // label|11: // stack frame map|12: IRETURN }"]; + condMethodbb5 -> condMethodbb10 [label=T]; + condMethodbb7 -> condMethodbb10; + condMethodbb10 -> "condMethodbb-2"; + } + subgraph doWhileMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "doWhileMethodbb-1" [label=e, + shape=circle, + xlabel=doWhileMethod]; + doWhileMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]; + "doWhileMethodbb-1" -> doWhileMethodbb0; + "doWhileMethodbb-2" [label=x, + shape=circle]; + doWhileMethodbb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 2|8: ILOAD 1|9: IADD |10: ISTORE 2|11: // label|\ +12: // line number information|13: IINC 1 -1|14: // label|15: // line number information|16: ILOAD 1|17: IFGT 4}"]; + doWhileMethodbb0 -> doWhileMethodbb4; + doWhileMethodbb4 -> doWhileMethodbb4 [label=T]; + doWhileMethodbb18 [label="18|{18: // label|19: // line number information|20: ILOAD 2|21: IRETURN }"]; + doWhileMethodbb4 -> doWhileMethodbb18; + doWhileMethodbb18 -> "doWhileMethodbb-2"; + } + subgraph doWhileTrue { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "doWhileTruebb-1" [label=e, + shape=circle, + xlabel=doWhileTrue]; + doWhileTruebb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: // label|5: // line number information|6: \ +GOTO 0}"]; + "doWhileTruebb-1" -> doWhileTruebb0; + "doWhileTruebb-2" [label=e, + shape=circle, + xlabel=doWhileTrue]; + doWhileTruebb0 -> doWhileTruebb0 [label=T]; + } + subgraph emptyMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "emptyMethodbb-1" [label=e, + shape=circle, + xlabel=emptyMethod]; + emptyMethodbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"]; + "emptyMethodbb-1" -> emptyMethodbb0; + "emptyMethodbb-2" [label=x, + shape=circle]; + emptyMethodbb0 -> "emptyMethodbb-2"; + } + subgraph fieldReadMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "fieldReadMethodbb-1" [label=e, + shape=circle, + xlabel=fieldReadMethod]; + fieldReadMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: GETFIELD ExampleClass.field Ljava/lang/String;|4: ARETURN }"]; + "fieldReadMethodbb-1" -> fieldReadMethodbb0; + "fieldReadMethodbb-2" [label=x, + shape=circle]; + fieldReadMethodbb0 -> "fieldReadMethodbb-2"; + } + subgraph fieldWriteMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + "fieldWriteMethodbb-1" [label=e, + shape=circle, + xlabel=fieldWriteMethod]; + fieldWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: ALOAD 1|4: PUTFIELD ExampleClass.field Ljava/lang/String;|5: // label|\ +6: // line number information|7: RETURN }"]; + "fieldWriteMethodbb-1" -> fieldWriteMethodbb0; + "fieldWriteMethodbb-2" [label=x, + shape=circle]; + fieldWriteMethodbb0 -> "fieldWriteMethodbb-2"; + } + subgraph forEachArrayMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forEachArrayMethodbb-1" [label=e, + shape=circle, + xlabel=forEachArrayMethod]; + forEachArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: \ +ASTORE 3|8: ALOAD 3|9: ARRAYLENGTH |10: ISTORE 4|11: ICONST_0 |12: ISTORE 5}"]; + "forEachArrayMethodbb-1" -> forEachArrayMethodbb0; + "forEachArrayMethodbb-2" [label=x, + shape=circle]; + forEachArrayMethodbb13 [label="13|{13: // label|14: // stack frame map|15: ILOAD 5|16: ILOAD 4|17: IF_ICMPGE 29}"]; + forEachArrayMethodbb0 -> forEachArrayMethodbb13; + forEachArrayMethodbb18 [label="18|{18: ALOAD 3|19: ILOAD 5|20: AALOAD |21: ASTORE 6|22: // label|23: // line number information|24: IINC 2 1|25: // label|26: // \ +line number information|27: IINC 5 1|28: GOTO 13}"]; + forEachArrayMethodbb13 -> forEachArrayMethodbb18; + forEachArrayMethodbb29 [label="29|{29: // label|30: // line number information|31: // stack frame map|32: ILOAD 2|33: IRETURN }"]; + forEachArrayMethodbb13 -> forEachArrayMethodbb29 [label=T]; + forEachArrayMethodbb18 -> forEachArrayMethodbb13 [label=T]; + forEachArrayMethodbb29 -> "forEachArrayMethodbb-2"; + } + subgraph forEachCollectionMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forEachCollectionMethodbb-1" [label=e, + shape=circle, + xlabel=forEachCollectionMethod]; + forEachCollectionMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: \ +INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;|8: ASTORE 3}"]; + "forEachCollectionMethodbb-1" -> forEachCollectionMethodbb0; + "forEachCollectionMethodbb-2" [label=x, + shape=circle]; + forEachCollectionMethodbb9 [label="9|{9: // label|10: // stack frame map|11: ALOAD 3|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z|13: IFEQ 24}"]; + forEachCollectionMethodbb0 -> forEachCollectionMethodbb9; + forEachCollectionMethodbb14 [label="14|{14: ALOAD 3|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;|16: CHECKCAST java/lang/String|17: ASTORE 4|18: // \ +label|19: // line number information|20: IINC 2 1|21: // label|22: // line number information|23: GOTO 9}"]; + forEachCollectionMethodbb9 -> forEachCollectionMethodbb14; + forEachCollectionMethodbb24 [label="24|{24: // label|25: // line number information|26: // stack frame map|27: ILOAD 2|28: IRETURN }"]; + forEachCollectionMethodbb9 -> forEachCollectionMethodbb24 [label=T]; + forEachCollectionMethodbb14 -> forEachCollectionMethodbb9 [label=T]; + forEachCollectionMethodbb24 -> "forEachCollectionMethodbb-2"; + } + subgraph ifMethod { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "ifMethodbb-1" [label=e, + shape=circle, + xlabel=ifMethod]; + ifMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \ +IFGE 12}"]; + "ifMethodbb-1" -> ifMethodbb0; + "ifMethodbb-2" [label=x, + shape=circle]; + ifMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: ISTORE 2}"]; + ifMethodbb0 -> ifMethodbb8; + ifMethodbb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ILOAD 2|16: IRETURN }"]; + ifMethodbb0 -> ifMethodbb12 [label=T]; + ifMethodbb8 -> ifMethodbb12; + ifMethodbb12 -> "ifMethodbb-2"; + } + subgraph init { + node [label="\N", + shape=record, + xlabel="" + ]; + "initbb-1" [label=e, + shape=circle, + xlabel=init]; + initbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: INVOKESPECIAL java/lang/Object. ()V|4: RETURN }"]; + "initbb-1" -> initbb0; + "initbb-2" [label=x, + shape=circle]; + initbb0 -> "initbb-2"; + } + subgraph forEver { + node [label="\N", + shape=record, + xlabel="" + ]; + edge [label=""]; + "forEverbb-1" [label=e, + shape=circle, + xlabel=forEver]; + forEverbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]; + "forEverbb-1" -> forEverbb0; + "forEverbb-2" [label=e, + shape=circle, + xlabel=forEver]; + forEverbb4 [label="4|{4: // label|5: // stack frame map|6: IINC 2 1|7: GOTO 4}"]; + forEverbb0 -> forEverbb4; + forEverbb4 -> forEverbb4 [label=T]; + } +} diff --git a/test-output/all.cfg.pdf b/test-output/all.cfg.pdf new file mode 100644 index 0000000..c4bf8f7 Binary files /dev/null and b/test-output/all.cfg.pdf differ diff --git a/test-output/all.combined.dot b/test-output/all.combined.dot new file mode 100644 index 0000000..f4e5be2 --- /dev/null +++ b/test-output/all.combined.dot @@ -0,0 +1,1206 @@ +digraph root { + node [label="\N"]; + subgraph combined { + graph [label=""]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + -1 [label="-1|entry", + shape=record, + style=filled]; + 0 [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: INVOKESPECIAL java/lang/Object. ()V\l|4: RETURN \l}", + shape=record]; + -1 -> 0; + -1 -> 0 [style=dotted]; + -2 [label="-2|exit", + shape=record]; + 0 -> -2; + 0 -> -2 [style=dotted]; + } + subgraph combined_gv40 { + graph [label=switchMethod2]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv40" [label="-1|entry", + shape=record, + style=filled]; + "0_gv40" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ILOAD 1\l|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26\l}", + shape=record]; + "-1_gv40" -> "0_gv40"; + "-1_gv40" -> "0_gv40" [style=dotted]; + "-2_gv40" [label="-2|exit", + shape=record]; + "8_gv8" [label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}", + shape=record]; + "0_gv40" -> "8_gv8" [label=0]; + "0_gv40" -> "8_gv8" [style=dotted]; + "14_gv2" [label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}", + shape=record]; + "0_gv40" -> "14_gv2" [label=1000]; + "0_gv40" -> "14_gv2" [style=dotted]; + "20_gv2" [label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}", + shape=record]; + "0_gv40" -> "20_gv2" [label=2000]; + "0_gv40" -> "20_gv2" [style=dotted]; + "26_gv1" [label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}", + shape=record]; + "0_gv40" -> "26_gv1" [label=default]; + "0_gv40" -> "26_gv1" [style=dotted]; + "31_gv1" [label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}", + shape=record]; + "0_gv40" -> "31_gv1" [style=dotted]; + "8_gv8" -> "31_gv1" [label=T]; + "14_gv2" -> "31_gv1" [label=T]; + "20_gv2" -> "31_gv1" [label=T]; + "26_gv1" -> "31_gv1"; + "31_gv1" -> "-2_gv40"; + "31_gv1" -> "-2_gv40" [style=dotted]; + } + subgraph combined_gv41 { + graph [label=whileMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv41" [label="-1|entry", + shape=record, + style=filled]; + "0_gv41" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}", + shape=record]; + "-1_gv41" -> "0_gv41"; + "-1_gv41" -> "0_gv41" [style=dotted]; + "-2_gv41" [label="-2|exit", + shape=record]; + "4_gv2" [label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 1\l|8: IFLE 19\l}", + shape=record]; + "0_gv41" -> "4_gv2"; + "0_gv41" -> "4_gv2" [style=dotted]; + "9_gv1" [label="9|{9: // label\l|10: // line number information\l|11: ILOAD 2\l|12: ILOAD 1\l|13: IADD \l|14: ISTORE 2\l|15: // label\l|16: // \ +line number information\l|17: IINC 1 -1\l|18: GOTO 4\l}", + shape=record]; + "4_gv2" -> "9_gv1"; + "4_gv2" -> "9_gv1" [style=dotted]; + 19 [label="19|{19: // label\l|20: // line number information\l|21: // stack frame map\l|22: ILOAD 2\l|23: IRETURN \l}", + shape=record]; + "4_gv2" -> 19 [label=T]; + "4_gv2" -> 19 [style=dotted]; + "9_gv1" -> "4_gv2" [label=T]; + 19 -> "-2_gv41"; + 19 -> "-2_gv41" [style=dotted]; + } + subgraph combined_gv42 { + graph [label=whileTrueMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv42" [label="-1|entry", + shape=record, + style=filled]; + "0_gv42" [label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: GOTO 0\l}", + shape=record]; + "-1_gv42" -> "0_gv42"; + "-1_gv42" -> "0_gv42" [style=dotted]; + "-2_gv42" [label="-2|exit", + shape=record]; + "0_gv42" -> "0_gv42" [label=T]; + } + subgraph combined_gv5 { + graph [label=allocAndInitObjectArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv5" [label="-1|entry", + shape=record, + style=filled]; + "0_gv5" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY java/lang/Object\l|4: DUP \l|5: ICONST_0 \l|6: LDC \ +1\l|7: AASTORE \l|8: DUP \l|9: ICONST_1 \l|10: LDC 2\l|11: AASTORE \l|12: ARETURN \l}", + shape=record]; + "-1_gv5" -> "0_gv5"; + "-1_gv5" -> "0_gv5" [style=dotted]; + "-2_gv5" [label="-2|exit", + shape=record]; + "0_gv5" -> "-2_gv5"; + "0_gv5" -> "-2_gv5" [style=dotted]; + } + subgraph combined_gv6 { + graph [label=allocIncomplete2dArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv6" [label="-1|entry", + shape=record, + style=filled]; + "0_gv6" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY [I\l|4: ARETURN \l}", + shape=record]; + "-1_gv6" -> "0_gv6"; + "-1_gv6" -> "0_gv6" [style=dotted]; + "-2_gv6" [label="-2|exit", + shape=record]; + "0_gv6" -> "-2_gv6"; + "0_gv6" -> "-2_gv6" [style=dotted]; + } + subgraph combined_gv7 { + graph [label=allocIntArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv7" [label="-1|entry", + shape=record, + style=filled]; + "0_gv7" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: NEWARRAY T_INT\l|4: ARETURN \l}", + shape=record]; + "-1_gv7" -> "0_gv7"; + "-1_gv7" -> "0_gv7" [style=dotted]; + "-2_gv7" [label="-2|exit", + shape=record]; + "0_gv7" -> "-2_gv7"; + "0_gv7" -> "-2_gv7" [style=dotted]; + } + subgraph combined_gv8 { + graph [label=allocObjectArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv8" [label="-1|entry", + shape=record, + style=filled]; + "0_gv8" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: ANEWARRAY java/lang/Object\l|4: ARETURN \l}", + shape=record]; + "-1_gv8" -> "0_gv8"; + "-1_gv8" -> "0_gv8" [style=dotted]; + "-2_gv8" [label="-2|exit", + shape=record]; + "0_gv8" -> "-2_gv8"; + "0_gv8" -> "-2_gv8" [style=dotted]; + } + subgraph combined_gv9 { + graph [label=allocObjectMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv9" [label="-1|entry", + shape=record, + style=filled]; + "0_gv9" [label="0|{0: // label\l|1: // line number information\l|2: NEW java/lang/Object\l|3: DUP \l|4: INVOKESPECIAL java/lang/Object. ()\ +V\l|5: ARETURN \l}", + shape=record]; + "-1_gv9" -> "0_gv9"; + "-1_gv9" -> "0_gv9" [style=dotted]; + "-2_gv9" [label="-2|exit", + shape=record]; + "0_gv9" -> "-2_gv9"; + "0_gv9" -> "-2_gv9" [style=dotted]; + } + subgraph combined_gv10 { + graph [label=arrayLengthMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv10" [label="-1|entry", + shape=record, + style=filled]; + "0_gv10" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ARRAYLENGTH \l|4: IRETURN \l}", + shape=record]; + "-1_gv10" -> "0_gv10"; + "-1_gv10" -> "0_gv10" [style=dotted]; + "-2_gv10" [label="-2|exit", + shape=record]; + "0_gv10" -> "-2_gv10"; + "0_gv10" -> "-2_gv10" [style=dotted]; + } + subgraph combined_gv11 { + graph [label=arrayReadMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv11" [label="-1|entry", + shape=record, + style=filled]; + "0_gv11" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: AALOAD \l|5: ARETURN \l}", + shape=record]; + "-1_gv11" -> "0_gv11"; + "-1_gv11" -> "0_gv11" [style=dotted]; + "-2_gv11" [label="-2|exit", + shape=record]; + "0_gv11" -> "-2_gv11"; + "0_gv11" -> "-2_gv11" [style=dotted]; + } + subgraph combined_gv12 { + graph [label=arrayWriteMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv12" [label="-1|entry", + shape=record, + style=filled]; + "0_gv12" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: ALOAD 2\l|5: AASTORE \l|6: // label\l|7: // \ +line number information\l|8: RETURN \l}", + shape=record]; + "-1_gv12" -> "0_gv12"; + "-1_gv12" -> "0_gv12" [style=dotted]; + "-2_gv12" [label="-2|exit", + shape=record]; + "0_gv12" -> "-2_gv12"; + "0_gv12" -> "-2_gv12" [style=dotted]; + } + subgraph combined_gv13 { + graph [label=condMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv13" [label="-1|entry", + shape=record, + style=filled]; + "0_gv13" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}", + shape=record]; + "-1_gv13" -> "0_gv13"; + "-1_gv13" -> "0_gv13" [style=dotted]; + "-2_gv13" [label="-2|exit", + shape=record]; + 5 [label="5|{5: ILOAD 1\l|6: GOTO 10\l}", + shape=record]; + "0_gv13" -> 5; + "0_gv13" -> 5 [style=dotted]; + 7 [label="7|{7: // label\l|8: // stack frame map\l|9: ILOAD 2\l}", + shape=record]; + "0_gv13" -> 7 [label=T]; + "0_gv13" -> 7 [style=dotted]; + 10 [label="10|{10: // label\l|11: // stack frame map\l|12: IRETURN \l}", + shape=record]; + "0_gv13" -> 10 [style=dotted]; + 5 -> 10 [label=T]; + 7 -> 10; + 10 -> "-2_gv13"; + 10 -> "-2_gv13" [style=dotted]; + } + subgraph combined_gv14 { + graph [label=doWhileMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv14" [label="-1|entry", + shape=record, + style=filled]; + "0_gv14" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}", + shape=record]; + "-1_gv14" -> "0_gv14"; + "-1_gv14" -> "0_gv14" [style=dotted]; + "-2_gv14" [label="-2|exit", + shape=record]; + 4 [label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 2\l|8: ILOAD 1\l|9: IADD \l|10: ISTORE 2\l|\ +11: // label\l|12: // line number information\l|13: IINC 1 -1\l|14: // label\l|15: // line number information\l|16: ILOAD 1\l|\ +17: IFGT 4\l}", + shape=record]; + "0_gv14" -> 4; + "0_gv14" -> 4 [style=dotted]; + 4 -> 4 [label=T]; + 18 [label="18|{18: // label\l|19: // line number information\l|20: ILOAD 2\l|21: IRETURN \l}", + shape=record]; + 4 -> 18; + 4 -> 18 [style=dotted]; + 18 -> "-2_gv14"; + 18 -> "-2_gv14" [style=dotted]; + } + subgraph combined_gv15 { + graph [label=doWhileTrue]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv15" [label="-1|entry", + shape=record, + style=filled]; + "0_gv15" [label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: // label\l|5: // line number information\l|\ +6: GOTO 0\l}", + shape=record]; + "-1_gv15" -> "0_gv15"; + "-1_gv15" -> "0_gv15" [style=dotted]; + "-2_gv15" [label="-2|exit", + shape=record]; + "0_gv15" -> "0_gv15" [label=T]; + } + subgraph combined_gv16 { + graph [label=emptyMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv16" [label="-1|entry", + shape=record, + style=filled]; + "0_gv16" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}", + shape=record]; + "-1_gv16" -> "0_gv16"; + "-1_gv16" -> "0_gv16" [style=dotted]; + "-2_gv16" [label="-2|exit", + shape=record]; + "0_gv16" -> "-2_gv16"; + "0_gv16" -> "-2_gv16" [style=dotted]; + } + subgraph combined_gv17 { + graph [label=fieldReadMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv17" [label="-1|entry", + shape=record, + style=filled]; + "0_gv17" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: GETFIELD ExampleClass.field Ljava/lang/String;\l|4: ARETURN \l}", + shape=record]; + "-1_gv17" -> "0_gv17"; + "-1_gv17" -> "0_gv17" [style=dotted]; + "-2_gv17" [label="-2|exit", + shape=record]; + "0_gv17" -> "-2_gv17"; + "0_gv17" -> "-2_gv17" [style=dotted]; + } + subgraph combined_gv18 { + graph [label=fieldWriteMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv18" [label="-1|entry", + shape=record, + style=filled]; + "0_gv18" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: ALOAD 1\l|4: PUTFIELD ExampleClass.field Ljava/lang/String;\l|\ +5: // label\l|6: // line number information\l|7: RETURN \l}", + shape=record]; + "-1_gv18" -> "0_gv18"; + "-1_gv18" -> "0_gv18" [style=dotted]; + "-2_gv18" [label="-2|exit", + shape=record]; + "0_gv18" -> "-2_gv18"; + "0_gv18" -> "-2_gv18" [style=dotted]; + } + subgraph combined_gv19 { + graph [label=forEachArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv19" [label="-1|entry", + shape=record, + style=filled]; + "0_gv19" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ALOAD 1\l|7: ASTORE 3\l|8: ALOAD 3\l|9: ARRAYLENGTH \l|10: ISTORE 4\l|11: ICONST_0 \l|12: ISTORE 5\l}", + shape=record]; + "-1_gv19" -> "0_gv19"; + "-1_gv19" -> "0_gv19" [style=dotted]; + "-2_gv19" [label="-2|exit", + shape=record]; + 13 [label="13|{13: // label\l|14: // stack frame map\l|15: ILOAD 5\l|16: ILOAD 4\l|17: IF_ICMPGE 29\l}", + shape=record]; + "0_gv19" -> 13; + "0_gv19" -> 13 [style=dotted]; + "18_gv1" [label="18|{18: ALOAD 3\l|19: ILOAD 5\l|20: AALOAD \l|21: ASTORE 6\l|22: // label\l|23: // line number information\l|24: IINC 2 1\l|25: // \ +label\l|26: // line number information\l|27: IINC 5 1\l|28: GOTO 13\l}", + shape=record]; + 13 -> "18_gv1"; + 13 -> "18_gv1" [style=dotted]; + 29 [label="29|{29: // label\l|30: // line number information\l|31: // stack frame map\l|32: ILOAD 2\l|33: IRETURN \l}", + shape=record]; + 13 -> 29 [label=T]; + 13 -> 29 [style=dotted]; + "18_gv1" -> 13 [label=T]; + 29 -> "-2_gv19"; + 29 -> "-2_gv19" [style=dotted]; + } + subgraph combined_gv20 { + graph [label=forEachCollectionMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv20" [label="-1|entry", + shape=record, + style=filled]; + "0_gv20" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ALOAD 1\l|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;\l|8: ASTORE 3\l}", + shape=record]; + "-1_gv20" -> "0_gv20"; + "-1_gv20" -> "0_gv20" [style=dotted]; + "-2_gv20" [label="-2|exit", + shape=record]; + 9 [label="9|{9: // label\l|10: // stack frame map\l|11: ALOAD 3\l|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z\l|13: IFEQ 24\l}", + shape=record]; + "0_gv20" -> 9; + "0_gv20" -> 9 [style=dotted]; + 14 [label="14|{14: ALOAD 3\l|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;\l|16: CHECKCAST java/lang/String\l|17: ASTORE \ +4\l|18: // label\l|19: // line number information\l|20: IINC 2 1\l|21: // label\l|22: // line number information\l|23: GOTO \ +9\l}", + shape=record]; + 9 -> 14; + 9 -> 14 [style=dotted]; + 24 [label="24|{24: // label\l|25: // line number information\l|26: // stack frame map\l|27: ILOAD 2\l|28: IRETURN \l}", + shape=record]; + 9 -> 24 [label=T]; + 9 -> 24 [style=dotted]; + 14 -> 9 [label=T]; + 24 -> "-2_gv20"; + 24 -> "-2_gv20" [style=dotted]; + } + subgraph combined_gv21 { + graph [label=forEver]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv21" [label="-1|entry", + shape=record, + style=filled]; + "0_gv21" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}", + shape=record]; + "-1_gv21" -> "0_gv21"; + "-1_gv21" -> "0_gv21" [style=dotted]; + "-2_gv21" [label="-2|exit", + shape=record]; + "4_gv1" [label="4|{4: // label\l|5: // stack frame map\l|6: IINC 2 1\l|7: GOTO 4\l}", + shape=record]; + "0_gv21" -> "4_gv1"; + "0_gv21" -> "4_gv1" [style=dotted]; + "4_gv1" -> "4_gv1" [label=T]; + } + subgraph combined_gv22 { + graph [label=forMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv22" [label="-1|entry", + shape=record, + style=filled]; + "0_gv22" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ICONST_0 \l|7: ISTORE 3\l}", + shape=record]; + "-1_gv22" -> "0_gv22"; + "-1_gv22" -> "0_gv22" [style=dotted]; + "-2_gv22" [label="-2|exit", + shape=record]; + 8 [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 23\l}", + shape=record]; + "0_gv22" -> 8; + "0_gv22" -> 8 [style=dotted]; + "13_gv1" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 2\l|16: ILOAD 3\l|17: IADD \l|18: ISTORE 2\l|19: // label\l|20: // \ +line number information\l|21: IINC 1 1\l|22: GOTO 8\l}", + shape=record]; + 8 -> "13_gv1"; + 8 -> "13_gv1" [style=dotted]; + 23 [label="23|{23: // label\l|24: // line number information\l|25: // stack frame map\l|26: ILOAD 2\l|27: IRETURN \l}", + shape=record]; + 8 -> 23 [label=T]; + 8 -> 23 [style=dotted]; + "13_gv1" -> 8 [label=T]; + 23 -> "-2_gv22"; + 23 -> "-2_gv22" [style=dotted]; + } + subgraph combined_gv23 { + graph [label=forWithBreakMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv23" [label="-1|entry", + shape=record, + style=filled]; + "0_gv23" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ICONST_0 \l|7: ISTORE 3\l}", + shape=record]; + "-1_gv23" -> "0_gv23"; + "-1_gv23" -> "0_gv23" [style=dotted]; + "-2_gv23" [label="-2|exit", + shape=record]; + "8_gv1" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 32\l}", + shape=record]; + "0_gv23" -> "8_gv1"; + "0_gv23" -> "8_gv1" [style=dotted]; + "13_gv2" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}", + shape=record]; + "8_gv1" -> "13_gv2"; + "8_gv1" -> "13_gv2" [style=dotted]; + 32 [label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: ILOAD 2\l|36: IRETURN \l}", + shape=record]; + "8_gv1" -> 32 [label=T]; + "8_gv1" -> 32 [style=dotted]; + "18_gv2" [label="18|{18: // label\l|19: // line number information\l|20: GOTO 32\l}", + shape=record]; + "13_gv2" -> "18_gv2"; + "13_gv2" -> "18_gv2" [style=dotted]; + 21 [label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE \ +2\l|28: // label\l|29: // line number information\l|30: IINC 3 1\l|31: GOTO 8\l}", + shape=record]; + "13_gv2" -> 21 [label=T]; + "13_gv2" -> 21 [style=dotted]; + "18_gv2" -> 32 [label=T]; + 21 -> "8_gv1" [label=T]; + 32 -> "-2_gv23"; + 32 -> "-2_gv23" [style=dotted]; + } + subgraph combined_gv24 { + graph [label=forWithContinueMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv24" [label="-1|entry", + shape=record, + style=filled]; + "0_gv24" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ICONST_0 \l|7: ISTORE 3\l}", + shape=record]; + "-1_gv24" -> "0_gv24"; + "-1_gv24" -> "0_gv24" [style=dotted]; + "-2_gv24" [label="-2|exit", + shape=record]; + "8_gv2" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 33\l}", + shape=record]; + "0_gv24" -> "8_gv2"; + "0_gv24" -> "8_gv2" [style=dotted]; + "13_gv3" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}", + shape=record]; + "8_gv2" -> "13_gv3"; + "8_gv2" -> "13_gv3" [style=dotted]; + 33 [label="33|{33: // label\l|34: // line number information\l|35: // stack frame map\l|36: ILOAD 2\l|37: IRETURN \l}", + shape=record]; + "8_gv2" -> 33 [label=T]; + "8_gv2" -> 33 [style=dotted]; + "18_gv3" [label="18|{18: // label\l|19: // line number information\l|20: GOTO 28\l}", + shape=record]; + "13_gv3" -> "18_gv3"; + "13_gv3" -> "18_gv3" [style=dotted]; + "21_gv1" [label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE \ +2\l}", + shape=record]; + "13_gv3" -> "21_gv1" [label=T]; + "13_gv3" -> "21_gv1" [style=dotted]; + 28 [label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: IINC 3 1\l|32: GOTO 8\l}", + shape=record]; + "13_gv3" -> 28 [style=dotted]; + "18_gv3" -> 28 [label=T]; + "21_gv1" -> 28; + 28 -> "8_gv2" [label=T]; + 33 -> "-2_gv24"; + 33 -> "-2_gv24" [style=dotted]; + } + subgraph combined_gv25 { + graph [label=ifElseMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv25" [label="-1|entry", + shape=record, + style=filled]; + "0_gv25" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ILOAD 1\l|7: IFLE 13\l}", + shape=record]; + "-1_gv25" -> "0_gv25"; + "-1_gv25" -> "0_gv25" [style=dotted]; + "-2_gv25" [label="-2|exit", + shape=record]; + "8_gv3" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_0 \l|11: ISTORE 2\l|12: GOTO 18\l}", + shape=record]; + "0_gv25" -> "8_gv3"; + "0_gv25" -> "8_gv3" [style=dotted]; + "13_gv4" [label="13|{13: // label\l|14: // line number information\l|15: // stack frame map\l|16: ILOAD 1\l|17: ISTORE 2\l}", + shape=record]; + "0_gv25" -> "13_gv4" [label=T]; + "0_gv25" -> "13_gv4" [style=dotted]; + "18_gv4" [label="18|{18: // label\l|19: // line number information\l|20: // stack frame map\l|21: ILOAD 2\l|22: IRETURN \l}", + shape=record]; + "0_gv25" -> "18_gv4" [style=dotted]; + "8_gv3" -> "18_gv4" [label=T]; + "13_gv4" -> "18_gv4"; + "18_gv4" -> "-2_gv25"; + "18_gv4" -> "-2_gv25" [style=dotted]; + } + subgraph combined_gv26 { + graph [label=ifMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv26" [label="-1|entry", + shape=record, + style=filled]; + "0_gv26" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ILOAD 1\l|7: IFGE 12\l}", + shape=record]; + "-1_gv26" -> "0_gv26"; + "-1_gv26" -> "0_gv26" [style=dotted]; + "-2_gv26" [label="-2|exit", + shape=record]; + "8_gv4" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: ISTORE 2\l}", + shape=record]; + "0_gv26" -> "8_gv4"; + "0_gv26" -> "8_gv4" [style=dotted]; + 12 [label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ILOAD 2\l|16: IRETURN \l}", + shape=record]; + "0_gv26" -> 12 [label=T]; + "0_gv26" -> 12 [style=dotted]; + "8_gv4" -> 12; + 12 -> "-2_gv26"; + 12 -> "-2_gv26" [style=dotted]; + } + subgraph combined_gv27 { + graph [label=instanceCallMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv27" [label="-1|entry", + shape=record, + style=filled]; + "0_gv27" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V\l|4: // label\l|\ +5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}", + shape=record]; + "-1_gv27" -> "0_gv27"; + "-1_gv27" -> "0_gv27" [style=dotted]; + "-2_gv27" [label="-2|exit", + shape=record]; + "0_gv27" -> "-2_gv27"; + "0_gv27" -> "-2_gv27" [style=dotted]; + } + subgraph combined_gv28 { + graph [label=instanceCallTarget]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv28" [label="-1|entry", + shape=record, + style=filled]; + "0_gv28" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}", + shape=record]; + "-1_gv28" -> "0_gv28"; + "-1_gv28" -> "0_gv28" [style=dotted]; + "-2_gv28" [label="-2|exit", + shape=record]; + "0_gv28" -> "-2_gv28"; + "0_gv28" -> "-2_gv28" [style=dotted]; + } + subgraph combined_gv29 { + graph [label=interfaceCallMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv29" [label="-1|entry", + shape=record, + style=filled]; + "0_gv29" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()\ +V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}", + shape=record]; + "-1_gv29" -> "0_gv29"; + "-1_gv29" -> "0_gv29" [style=dotted]; + "-2_gv29" [label="-2|exit", + shape=record]; + "0_gv29" -> "-2_gv29"; + "0_gv29" -> "-2_gv29" [style=dotted]; + } + subgraph combined_gv30 { + graph [label=nestedFor]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv30" [label="-1|entry", + shape=record, + style=filled]; + "0_gv30" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ICONST_0 \l|7: ISTORE 3\l}", + shape=record]; + "-1_gv30" -> "0_gv30"; + "-1_gv30" -> "0_gv30" [style=dotted]; + "-2_gv30" [label="-2|exit", + shape=record]; + "8_gv5" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 37\l}", + shape=record]; + "0_gv30" -> "8_gv5"; + "0_gv30" -> "8_gv5" [style=dotted]; + "13_gv5" [label="13|{13: // label\l|14: // line number information\l|15: ICONST_0 \l|16: ISTORE 4\l}", + shape=record]; + "8_gv5" -> "13_gv5"; + "8_gv5" -> "13_gv5" [style=dotted]; + 37 [label="37|{37: // label\l|38: // line number information\l|39: // stack frame map\l|40: ILOAD 2\l|41: IRETURN \l}", + shape=record]; + "8_gv5" -> 37 [label=T]; + "8_gv5" -> 37 [style=dotted]; + 17 [label="17|{17: // label\l|18: // stack frame map\l|19: ILOAD 4\l|20: ILOAD 3\l|21: IF_ICMPGE 32\l}", + shape=record]; + "13_gv5" -> 17; + "13_gv5" -> 17 [style=dotted]; + 22 [label="22|{22: // label\l|23: // line number information\l|24: ILOAD 2\l|25: ILOAD 4\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // \ +line number information\l|30: IINC 4 1\l|31: GOTO 17\l}", + shape=record]; + 17 -> 22; + 17 -> 22 [style=dotted]; + "32_gv1" [label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: IINC 3 1\l|36: GOTO 8\l}", + shape=record]; + 17 -> "32_gv1" [label=T]; + 17 -> "32_gv1" [style=dotted]; + 22 -> 17 [label=T]; + "32_gv1" -> "8_gv5" [label=T]; + 37 -> "-2_gv30"; + 37 -> "-2_gv30" [style=dotted]; + } + subgraph combined_gv31 { + graph [label=nonShortCircuitMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv31" [label="-1|entry", + shape=record, + style=filled]; + "0_gv31" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}", + shape=record]; + "-1_gv31" -> "0_gv31"; + "-1_gv31" -> "0_gv31" [style=dotted]; + "-2_gv31" [label="-2|exit", + shape=record]; + "5_gv1" [label="5|{5: ICONST_1 \l|6: GOTO 10\l}", + shape=record]; + "0_gv31" -> "5_gv1"; + "0_gv31" -> "5_gv1" [style=dotted]; + "7_gv1" [label="7|{7: // label\l|8: // stack frame map\l|9: ICONST_0 \l}", + shape=record]; + "0_gv31" -> "7_gv1" [label=T]; + "0_gv31" -> "7_gv1" [style=dotted]; + "10_gv1" [label="10|{10: // label\l|11: // stack frame map\l|12: ILOAD 1\l|13: ILOAD 3\l|14: IF_ICMPGE 17\l}", + shape=record]; + "0_gv31" -> "10_gv1" [style=dotted]; + "5_gv1" -> "10_gv1" [label=T]; + "7_gv1" -> "10_gv1"; + 15 [label="15|{15: ICONST_1 \l|16: GOTO 20\l}", + shape=record]; + "10_gv1" -> 15; + "10_gv1" -> 15 [style=dotted]; + "17_gv1" [label="17|{17: // label\l|18: // stack frame map\l|19: ICONST_0 \l}", + shape=record]; + "10_gv1" -> "17_gv1" [label=T]; + "10_gv1" -> "17_gv1" [style=dotted]; + 20 [label="20|{20: // label\l|21: // stack frame map\l|22: IAND \l|23: IFEQ 28\l}", + shape=record]; + "10_gv1" -> 20 [style=dotted]; + 15 -> 20 [label=T]; + "17_gv1" -> 20; + 20 -> "-2_gv31" [style=dotted]; + "24_gv1" [label="24|{24: // label\l|25: // line number information\l|26: ICONST_1 \l|27: IRETURN \l}", + shape=record]; + 20 -> "24_gv1"; + 20 -> "24_gv1" [style=dotted]; + "28_gv1" [label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: ICONST_0 \l|32: IRETURN \l}", + shape=record]; + 20 -> "28_gv1" [label=T]; + 20 -> "28_gv1" [style=dotted]; + "24_gv1" -> "-2_gv31"; + "24_gv1" -> "28_gv1"; + "28_gv1" -> "-2_gv31"; + } + subgraph combined_gv32 { + graph [label=privateInstanceCallMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv32" [label="-1|entry", + shape=record, + style=filled]; + "0_gv32" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V\l|4: // \ +label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}", + shape=record]; + "-1_gv32" -> "0_gv32"; + "-1_gv32" -> "0_gv32" [style=dotted]; + "-2_gv32" [label="-2|exit", + shape=record]; + "0_gv32" -> "-2_gv32"; + "0_gv32" -> "-2_gv32" [style=dotted]; + } + subgraph combined_gv33 { + graph [label=privateInstanceCallTarget]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv33" [label="-1|entry", + shape=record, + style=filled]; + "0_gv33" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}", + shape=record]; + "-1_gv33" -> "0_gv33"; + "-1_gv33" -> "0_gv33" [style=dotted]; + "-2_gv33" [label="-2|exit", + shape=record]; + "0_gv33" -> "-2_gv33"; + "0_gv33" -> "-2_gv33" [style=dotted]; + } + subgraph combined_gv34 { + graph [label=shortCircuitMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv34" [label="-1|entry", + shape=record, + style=filled]; + "0_gv34" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 12\l}", + shape=record]; + "-1_gv34" -> "0_gv34"; + "-1_gv34" -> "0_gv34" [style=dotted]; + "-2_gv34" [label="-2|exit", + shape=record]; + "0_gv34" -> "-2_gv34" [style=dotted]; + "5_gv2" [label="5|{5: ILOAD 1\l|6: ILOAD 3\l|7: IF_ICMPGE 12\l}", + shape=record]; + "0_gv34" -> "5_gv2"; + "0_gv34" -> "5_gv2" [style=dotted]; + "12_gv1" [label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ICONST_0 \l|16: IRETURN \l}", + shape=record]; + "0_gv34" -> "12_gv1" [label=T]; + "0_gv34" -> "12_gv1" [style=dotted]; + "8_gv6" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: IRETURN \l}", + shape=record]; + "5_gv2" -> "8_gv6"; + "5_gv2" -> "8_gv6" [style=dotted]; + "5_gv2" -> "12_gv1" [label=T]; + "8_gv6" -> "-2_gv34"; + "8_gv6" -> "12_gv1"; + "12_gv1" -> "-2_gv34"; + } + subgraph combined_gv35 { + graph [label=staticCallMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv35" [label="-1|entry", + shape=record, + style=filled]; + "0_gv35" [label="0|{0: // label\l|1: // line number information\l|2: INVOKESTATIC ExampleClass.staticCallTarget ()V\l|3: // label\l|4: // line \ +number information\l|5: ICONST_2 \l|6: IRETURN \l}", + shape=record]; + "-1_gv35" -> "0_gv35"; + "-1_gv35" -> "0_gv35" [style=dotted]; + "-2_gv35" [label="-2|exit", + shape=record]; + "0_gv35" -> "-2_gv35"; + "0_gv35" -> "-2_gv35" [style=dotted]; + } + subgraph combined_gv36 { + graph [label=staticCallTarget]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv36" [label="-1|entry", + shape=record, + style=filled]; + "0_gv36" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}", + shape=record]; + "-1_gv36" -> "0_gv36"; + "-1_gv36" -> "0_gv36" [style=dotted]; + "-2_gv36" [label="-2|exit", + shape=record]; + "0_gv36" -> "-2_gv36"; + "0_gv36" -> "-2_gv36" [style=dotted]; + } + subgraph combined_gv37 { + graph [label=staticFieldReadMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv37" [label="-1|entry", + shape=record, + style=filled]; + "0_gv37" [label="0|{0: // label\l|1: // line number information\l|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;\l|3: ARETURN \l}", + shape=record]; + "-1_gv37" -> "0_gv37"; + "-1_gv37" -> "0_gv37" [style=dotted]; + "-2_gv37" [label="-2|exit", + shape=record]; + "0_gv37" -> "-2_gv37"; + "0_gv37" -> "-2_gv37" [style=dotted]; + } + subgraph combined_gv38 { + graph [label=staticFieldWriteMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv38" [label="-1|entry", + shape=record, + style=filled]; + "0_gv38" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;\l|4: // \ +label\l|5: // line number information\l|6: RETURN \l}", + shape=record]; + "-1_gv38" -> "0_gv38"; + "-1_gv38" -> "0_gv38" [style=dotted]; + "-2_gv38" [label="-2|exit", + shape=record]; + "0_gv38" -> "-2_gv38"; + "0_gv38" -> "-2_gv38" [style=dotted]; + } + subgraph combined_gv39 { + graph [label=switchMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv39" [label="-1|entry", + shape=record, + style=filled]; + "0_gv39" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\ +6: ILOAD 1\l|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26\l}", + shape=record]; + "-1_gv39" -> "0_gv39"; + "-1_gv39" -> "0_gv39" [style=dotted]; + "-2_gv39" [label="-2|exit", + shape=record]; + "8_gv7" [label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}", + shape=record]; + "0_gv39" -> "8_gv7" [label=0]; + "0_gv39" -> "8_gv7" [style=dotted]; + "14_gv1" [label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}", + shape=record]; + "0_gv39" -> "14_gv1" [label=1]; + "0_gv39" -> "14_gv1" [style=dotted]; + "20_gv1" [label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}", + shape=record]; + "0_gv39" -> "20_gv1" [label=2]; + "0_gv39" -> "20_gv1" [style=dotted]; + 26 [label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}", + shape=record]; + "0_gv39" -> 26 [label=default]; + "0_gv39" -> 26 [style=dotted]; + 31 [label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}", + shape=record]; + "0_gv39" -> 31 [style=dotted]; + "8_gv7" -> 31 [label=T]; + "14_gv1" -> 31 [label=T]; + "20_gv1" -> 31 [label=T]; + 26 -> 31; + 31 -> "-2_gv39"; + 31 -> "-2_gv39" [style=dotted]; + } + subgraph combined_gv1 { + graph [label=alloc2Of3dArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv1" [label="-1|entry", + shape=record, + style=filled]; + "0_gv1" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[[I 2\l|5: ARETURN \l}", + shape=record]; + "-1_gv1" -> "0_gv1"; + "-1_gv1" -> "0_gv1" [style=dotted]; + "-2_gv1" [label="-2|exit", + shape=record]; + "0_gv1" -> "-2_gv1"; + "0_gv1" -> "-2_gv1" [style=dotted]; + } + subgraph combined_gv2 { + graph [label=alloc2dArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv2" [label="-1|entry", + shape=record, + style=filled]; + "0_gv2" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[I 2\l|5: ARETURN \l}", + shape=record]; + "-1_gv2" -> "0_gv2"; + "-1_gv2" -> "0_gv2" [style=dotted]; + "-2_gv2" [label="-2|exit", + shape=record]; + "0_gv2" -> "-2_gv2"; + "0_gv2" -> "-2_gv2" [style=dotted]; + } + subgraph combined_gv3 { + graph [label=allocAndInit2dArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv3" [label="-1|entry", + shape=record, + style=filled]; + "0_gv3" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_1 \l|3: ANEWARRAY [I\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: NEWARRAY \ +T_INT\l|8: DUP \l|9: ICONST_0 \l|10: ICONST_1 \l|11: IASTORE \l|12: AASTORE \l|13: ARETURN \l}", + shape=record]; + "-1_gv3" -> "0_gv3"; + "-1_gv3" -> "0_gv3" [style=dotted]; + "-2_gv3" [label="-2|exit", + shape=record]; + "0_gv3" -> "-2_gv3"; + "0_gv3" -> "-2_gv3" [style=dotted]; + } + subgraph combined_gv4 { + graph [label=allocAndInitIntArrayMethod]; + node [label="\N", + shape="", + style="" + ]; + edge [label="", + style="" + ]; + "-1_gv4" [label="-1|entry", + shape=record, + style=filled]; + "0_gv4" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: NEWARRAY T_INT\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: \ +IASTORE \l|8: DUP \l|9: ICONST_1 \l|10: ICONST_2 \l|11: IASTORE \l|12: ARETURN \l}", + shape=record]; + "-1_gv4" -> "0_gv4"; + "-1_gv4" -> "0_gv4" [style=dotted]; + "-2_gv4" [label="-2|exit", + shape=record]; + "0_gv4" -> "-2_gv4"; + "0_gv4" -> "-2_gv4" [style=dotted]; + } +} diff --git a/test-output/all.combined.pdf b/test-output/all.combined.pdf new file mode 100644 index 0000000..c106b8a Binary files /dev/null and b/test-output/all.combined.pdf differ diff --git a/test-output/all.dt.dot b/test-output/all.dt.dot new file mode 100644 index 0000000..a4f0ee1 --- /dev/null +++ b/test-output/all.dt.dot @@ -0,0 +1,448 @@ +digraph root { + node [label="\N"]; + subgraph dominatorTree_gv5 { + graph [label=allocAndInitObjectArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv5" [style=filled]; + "D(-1)_gv5" -> "D(0)_gv5"; + "D(0)_gv5" -> "D(-2)_gv5"; + } + subgraph dominatorTree_gv6 { + graph [label=allocIncomplete2dArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv6" [style=filled]; + "D(-1)_gv6" -> "D(0)_gv6"; + "D(0)_gv6" -> "D(-2)_gv6"; + } + subgraph dominatorTree_gv7 { + graph [label=allocIntArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv7" [style=filled]; + "D(-1)_gv7" -> "D(0)_gv7"; + "D(0)_gv7" -> "D(-2)_gv7"; + } + subgraph dominatorTree_gv8 { + graph [label=allocObjectArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv8" [style=filled]; + "D(-1)_gv8" -> "D(0)_gv8"; + "D(0)_gv8" -> "D(-2)_gv8"; + } + subgraph dominatorTree_gv9 { + graph [label=allocObjectMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv9" [style=filled]; + "D(-1)_gv9" -> "D(0)_gv9"; + "D(0)_gv9" -> "D(-2)_gv9"; + } + subgraph dominatorTree_gv10 { + graph [label=arrayLengthMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv10" [style=filled]; + "D(-1)_gv10" -> "D(0)_gv10"; + "D(0)_gv10" -> "D(-2)_gv10"; + } + subgraph dominatorTree_gv11 { + graph [label=arrayReadMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv11" [style=filled]; + "D(-1)_gv11" -> "D(0)_gv11"; + "D(0)_gv11" -> "D(-2)_gv11"; + } + subgraph dominatorTree_gv12 { + graph [label=arrayWriteMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv12" [style=filled]; + "D(-1)_gv12" -> "D(0)_gv12"; + "D(0)_gv12" -> "D(-2)_gv12"; + } + subgraph dominatorTree_gv13 { + graph [label=condMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv13" [style=filled]; + "D(-1)_gv13" -> "D(0)_gv13"; + "D(0)_gv13" -> "D(7)"; + "D(0)_gv13" -> "D(10)"; + "D(0)_gv13" -> "D(5)"; + "D(10)" -> "D(-2)_gv13"; + } + subgraph dominatorTree_gv14 { + graph [label=doWhileMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv14" [style=filled]; + "D(-1)_gv14" -> "D(0)_gv14"; + "D(0)_gv14" -> "D(4)"; + "D(18)" -> "D(-2)_gv14"; + "D(4)" -> "D(18)"; + } + subgraph dominatorTree_gv15 { + graph [label=doWhileTrue]; + node [label="\N", + style="" + ]; + "D(-1)_gv15" [style=filled]; + "D(-1)_gv15" -> "D(0)_gv15"; + } + subgraph dominatorTree_gv16 { + graph [label=emptyMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv16" [style=filled]; + "D(-1)_gv16" -> "D(0)_gv16"; + "D(0)_gv16" -> "D(-2)_gv15"; + } + subgraph dominatorTree_gv17 { + graph [label=fieldReadMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv17" [style=filled]; + "D(-1)_gv17" -> "D(0)_gv17"; + "D(0)_gv17" -> "D(-2)_gv16"; + } + subgraph dominatorTree_gv18 { + graph [label=fieldWriteMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv18" [style=filled]; + "D(-1)_gv18" -> "D(0)_gv18"; + "D(0)_gv18" -> "D(-2)_gv17"; + } + subgraph dominatorTree_gv19 { + graph [label=forEachArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv19" [style=filled]; + "D(-1)_gv19" -> "D(0)_gv19"; + "D(13)" -> "D(29)"; + "D(13)" -> "D(18)_gv1"; + "D(29)" -> "D(-2)_gv18"; + "D(0)_gv19" -> "D(13)"; + } + subgraph dominatorTree_gv20 { + graph [label=forEachCollectionMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv20" [style=filled]; + "D(-1)_gv20" -> "D(0)_gv20"; + "D(9)" -> "D(14)"; + "D(9)" -> "D(24)"; + "D(0)_gv20" -> "D(9)"; + "D(24)" -> "D(-2)_gv19"; + } + subgraph dominatorTree_gv21 { + graph [label=forEver]; + node [label="\N", + style="" + ]; + "D(-1)_gv21" [style=filled]; + "D(-1)_gv21" -> "D(0)_gv21"; + "D(0)_gv21" -> "D(4)_gv1"; + } + subgraph dominatorTree_gv22 { + graph [label=forMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv22" [style=filled]; + "D(-1)_gv22" -> "D(0)_gv22"; + "D(0)_gv22" -> "D(8)"; + "D(8)" -> "D(23)"; + "D(8)" -> "D(13)_gv1"; + "D(23)" -> "D(-2)_gv20"; + } + subgraph dominatorTree_gv23 { + graph [label=forWithBreakMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv23" [style=filled]; + "D(-1)_gv23" -> "D(0)_gv23"; + "D(0)_gv23" -> "D(8)_gv1"; + "D(32)" -> "D(-2)_gv21"; + "D(13)_gv2" -> "D(21)"; + "D(13)_gv2" -> "D(18)_gv2"; + "D(8)_gv1" -> "D(32)"; + "D(8)_gv1" -> "D(13)_gv2"; + } + subgraph dominatorTree_gv24 { + graph [label=forWithContinueMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv24" [style=filled]; + "D(-1)_gv24" -> "D(0)_gv24"; + "D(33)" -> "D(-2)_gv22"; + "D(8)_gv2" -> "D(33)"; + "D(8)_gv2" -> "D(13)_gv3"; + "D(13)_gv3" -> "D(21)_gv1"; + "D(13)_gv3" -> "D(18)_gv3"; + "D(13)_gv3" -> "D(28)"; + "D(0)_gv24" -> "D(8)_gv2"; + } + subgraph dominatorTree_gv25 { + graph [label=ifElseMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv25" [style=filled]; + "D(-1)_gv25" -> "D(0)_gv25"; + "D(0)_gv25" -> "D(13)_gv4"; + "D(0)_gv25" -> "D(18)_gv4"; + "D(0)_gv25" -> "D(8)_gv3"; + "D(18)_gv4" -> "D(-2)_gv23"; + } + subgraph dominatorTree_gv26 { + graph [label=ifMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv26" [style=filled]; + "D(-1)_gv26" -> "D(0)_gv26"; + "D(0)_gv26" -> "D(8)_gv4"; + "D(0)_gv26" -> "D(12)"; + "D(12)" -> "D(-2)_gv24"; + } + subgraph dominatorTree_gv27 { + graph [label=instanceCallMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv27" [style=filled]; + "D(-1)_gv27" -> "D(0)_gv27"; + "D(0)_gv27" -> "D(-2)_gv25"; + } + subgraph dominatorTree_gv28 { + graph [label=instanceCallTarget]; + node [label="\N", + style="" + ]; + "D(-1)_gv28" [style=filled]; + "D(-1)_gv28" -> "D(0)_gv28"; + "D(0)_gv28" -> "D(-2)_gv26"; + } + subgraph dominatorTree_gv29 { + graph [label=interfaceCallMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv29" [style=filled]; + "D(-1)_gv29" -> "D(0)_gv29"; + "D(0)_gv29" -> "D(-2)_gv27"; + } + subgraph dominatorTree_gv30 { + graph [label=nestedFor]; + node [label="\N", + style="" + ]; + "D(-1)_gv30" [style=filled]; + "D(-1)_gv30" -> "D(0)_gv30"; + "D(17)" -> "D(32)_gv1"; + "D(17)" -> "D(22)"; + "D(0)_gv30" -> "D(8)_gv5"; + "D(8)_gv5" -> "D(13)_gv5"; + "D(8)_gv5" -> "D(37)"; + "D(13)_gv5" -> "D(17)"; + "D(37)" -> "D(-2)_gv28"; + } + subgraph dominatorTree_gv31 { + graph [label=nonShortCircuitMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv31" [style=filled]; + "D(-1)_gv31" -> "D(0)_gv31"; + "D(10)_gv1" -> "D(20)"; + "D(10)_gv1" -> "D(17)_gv1"; + "D(10)_gv1" -> "D(15)"; + "D(20)" -> "D(-2)_gv29"; + "D(20)" -> "D(28)_gv1"; + "D(20)" -> "D(24)_gv1"; + "D(0)_gv31" -> "D(10)_gv1"; + "D(0)_gv31" -> "D(7)_gv1"; + "D(0)_gv31" -> "D(5)_gv1"; + } + subgraph dominatorTree_gv32 { + graph [label=privateInstanceCallMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv32" [style=filled]; + "D(-1)_gv32" -> "D(0)_gv32"; + "D(0)_gv32" -> "D(-2)_gv30"; + } + subgraph dominatorTree_gv33 { + graph [label=privateInstanceCallTarget]; + node [label="\N", + style="" + ]; + "D(-1)_gv33" [style=filled]; + "D(-1)_gv33" -> "D(0)_gv33"; + "D(0)_gv33" -> "D(-2)_gv31"; + } + subgraph dominatorTree_gv34 { + graph [label=shortCircuitMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv34" [style=filled]; + "D(-1)_gv34" -> "D(0)_gv34"; + "D(0)_gv34" -> "D(5)_gv2"; + "D(0)_gv34" -> "D(12)_gv1"; + "D(0)_gv34" -> "D(-2)_gv32"; + "D(5)_gv2" -> "D(8)_gv6"; + } + subgraph dominatorTree_gv35 { + graph [label=staticCallMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv35" [style=filled]; + "D(-1)_gv35" -> "D(0)_gv35"; + "D(0)_gv35" -> "D(-2)_gv33"; + } + subgraph dominatorTree_gv36 { + graph [label=staticCallTarget]; + node [label="\N", + style="" + ]; + "D(-1)_gv36" [style=filled]; + "D(-1)_gv36" -> "D(0)_gv36"; + "D(0)_gv36" -> "D(-2)_gv34"; + } + subgraph dominatorTree_gv37 { + graph [label=staticFieldReadMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv37" [style=filled]; + "D(-1)_gv37" -> "D(0)_gv37"; + "D(0)_gv37" -> "D(-2)_gv35"; + } + subgraph dominatorTree_gv38 { + graph [label=staticFieldWriteMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv38" [style=filled]; + "D(-1)_gv38" -> "D(0)_gv38"; + "D(0)_gv38" -> "D(-2)_gv36"; + } + subgraph dominatorTree_gv39 { + graph [label=switchMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv39" [style=filled]; + "D(-1)_gv39" -> "D(0)_gv39"; + "D(31)" -> "D(-2)_gv37"; + "D(0)_gv39" -> "D(31)"; + "D(0)_gv39" -> "D(26)"; + "D(0)_gv39" -> "D(8)_gv7"; + "D(0)_gv39" -> "D(20)_gv1"; + "D(0)_gv39" -> "D(14)_gv1"; + } + subgraph dominatorTree_gv40 { + graph [label=switchMethod2]; + node [label="\N", + style="" + ]; + "D(-1)_gv40" [style=filled]; + "D(-1)_gv40" -> "D(0)_gv40"; + "D(0)_gv40" -> "D(31)_gv1"; + "D(0)_gv40" -> "D(8)_gv8"; + "D(0)_gv40" -> "D(14)_gv2"; + "D(0)_gv40" -> "D(20)_gv2"; + "D(0)_gv40" -> "D(26)_gv1"; + "D(31)_gv1" -> "D(-2)_gv38"; + } + subgraph dominatorTree_gv41 { + graph [label=whileMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv41" [style=filled]; + "D(-1)_gv41" -> "D(0)_gv41"; + "D(0)_gv41" -> "D(4)_gv2"; + "D(4)_gv2" -> "D(19)"; + "D(4)_gv2" -> "D(9)_gv1"; + "D(19)" -> "D(-2)_gv39"; + } + subgraph dominatorTree_gv42 { + graph [label=whileTrueMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv42" [style=filled]; + "D(-1)_gv42" -> "D(0)_gv42"; + } + subgraph dominatorTree { + graph [label=""]; + node [label="\N", + style="" + ]; + "D(-1)" [style=filled]; + "D(-1)" -> "D(0)"; + "D(0)" -> "D(-2)"; + } + subgraph dominatorTree_gv1 { + graph [label=alloc2Of3dArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv1" [style=filled]; + "D(-1)_gv1" -> "D(0)_gv1"; + "D(0)_gv1" -> "D(-2)_gv1"; + } + subgraph dominatorTree_gv2 { + graph [label=alloc2dArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv2" [style=filled]; + "D(-1)_gv2" -> "D(0)_gv2"; + "D(0)_gv2" -> "D(-2)_gv2"; + } + subgraph dominatorTree_gv3 { + graph [label=allocAndInit2dArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv3" [style=filled]; + "D(-1)_gv3" -> "D(0)_gv3"; + "D(0)_gv3" -> "D(-2)_gv3"; + } + subgraph dominatorTree_gv4 { + graph [label=allocAndInitIntArrayMethod]; + node [label="\N", + style="" + ]; + "D(-1)_gv4" [style=filled]; + "D(-1)_gv4" -> "D(0)_gv4"; + "D(0)_gv4" -> "D(-2)_gv4"; + } +} diff --git a/test-output/all.dt.pdf b/test-output/all.dt.pdf new file mode 100644 index 0000000..86a3d89 Binary files /dev/null and b/test-output/all.dt.pdf differ diff --git a/test-output/alloc2Of3dArrayMethod.asm.txt b/test-output/alloc2Of3dArrayMethod.asm.txt new file mode 100644 index 0000000..a6e5c9e --- /dev/null +++ b/test-output/alloc2Of3dArrayMethod.asm.txt @@ -0,0 +1,7 @@ + Method: alloc2Of3dArrayMethod()[[[I + 0: // label + 1: // line number information + 2: ICONST_2 + 3: ICONST_3 + 4: MULTIANEWARRAY [[[I 2 + 5: ARETURN diff --git a/test-output/alloc2Of3dArrayMethod.cfg.dot b/test-output/alloc2Of3dArrayMethod.cfg.dot new file mode 100644 index 0000000..31add51 --- /dev/null +++ b/test-output/alloc2Of3dArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph alloc2Of3dArrayMethod { + + node [shape=record] + "alloc2Of3dArrayMethodbb-1" [shape=circle,label="e",xlabel="alloc2Of3dArrayMethod"] + "alloc2Of3dArrayMethodbb-2" [shape=circle,label="x"] + "alloc2Of3dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[[I 2|5: ARETURN }"] + + "alloc2Of3dArrayMethodbb-1" -> "alloc2Of3dArrayMethodbb0" + "alloc2Of3dArrayMethodbb0" -> "alloc2Of3dArrayMethodbb-2" +} diff --git a/test-output/alloc2Of3dArrayMethod.combined.dot b/test-output/alloc2Of3dArrayMethod.combined.dot new file mode 100644 index 0000000..38f7fe4 --- /dev/null +++ b/test-output/alloc2Of3dArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="alloc2Of3dArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[[I 2\l|5: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/alloc2Of3dArrayMethod.dt.dot b/test-output/alloc2Of3dArrayMethod.dt.dot new file mode 100644 index 0000000..e2c18a8 --- /dev/null +++ b/test-output/alloc2Of3dArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="alloc2Of3dArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/alloc2dArrayMethod.asm.txt b/test-output/alloc2dArrayMethod.asm.txt new file mode 100644 index 0000000..ecd98f2 --- /dev/null +++ b/test-output/alloc2dArrayMethod.asm.txt @@ -0,0 +1,7 @@ + Method: alloc2dArrayMethod()[[I + 0: // label + 1: // line number information + 2: ICONST_2 + 3: ICONST_3 + 4: MULTIANEWARRAY [[I 2 + 5: ARETURN diff --git a/test-output/alloc2dArrayMethod.cfg.dot b/test-output/alloc2dArrayMethod.cfg.dot new file mode 100644 index 0000000..820b1e8 --- /dev/null +++ b/test-output/alloc2dArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph alloc2dArrayMethod { + + node [shape=record] + "alloc2dArrayMethodbb-1" [shape=circle,label="e",xlabel="alloc2dArrayMethod"] + "alloc2dArrayMethodbb-2" [shape=circle,label="x"] + "alloc2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[I 2|5: ARETURN }"] + + "alloc2dArrayMethodbb-1" -> "alloc2dArrayMethodbb0" + "alloc2dArrayMethodbb0" -> "alloc2dArrayMethodbb-2" +} diff --git a/test-output/alloc2dArrayMethod.combined.dot b/test-output/alloc2dArrayMethod.combined.dot new file mode 100644 index 0000000..bb1d058 --- /dev/null +++ b/test-output/alloc2dArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="alloc2dArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[I 2\l|5: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/alloc2dArrayMethod.dt.dot b/test-output/alloc2dArrayMethod.dt.dot new file mode 100644 index 0000000..5ae18bb --- /dev/null +++ b/test-output/alloc2dArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="alloc2dArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/allocAndInit2dArrayMethod.asm.txt b/test-output/allocAndInit2dArrayMethod.asm.txt new file mode 100644 index 0000000..f595246 --- /dev/null +++ b/test-output/allocAndInit2dArrayMethod.asm.txt @@ -0,0 +1,15 @@ + Method: allocAndInit2dArrayMethod()[[I + 0: // label + 1: // line number information + 2: ICONST_1 + 3: ANEWARRAY [I + 4: DUP + 5: ICONST_0 + 6: ICONST_1 + 7: NEWARRAY T_INT + 8: DUP + 9: ICONST_0 + 10: ICONST_1 + 11: IASTORE + 12: AASTORE + 13: ARETURN diff --git a/test-output/allocAndInit2dArrayMethod.cfg.dot b/test-output/allocAndInit2dArrayMethod.cfg.dot new file mode 100644 index 0000000..28f2f55 --- /dev/null +++ b/test-output/allocAndInit2dArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocAndInit2dArrayMethod { + + node [shape=record] + "allocAndInit2dArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInit2dArrayMethod"] + "allocAndInit2dArrayMethodbb-2" [shape=circle,label="x"] + "allocAndInit2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_1 |3: ANEWARRAY [I|4: DUP |5: ICONST_0 |6: ICONST_1 |7: NEWARRAY T_INT|8: DUP |9: ICONST_0 |10: ICONST_1 |11: IASTORE |12: AASTORE |13: ARETURN }"] + + "allocAndInit2dArrayMethodbb-1" -> "allocAndInit2dArrayMethodbb0" + "allocAndInit2dArrayMethodbb0" -> "allocAndInit2dArrayMethodbb-2" +} diff --git a/test-output/allocAndInit2dArrayMethod.combined.dot b/test-output/allocAndInit2dArrayMethod.combined.dot new file mode 100644 index 0000000..d9798a5 --- /dev/null +++ b/test-output/allocAndInit2dArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocAndInit2dArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_1 \l|3: ANEWARRAY [I\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: NEWARRAY T_INT\l|8: DUP \l|9: ICONST_0 \l|10: ICONST_1 \l|11: IASTORE \l|12: AASTORE \l|13: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/allocAndInit2dArrayMethod.dt.dot b/test-output/allocAndInit2dArrayMethod.dt.dot new file mode 100644 index 0000000..95a5e19 --- /dev/null +++ b/test-output/allocAndInit2dArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocAndInit2dArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/allocAndInitIntArrayMethod.asm.txt b/test-output/allocAndInitIntArrayMethod.asm.txt new file mode 100644 index 0000000..2aecb79 --- /dev/null +++ b/test-output/allocAndInitIntArrayMethod.asm.txt @@ -0,0 +1,14 @@ + Method: allocAndInitIntArrayMethod()[I + 0: // label + 1: // line number information + 2: ICONST_2 + 3: NEWARRAY T_INT + 4: DUP + 5: ICONST_0 + 6: ICONST_1 + 7: IASTORE + 8: DUP + 9: ICONST_1 + 10: ICONST_2 + 11: IASTORE + 12: ARETURN diff --git a/test-output/allocAndInitIntArrayMethod.cfg.dot b/test-output/allocAndInitIntArrayMethod.cfg.dot new file mode 100644 index 0000000..2ddab58 --- /dev/null +++ b/test-output/allocAndInitIntArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocAndInitIntArrayMethod { + + node [shape=record] + "allocAndInitIntArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInitIntArrayMethod"] + "allocAndInitIntArrayMethodbb-2" [shape=circle,label="x"] + "allocAndInitIntArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: NEWARRAY T_INT|4: DUP |5: ICONST_0 |6: ICONST_1 |7: IASTORE |8: DUP |9: ICONST_1 |10: ICONST_2 |11: IASTORE |12: ARETURN }"] + + "allocAndInitIntArrayMethodbb-1" -> "allocAndInitIntArrayMethodbb0" + "allocAndInitIntArrayMethodbb0" -> "allocAndInitIntArrayMethodbb-2" +} diff --git a/test-output/allocAndInitIntArrayMethod.combined.dot b/test-output/allocAndInitIntArrayMethod.combined.dot new file mode 100644 index 0000000..58bcadc --- /dev/null +++ b/test-output/allocAndInitIntArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocAndInitIntArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: NEWARRAY T_INT\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: IASTORE \l|8: DUP \l|9: ICONST_1 \l|10: ICONST_2 \l|11: IASTORE \l|12: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/allocAndInitIntArrayMethod.dt.dot b/test-output/allocAndInitIntArrayMethod.dt.dot new file mode 100644 index 0000000..fce50fa --- /dev/null +++ b/test-output/allocAndInitIntArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocAndInitIntArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/allocAndInitObjectArrayMethod.asm.txt b/test-output/allocAndInitObjectArrayMethod.asm.txt new file mode 100644 index 0000000..0c2494d --- /dev/null +++ b/test-output/allocAndInitObjectArrayMethod.asm.txt @@ -0,0 +1,14 @@ + Method: allocAndInitObjectArrayMethod()[Ljava/lang/Object; + 0: // label + 1: // line number information + 2: ICONST_2 + 3: ANEWARRAY java/lang/Object + 4: DUP + 5: ICONST_0 + 6: LDC 1 + 7: AASTORE + 8: DUP + 9: ICONST_1 + 10: LDC 2 + 11: AASTORE + 12: ARETURN diff --git a/test-output/allocAndInitObjectArrayMethod.cfg.dot b/test-output/allocAndInitObjectArrayMethod.cfg.dot new file mode 100644 index 0000000..ad2168e --- /dev/null +++ b/test-output/allocAndInitObjectArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocAndInitObjectArrayMethod { + + node [shape=record] + "allocAndInitObjectArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInitObjectArrayMethod"] + "allocAndInitObjectArrayMethodbb-2" [shape=circle,label="x"] + "allocAndInitObjectArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY java/lang/Object|4: DUP |5: ICONST_0 |6: LDC 1|7: AASTORE |8: DUP |9: ICONST_1 |10: LDC 2|11: AASTORE |12: ARETURN }"] + + "allocAndInitObjectArrayMethodbb-1" -> "allocAndInitObjectArrayMethodbb0" + "allocAndInitObjectArrayMethodbb0" -> "allocAndInitObjectArrayMethodbb-2" +} diff --git a/test-output/allocAndInitObjectArrayMethod.combined.dot b/test-output/allocAndInitObjectArrayMethod.combined.dot new file mode 100644 index 0000000..ba5fb60 --- /dev/null +++ b/test-output/allocAndInitObjectArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocAndInitObjectArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY java/lang/Object\l|4: DUP \l|5: ICONST_0 \l|6: LDC 1\l|7: AASTORE \l|8: DUP \l|9: ICONST_1 \l|10: LDC 2\l|11: AASTORE \l|12: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/allocAndInitObjectArrayMethod.dt.dot b/test-output/allocAndInitObjectArrayMethod.dt.dot new file mode 100644 index 0000000..d48d610 --- /dev/null +++ b/test-output/allocAndInitObjectArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocAndInitObjectArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/allocIncomplete2dArrayMethod.asm.txt b/test-output/allocIncomplete2dArrayMethod.asm.txt new file mode 100644 index 0000000..1c0d908 --- /dev/null +++ b/test-output/allocIncomplete2dArrayMethod.asm.txt @@ -0,0 +1,6 @@ + Method: allocIncomplete2dArrayMethod()[[I + 0: // label + 1: // line number information + 2: ICONST_2 + 3: ANEWARRAY [I + 4: ARETURN diff --git a/test-output/allocIncomplete2dArrayMethod.cfg.dot b/test-output/allocIncomplete2dArrayMethod.cfg.dot new file mode 100644 index 0000000..5e41532 --- /dev/null +++ b/test-output/allocIncomplete2dArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocIncomplete2dArrayMethod { + + node [shape=record] + "allocIncomplete2dArrayMethodbb-1" [shape=circle,label="e",xlabel="allocIncomplete2dArrayMethod"] + "allocIncomplete2dArrayMethodbb-2" [shape=circle,label="x"] + "allocIncomplete2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY [I|4: ARETURN }"] + + "allocIncomplete2dArrayMethodbb-1" -> "allocIncomplete2dArrayMethodbb0" + "allocIncomplete2dArrayMethodbb0" -> "allocIncomplete2dArrayMethodbb-2" +} diff --git a/test-output/allocIncomplete2dArrayMethod.combined.dot b/test-output/allocIncomplete2dArrayMethod.combined.dot new file mode 100644 index 0000000..04c1c06 --- /dev/null +++ b/test-output/allocIncomplete2dArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocIncomplete2dArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY [I\l|4: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/allocIncomplete2dArrayMethod.dt.dot b/test-output/allocIncomplete2dArrayMethod.dt.dot new file mode 100644 index 0000000..6a47a9b --- /dev/null +++ b/test-output/allocIncomplete2dArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocIncomplete2dArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/allocIntArrayMethod.asm.txt b/test-output/allocIntArrayMethod.asm.txt new file mode 100644 index 0000000..bca1cfe --- /dev/null +++ b/test-output/allocIntArrayMethod.asm.txt @@ -0,0 +1,6 @@ + Method: allocIntArrayMethod()[I + 0: // label + 1: // line number information + 2: ICONST_3 + 3: NEWARRAY T_INT + 4: ARETURN diff --git a/test-output/allocIntArrayMethod.cfg.dot b/test-output/allocIntArrayMethod.cfg.dot new file mode 100644 index 0000000..7b47fc6 --- /dev/null +++ b/test-output/allocIntArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocIntArrayMethod { + + node [shape=record] + "allocIntArrayMethodbb-1" [shape=circle,label="e",xlabel="allocIntArrayMethod"] + "allocIntArrayMethodbb-2" [shape=circle,label="x"] + "allocIntArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: NEWARRAY T_INT|4: ARETURN }"] + + "allocIntArrayMethodbb-1" -> "allocIntArrayMethodbb0" + "allocIntArrayMethodbb0" -> "allocIntArrayMethodbb-2" +} diff --git a/test-output/allocIntArrayMethod.combined.dot b/test-output/allocIntArrayMethod.combined.dot new file mode 100644 index 0000000..8997577 --- /dev/null +++ b/test-output/allocIntArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocIntArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: NEWARRAY T_INT\l|4: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/allocIntArrayMethod.dt.dot b/test-output/allocIntArrayMethod.dt.dot new file mode 100644 index 0000000..e0ef0ea --- /dev/null +++ b/test-output/allocIntArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocIntArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/allocObjectArrayMethod.asm.txt b/test-output/allocObjectArrayMethod.asm.txt new file mode 100644 index 0000000..a4bafb4 --- /dev/null +++ b/test-output/allocObjectArrayMethod.asm.txt @@ -0,0 +1,6 @@ + Method: allocObjectArrayMethod()[Ljava/lang/Object; + 0: // label + 1: // line number information + 2: ICONST_3 + 3: ANEWARRAY java/lang/Object + 4: ARETURN diff --git a/test-output/allocObjectArrayMethod.cfg.dot b/test-output/allocObjectArrayMethod.cfg.dot new file mode 100644 index 0000000..5e0cccf --- /dev/null +++ b/test-output/allocObjectArrayMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocObjectArrayMethod { + + node [shape=record] + "allocObjectArrayMethodbb-1" [shape=circle,label="e",xlabel="allocObjectArrayMethod"] + "allocObjectArrayMethodbb-2" [shape=circle,label="x"] + "allocObjectArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: ANEWARRAY java/lang/Object|4: ARETURN }"] + + "allocObjectArrayMethodbb-1" -> "allocObjectArrayMethodbb0" + "allocObjectArrayMethodbb0" -> "allocObjectArrayMethodbb-2" +} diff --git a/test-output/allocObjectArrayMethod.combined.dot b/test-output/allocObjectArrayMethod.combined.dot new file mode 100644 index 0000000..f4d4cd4 --- /dev/null +++ b/test-output/allocObjectArrayMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocObjectArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: ANEWARRAY java/lang/Object\l|4: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/allocObjectArrayMethod.dt.dot b/test-output/allocObjectArrayMethod.dt.dot new file mode 100644 index 0000000..4e25027 --- /dev/null +++ b/test-output/allocObjectArrayMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocObjectArrayMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/allocObjectMethod.asm.txt b/test-output/allocObjectMethod.asm.txt new file mode 100644 index 0000000..0279d95 --- /dev/null +++ b/test-output/allocObjectMethod.asm.txt @@ -0,0 +1,7 @@ + Method: allocObjectMethod()Ljava/lang/Object; + 0: // label + 1: // line number information + 2: NEW java/lang/Object + 3: DUP + 4: INVOKESPECIAL java/lang/Object. ()V + 5: ARETURN diff --git a/test-output/allocObjectMethod.cfg.dot b/test-output/allocObjectMethod.cfg.dot new file mode 100644 index 0000000..ef41508 --- /dev/null +++ b/test-output/allocObjectMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph allocObjectMethod { + + node [shape=record] + "allocObjectMethodbb-1" [shape=circle,label="e",xlabel="allocObjectMethod"] + "allocObjectMethodbb-2" [shape=circle,label="x"] + "allocObjectMethodbb0" [label="0|{0: // label|1: // line number information|2: NEW java/lang/Object|3: DUP |4: INVOKESPECIAL java/lang/Object. ()V|5: ARETURN }"] + + "allocObjectMethodbb-1" -> "allocObjectMethodbb0" + "allocObjectMethodbb0" -> "allocObjectMethodbb-2" +} diff --git a/test-output/allocObjectMethod.combined.dot b/test-output/allocObjectMethod.combined.dot new file mode 100644 index 0000000..b5f4db6 --- /dev/null +++ b/test-output/allocObjectMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="allocObjectMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: NEW java/lang/Object\l|3: DUP \l|4: INVOKESPECIAL java/lang/Object. ()V\l|5: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/allocObjectMethod.dt.dot b/test-output/allocObjectMethod.dt.dot new file mode 100644 index 0000000..b085169 --- /dev/null +++ b/test-output/allocObjectMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="allocObjectMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/arrayLengthMethod.asm.txt b/test-output/arrayLengthMethod.asm.txt new file mode 100644 index 0000000..108ea82 --- /dev/null +++ b/test-output/arrayLengthMethod.asm.txt @@ -0,0 +1,6 @@ + Method: arrayLengthMethod([Ljava/lang/String;)I + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: ARRAYLENGTH + 4: IRETURN diff --git a/test-output/arrayLengthMethod.cfg.dot b/test-output/arrayLengthMethod.cfg.dot new file mode 100644 index 0000000..d06a7bf --- /dev/null +++ b/test-output/arrayLengthMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph arrayLengthMethod { + + node [shape=record] + "arrayLengthMethodbb-1" [shape=circle,label="e",xlabel="arrayLengthMethod"] + "arrayLengthMethodbb-2" [shape=circle,label="x"] + "arrayLengthMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ARRAYLENGTH |4: IRETURN }"] + + "arrayLengthMethodbb-1" -> "arrayLengthMethodbb0" + "arrayLengthMethodbb0" -> "arrayLengthMethodbb-2" +} diff --git a/test-output/arrayLengthMethod.combined.dot b/test-output/arrayLengthMethod.combined.dot new file mode 100644 index 0000000..b2aaaa1 --- /dev/null +++ b/test-output/arrayLengthMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="arrayLengthMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ARRAYLENGTH \l|4: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/arrayLengthMethod.dt.dot b/test-output/arrayLengthMethod.dt.dot new file mode 100644 index 0000000..5cfb4c7 --- /dev/null +++ b/test-output/arrayLengthMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="arrayLengthMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/arrayReadMethod.asm.txt b/test-output/arrayReadMethod.asm.txt new file mode 100644 index 0000000..e008e22 --- /dev/null +++ b/test-output/arrayReadMethod.asm.txt @@ -0,0 +1,7 @@ + Method: arrayReadMethod([Ljava/lang/String;)Ljava/lang/String; + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: ICONST_0 + 4: AALOAD + 5: ARETURN diff --git a/test-output/arrayReadMethod.cfg.dot b/test-output/arrayReadMethod.cfg.dot new file mode 100644 index 0000000..7ca4ab0 --- /dev/null +++ b/test-output/arrayReadMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph arrayReadMethod { + + node [shape=record] + "arrayReadMethodbb-1" [shape=circle,label="e",xlabel="arrayReadMethod"] + "arrayReadMethodbb-2" [shape=circle,label="x"] + "arrayReadMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: AALOAD |5: ARETURN }"] + + "arrayReadMethodbb-1" -> "arrayReadMethodbb0" + "arrayReadMethodbb0" -> "arrayReadMethodbb-2" +} diff --git a/test-output/arrayReadMethod.combined.dot b/test-output/arrayReadMethod.combined.dot new file mode 100644 index 0000000..45fc2f8 --- /dev/null +++ b/test-output/arrayReadMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="arrayReadMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: AALOAD \l|5: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/arrayReadMethod.dt.dot b/test-output/arrayReadMethod.dt.dot new file mode 100644 index 0000000..618539c --- /dev/null +++ b/test-output/arrayReadMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="arrayReadMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/arrayWriteMethod.asm.txt b/test-output/arrayWriteMethod.asm.txt new file mode 100644 index 0000000..5b5d5ec --- /dev/null +++ b/test-output/arrayWriteMethod.asm.txt @@ -0,0 +1,10 @@ + Method: arrayWriteMethod([Ljava/lang/String;Ljava/lang/String;)V + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: ICONST_0 + 4: ALOAD 2 + 5: AASTORE + 6: // label + 7: // line number information + 8: RETURN diff --git a/test-output/arrayWriteMethod.cfg.dot b/test-output/arrayWriteMethod.cfg.dot new file mode 100644 index 0000000..cfc03b3 --- /dev/null +++ b/test-output/arrayWriteMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph arrayWriteMethod { + + node [shape=record] + "arrayWriteMethodbb-1" [shape=circle,label="e",xlabel="arrayWriteMethod"] + "arrayWriteMethodbb-2" [shape=circle,label="x"] + "arrayWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: ALOAD 2|5: AASTORE |6: // label|7: // line number information|8: RETURN }"] + + "arrayWriteMethodbb-1" -> "arrayWriteMethodbb0" + "arrayWriteMethodbb0" -> "arrayWriteMethodbb-2" +} diff --git a/test-output/arrayWriteMethod.combined.dot b/test-output/arrayWriteMethod.combined.dot new file mode 100644 index 0000000..c83b47f --- /dev/null +++ b/test-output/arrayWriteMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="arrayWriteMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: ALOAD 2\l|5: AASTORE \l|6: // label\l|7: // line number information\l|8: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/arrayWriteMethod.dt.dot b/test-output/arrayWriteMethod.dt.dot new file mode 100644 index 0000000..61b42aa --- /dev/null +++ b/test-output/arrayWriteMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="arrayWriteMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/condMethod.asm.txt b/test-output/condMethod.asm.txt new file mode 100644 index 0000000..9a8c290 --- /dev/null +++ b/test-output/condMethod.asm.txt @@ -0,0 +1,14 @@ + Method: condMethod(II)I + 0: // label + 1: // line number information + 2: ILOAD 1 + 3: ILOAD 2 + 4: IF_ICMPLE 7 + 5: ILOAD 1 + 6: GOTO 10 + 7: // label + 8: // stack frame map + 9: ILOAD 2 + 10: // label + 11: // stack frame map + 12: IRETURN diff --git a/test-output/condMethod.cfg.dot b/test-output/condMethod.cfg.dot new file mode 100644 index 0000000..6c7c15c --- /dev/null +++ b/test-output/condMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph condMethod { + + node [shape=record] + "condMethodbb-1" [shape=circle,label="e",xlabel="condMethod"] + "condMethodbb-2" [shape=circle,label="x"] + "condMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"] + "condMethodbb5" [label="5|{5: ILOAD 1|6: GOTO 10}"] + "condMethodbb7" [label="7|{7: // label|8: // stack frame map|9: ILOAD 2}"] + "condMethodbb10" [label="10|{10: // label|11: // stack frame map|12: IRETURN }"] + + "condMethodbb-1" -> "condMethodbb0" + "condMethodbb0" -> "condMethodbb5" + "condMethodbb7" -> "condMethodbb10" + "condMethodbb10" -> "condMethodbb-2" + "condMethodbb0" -> "condMethodbb7" [label="T"] + "condMethodbb5" -> "condMethodbb10" [label="T"] +} diff --git a/test-output/condMethod.combined.dot b/test-output/condMethod.combined.dot new file mode 100644 index 0000000..fa22f38 --- /dev/null +++ b/test-output/condMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="condMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}"] + 5 [shape=record,label="5|{5: ILOAD 1\l|6: GOTO 10\l}"] + 7 [shape=record,label="7|{7: // label\l|8: // stack frame map\l|9: ILOAD 2\l}"] + 10 [shape=record,label="10|{10: // label\l|11: // stack frame map\l|12: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 5 [label=""] + 7 -> 10 [label=""] + 10 -> -2 [label=""] + 0 -> 7 [label="T"] + 5 -> 10 [label="T"] + -1 -> 0 [style=dotted] + 0 -> 7 [style=dotted] + 10 -> -2 [style=dotted] + 0 -> 10 [style=dotted] + 0 -> 5 [style=dotted] +} diff --git a/test-output/condMethod.dt.dot b/test-output/condMethod.dt.dot new file mode 100644 index 0000000..84fa5b9 --- /dev/null +++ b/test-output/condMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="condMethod" + "D(-1)" [style=filled] + "D(0)" + "D(7)" + "D(10)" + "D(-2)" + "D(5)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(7)" + "D(10)" -> "D(-2)" + "D(0)" -> "D(10)" + "D(0)" -> "D(5)" +} diff --git a/test-output/doWhileMethod.asm.txt b/test-output/doWhileMethod.asm.txt new file mode 100644 index 0000000..7b4c1f0 --- /dev/null +++ b/test-output/doWhileMethod.asm.txt @@ -0,0 +1,23 @@ + Method: doWhileMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: // stack frame map + 7: ILOAD 2 + 8: ILOAD 1 + 9: IADD + 10: ISTORE 2 + 11: // label + 12: // line number information + 13: IINC 1 -1 + 14: // label + 15: // line number information + 16: ILOAD 1 + 17: IFGT 4 + 18: // label + 19: // line number information + 20: ILOAD 2 + 21: IRETURN diff --git a/test-output/doWhileMethod.cfg.dot b/test-output/doWhileMethod.cfg.dot new file mode 100644 index 0000000..142634e --- /dev/null +++ b/test-output/doWhileMethod.cfg.dot @@ -0,0 +1,15 @@ +digraph doWhileMethod { + + node [shape=record] + "doWhileMethodbb-1" [shape=circle,label="e",xlabel="doWhileMethod"] + "doWhileMethodbb-2" [shape=circle,label="x"] + "doWhileMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + "doWhileMethodbb4" [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 2|8: ILOAD 1|9: IADD |10: ISTORE 2|11: // label|12: // line number information|13: IINC 1 -1|14: // label|15: // line number information|16: ILOAD 1|17: IFGT 4}"] + "doWhileMethodbb18" [label="18|{18: // label|19: // line number information|20: ILOAD 2|21: IRETURN }"] + + "doWhileMethodbb-1" -> "doWhileMethodbb0" + "doWhileMethodbb0" -> "doWhileMethodbb4" + "doWhileMethodbb4" -> "doWhileMethodbb18" + "doWhileMethodbb18" -> "doWhileMethodbb-2" + "doWhileMethodbb4" -> "doWhileMethodbb4" [label="T"] +} diff --git a/test-output/doWhileMethod.combined.dot b/test-output/doWhileMethod.combined.dot new file mode 100644 index 0000000..34afc79 --- /dev/null +++ b/test-output/doWhileMethod.combined.dot @@ -0,0 +1,17 @@ +digraph combined { + label="doWhileMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"] + 4 [shape=record,label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 2\l|8: ILOAD 1\l|9: IADD \l|10: ISTORE 2\l|11: // label\l|12: // line number information\l|13: IINC 1 -1\l|14: // label\l|15: // line number information\l|16: ILOAD 1\l|17: IFGT 4\l}"] + 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: ILOAD 2\l|21: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 4 [label=""] + 4 -> 18 [label=""] + 18 -> -2 [label=""] + 4 -> 4 [label="T"] + -1 -> 0 [style=dotted] + 18 -> -2 [style=dotted] + 4 -> 18 [style=dotted] + 0 -> 4 [style=dotted] +} diff --git a/test-output/doWhileMethod.dt.dot b/test-output/doWhileMethod.dt.dot new file mode 100644 index 0000000..f81123b --- /dev/null +++ b/test-output/doWhileMethod.dt.dot @@ -0,0 +1,12 @@ +digraph dominatorTree { + label="doWhileMethod" + "D(-1)" [style=filled] + "D(0)" + "D(18)" + "D(-2)" + "D(4)" + "D(-1)" -> "D(0)" + "D(18)" -> "D(-2)" + "D(4)" -> "D(18)" + "D(0)" -> "D(4)" +} diff --git a/test-output/doWhileTrue.asm.txt b/test-output/doWhileTrue.asm.txt new file mode 100644 index 0000000..550fb01 --- /dev/null +++ b/test-output/doWhileTrue.asm.txt @@ -0,0 +1,8 @@ + Method: doWhileTrue(I)I + 0: // label + 1: // line number information + 2: // stack frame map + 3: IINC 1 1 + 4: // label + 5: // line number information + 6: GOTO 0 diff --git a/test-output/doWhileTrue.cfg.dot b/test-output/doWhileTrue.cfg.dot new file mode 100644 index 0000000..9f85345 --- /dev/null +++ b/test-output/doWhileTrue.cfg.dot @@ -0,0 +1,10 @@ +digraph doWhileTrue { + + node [shape=record] + "doWhileTruebb-1" [shape=circle,label="e",xlabel="doWhileTrue"] + "doWhileTruebb-2" [shape=circle,label="e",xlabel="doWhileTrue"] + "doWhileTruebb0" [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: // label|5: // line number information|6: GOTO 0}"] + + "doWhileTruebb-1" -> "doWhileTruebb0" + "doWhileTruebb0" -> "doWhileTruebb0" [label="T"] +} diff --git a/test-output/doWhileTrue.combined.dot b/test-output/doWhileTrue.combined.dot new file mode 100644 index 0000000..7d1a892 --- /dev/null +++ b/test-output/doWhileTrue.combined.dot @@ -0,0 +1,9 @@ +digraph combined { + label="doWhileTrue" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: // label\l|5: // line number information\l|6: GOTO 0\l}"] + -1 -> 0 [label=""] + 0 -> 0 [label="T"] + -1 -> 0 [style=dotted] +} diff --git a/test-output/doWhileTrue.dt.dot b/test-output/doWhileTrue.dt.dot new file mode 100644 index 0000000..38a2eaa --- /dev/null +++ b/test-output/doWhileTrue.dt.dot @@ -0,0 +1,6 @@ +digraph dominatorTree { + label="doWhileTrue" + "D(-1)" [style=filled] + "D(0)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/emptyMethod.asm.txt b/test-output/emptyMethod.asm.txt new file mode 100644 index 0000000..ecf326c --- /dev/null +++ b/test-output/emptyMethod.asm.txt @@ -0,0 +1,4 @@ + Method: emptyMethod()V + 0: // label + 1: // line number information + 2: RETURN diff --git a/test-output/emptyMethod.cfg.dot b/test-output/emptyMethod.cfg.dot new file mode 100644 index 0000000..2403d46 --- /dev/null +++ b/test-output/emptyMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph emptyMethod { + + node [shape=record] + "emptyMethodbb-1" [shape=circle,label="e",xlabel="emptyMethod"] + "emptyMethodbb-2" [shape=circle,label="x"] + "emptyMethodbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"] + + "emptyMethodbb-1" -> "emptyMethodbb0" + "emptyMethodbb0" -> "emptyMethodbb-2" +} diff --git a/test-output/emptyMethod.combined.dot b/test-output/emptyMethod.combined.dot new file mode 100644 index 0000000..7c744ad --- /dev/null +++ b/test-output/emptyMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="emptyMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/emptyMethod.dt.dot b/test-output/emptyMethod.dt.dot new file mode 100644 index 0000000..3735c46 --- /dev/null +++ b/test-output/emptyMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="emptyMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/fieldReadMethod.asm.txt b/test-output/fieldReadMethod.asm.txt new file mode 100644 index 0000000..5e0d7d3 --- /dev/null +++ b/test-output/fieldReadMethod.asm.txt @@ -0,0 +1,6 @@ + Method: fieldReadMethod()Ljava/lang/String; + 0: // label + 1: // line number information + 2: ALOAD 0 + 3: GETFIELD ExampleClass.field Ljava/lang/String; + 4: ARETURN diff --git a/test-output/fieldReadMethod.cfg.dot b/test-output/fieldReadMethod.cfg.dot new file mode 100644 index 0000000..3f5c7e3 --- /dev/null +++ b/test-output/fieldReadMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph fieldReadMethod { + + node [shape=record] + "fieldReadMethodbb-1" [shape=circle,label="e",xlabel="fieldReadMethod"] + "fieldReadMethodbb-2" [shape=circle,label="x"] + "fieldReadMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: GETFIELD ExampleClass.field Ljava/lang/String;|4: ARETURN }"] + + "fieldReadMethodbb-1" -> "fieldReadMethodbb0" + "fieldReadMethodbb0" -> "fieldReadMethodbb-2" +} diff --git a/test-output/fieldReadMethod.combined.dot b/test-output/fieldReadMethod.combined.dot new file mode 100644 index 0000000..4f954dd --- /dev/null +++ b/test-output/fieldReadMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="fieldReadMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: GETFIELD ExampleClass.field Ljava/lang/String;\l|4: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/fieldReadMethod.dt.dot b/test-output/fieldReadMethod.dt.dot new file mode 100644 index 0000000..fa471a7 --- /dev/null +++ b/test-output/fieldReadMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="fieldReadMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/fieldWriteMethod.asm.txt b/test-output/fieldWriteMethod.asm.txt new file mode 100644 index 0000000..55cca5b --- /dev/null +++ b/test-output/fieldWriteMethod.asm.txt @@ -0,0 +1,9 @@ + Method: fieldWriteMethod(Ljava/lang/String;)V + 0: // label + 1: // line number information + 2: ALOAD 0 + 3: ALOAD 1 + 4: PUTFIELD ExampleClass.field Ljava/lang/String; + 5: // label + 6: // line number information + 7: RETURN diff --git a/test-output/fieldWriteMethod.cfg.dot b/test-output/fieldWriteMethod.cfg.dot new file mode 100644 index 0000000..825e37f --- /dev/null +++ b/test-output/fieldWriteMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph fieldWriteMethod { + + node [shape=record] + "fieldWriteMethodbb-1" [shape=circle,label="e",xlabel="fieldWriteMethod"] + "fieldWriteMethodbb-2" [shape=circle,label="x"] + "fieldWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: ALOAD 1|4: PUTFIELD ExampleClass.field Ljava/lang/String;|5: // label|6: // line number information|7: RETURN }"] + + "fieldWriteMethodbb-1" -> "fieldWriteMethodbb0" + "fieldWriteMethodbb0" -> "fieldWriteMethodbb-2" +} diff --git a/test-output/fieldWriteMethod.combined.dot b/test-output/fieldWriteMethod.combined.dot new file mode 100644 index 0000000..1d39aad --- /dev/null +++ b/test-output/fieldWriteMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="fieldWriteMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: ALOAD 1\l|4: PUTFIELD ExampleClass.field Ljava/lang/String;\l|5: // label\l|6: // line number information\l|7: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/fieldWriteMethod.dt.dot b/test-output/fieldWriteMethod.dt.dot new file mode 100644 index 0000000..63d56f0 --- /dev/null +++ b/test-output/fieldWriteMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="fieldWriteMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/forEachArrayMethod.asm.txt b/test-output/forEachArrayMethod.asm.txt new file mode 100644 index 0000000..42d887c --- /dev/null +++ b/test-output/forEachArrayMethod.asm.txt @@ -0,0 +1,35 @@ + Method: forEachArrayMethod([Ljava/lang/String;)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ALOAD 1 + 7: ASTORE 3 + 8: ALOAD 3 + 9: ARRAYLENGTH + 10: ISTORE 4 + 11: ICONST_0 + 12: ISTORE 5 + 13: // label + 14: // stack frame map + 15: ILOAD 5 + 16: ILOAD 4 + 17: IF_ICMPGE 29 + 18: ALOAD 3 + 19: ILOAD 5 + 20: AALOAD + 21: ASTORE 6 + 22: // label + 23: // line number information + 24: IINC 2 1 + 25: // label + 26: // line number information + 27: IINC 5 1 + 28: GOTO 13 + 29: // label + 30: // line number information + 31: // stack frame map + 32: ILOAD 2 + 33: IRETURN diff --git a/test-output/forEachArrayMethod.cfg.dot b/test-output/forEachArrayMethod.cfg.dot new file mode 100644 index 0000000..585e66e --- /dev/null +++ b/test-output/forEachArrayMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph forEachArrayMethod { + + node [shape=record] + "forEachArrayMethodbb-1" [shape=circle,label="e",xlabel="forEachArrayMethod"] + "forEachArrayMethodbb-2" [shape=circle,label="x"] + "forEachArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: ASTORE 3|8: ALOAD 3|9: ARRAYLENGTH |10: ISTORE 4|11: ICONST_0 |12: ISTORE 5}"] + "forEachArrayMethodbb13" [label="13|{13: // label|14: // stack frame map|15: ILOAD 5|16: ILOAD 4|17: IF_ICMPGE 29}"] + "forEachArrayMethodbb18" [label="18|{18: ALOAD 3|19: ILOAD 5|20: AALOAD |21: ASTORE 6|22: // label|23: // line number information|24: IINC 2 1|25: // label|26: // line number information|27: IINC 5 1|28: GOTO 13}"] + "forEachArrayMethodbb29" [label="29|{29: // label|30: // line number information|31: // stack frame map|32: ILOAD 2|33: IRETURN }"] + + "forEachArrayMethodbb-1" -> "forEachArrayMethodbb0" + "forEachArrayMethodbb0" -> "forEachArrayMethodbb13" + "forEachArrayMethodbb13" -> "forEachArrayMethodbb18" + "forEachArrayMethodbb29" -> "forEachArrayMethodbb-2" + "forEachArrayMethodbb18" -> "forEachArrayMethodbb13" [label="T"] + "forEachArrayMethodbb13" -> "forEachArrayMethodbb29" [label="T"] +} diff --git a/test-output/forEachArrayMethod.combined.dot b/test-output/forEachArrayMethod.combined.dot new file mode 100644 index 0000000..92b0dbb --- /dev/null +++ b/test-output/forEachArrayMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="forEachArrayMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ALOAD 1\l|7: ASTORE 3\l|8: ALOAD 3\l|9: ARRAYLENGTH \l|10: ISTORE 4\l|11: ICONST_0 \l|12: ISTORE 5\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // stack frame map\l|15: ILOAD 5\l|16: ILOAD 4\l|17: IF_ICMPGE 29\l}"] + 18 [shape=record,label="18|{18: ALOAD 3\l|19: ILOAD 5\l|20: AALOAD \l|21: ASTORE 6\l|22: // label\l|23: // line number information\l|24: IINC 2 1\l|25: // label\l|26: // line number information\l|27: IINC 5 1\l|28: GOTO 13\l}"] + 29 [shape=record,label="29|{29: // label\l|30: // line number information\l|31: // stack frame map\l|32: ILOAD 2\l|33: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 13 [label=""] + 13 -> 18 [label=""] + 29 -> -2 [label=""] + 18 -> 13 [label="T"] + 13 -> 29 [label="T"] + 13 -> 29 [style=dotted] + 0 -> 13 [style=dotted] + 13 -> 18 [style=dotted] + 29 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/forEachArrayMethod.dt.dot b/test-output/forEachArrayMethod.dt.dot new file mode 100644 index 0000000..58c6ee5 --- /dev/null +++ b/test-output/forEachArrayMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="forEachArrayMethod" + "D(-1)" [style=filled] + "D(13)" + "D(29)" + "D(0)" + "D(18)" + "D(-2)" + "D(13)" -> "D(29)" + "D(0)" -> "D(13)" + "D(13)" -> "D(18)" + "D(29)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/forEachCollectionMethod.asm.txt b/test-output/forEachCollectionMethod.asm.txt new file mode 100644 index 0000000..ac1f8b8 --- /dev/null +++ b/test-output/forEachCollectionMethod.asm.txt @@ -0,0 +1,30 @@ + Method: forEachCollectionMethod(Ljava/util/Set;)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ALOAD 1 + 7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator; + 8: ASTORE 3 + 9: // label + 10: // stack frame map + 11: ALOAD 3 + 12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z + 13: IFEQ 24 + 14: ALOAD 3 + 15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object; + 16: CHECKCAST java/lang/String + 17: ASTORE 4 + 18: // label + 19: // line number information + 20: IINC 2 1 + 21: // label + 22: // line number information + 23: GOTO 9 + 24: // label + 25: // line number information + 26: // stack frame map + 27: ILOAD 2 + 28: IRETURN diff --git a/test-output/forEachCollectionMethod.cfg.dot b/test-output/forEachCollectionMethod.cfg.dot new file mode 100644 index 0000000..7c47b46 --- /dev/null +++ b/test-output/forEachCollectionMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph forEachCollectionMethod { + + node [shape=record] + "forEachCollectionMethodbb-1" [shape=circle,label="e",xlabel="forEachCollectionMethod"] + "forEachCollectionMethodbb-2" [shape=circle,label="x"] + "forEachCollectionMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;|8: ASTORE 3}"] + "forEachCollectionMethodbb9" [label="9|{9: // label|10: // stack frame map|11: ALOAD 3|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z|13: IFEQ 24}"] + "forEachCollectionMethodbb14" [label="14|{14: ALOAD 3|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;|16: CHECKCAST java/lang/String|17: ASTORE 4|18: // label|19: // line number information|20: IINC 2 1|21: // label|22: // line number information|23: GOTO 9}"] + "forEachCollectionMethodbb24" [label="24|{24: // label|25: // line number information|26: // stack frame map|27: ILOAD 2|28: IRETURN }"] + + "forEachCollectionMethodbb-1" -> "forEachCollectionMethodbb0" + "forEachCollectionMethodbb0" -> "forEachCollectionMethodbb9" + "forEachCollectionMethodbb9" -> "forEachCollectionMethodbb14" + "forEachCollectionMethodbb24" -> "forEachCollectionMethodbb-2" + "forEachCollectionMethodbb14" -> "forEachCollectionMethodbb9" [label="T"] + "forEachCollectionMethodbb9" -> "forEachCollectionMethodbb24" [label="T"] +} diff --git a/test-output/forEachCollectionMethod.combined.dot b/test-output/forEachCollectionMethod.combined.dot new file mode 100644 index 0000000..6ce8a4b --- /dev/null +++ b/test-output/forEachCollectionMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="forEachCollectionMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ALOAD 1\l|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;\l|8: ASTORE 3\l}"] + 9 [shape=record,label="9|{9: // label\l|10: // stack frame map\l|11: ALOAD 3\l|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z\l|13: IFEQ 24\l}"] + 14 [shape=record,label="14|{14: ALOAD 3\l|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;\l|16: CHECKCAST java/lang/String\l|17: ASTORE 4\l|18: // label\l|19: // line number information\l|20: IINC 2 1\l|21: // label\l|22: // line number information\l|23: GOTO 9\l}"] + 24 [shape=record,label="24|{24: // label\l|25: // line number information\l|26: // stack frame map\l|27: ILOAD 2\l|28: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 9 [label=""] + 9 -> 14 [label=""] + 24 -> -2 [label=""] + 14 -> 9 [label="T"] + 9 -> 24 [label="T"] + 9 -> 14 [style=dotted] + 0 -> 9 [style=dotted] + 24 -> -2 [style=dotted] + -1 -> 0 [style=dotted] + 9 -> 24 [style=dotted] +} diff --git a/test-output/forEachCollectionMethod.dt.dot b/test-output/forEachCollectionMethod.dt.dot new file mode 100644 index 0000000..89676a2 --- /dev/null +++ b/test-output/forEachCollectionMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="forEachCollectionMethod" + "D(-1)" [style=filled] + "D(9)" + "D(14)" + "D(0)" + "D(24)" + "D(-2)" + "D(9)" -> "D(14)" + "D(0)" -> "D(9)" + "D(24)" -> "D(-2)" + "D(-1)" -> "D(0)" + "D(9)" -> "D(24)" +} diff --git a/test-output/forEver.asm.txt b/test-output/forEver.asm.txt new file mode 100644 index 0000000..f73c00e --- /dev/null +++ b/test-output/forEver.asm.txt @@ -0,0 +1,9 @@ + Method: forEver(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // stack frame map + 6: IINC 2 1 + 7: GOTO 4 diff --git a/test-output/forEver.cfg.dot b/test-output/forEver.cfg.dot new file mode 100644 index 0000000..03a00c4 --- /dev/null +++ b/test-output/forEver.cfg.dot @@ -0,0 +1,12 @@ +digraph forEver { + + node [shape=record] + "forEverbb-1" [shape=circle,label="e",xlabel="forEver"] + "forEverbb-2" [shape=circle,label="e",xlabel="forEver"] + "forEverbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + "forEverbb4" [label="4|{4: // label|5: // stack frame map|6: IINC 2 1|7: GOTO 4}"] + + "forEverbb-1" -> "forEverbb0" + "forEverbb0" -> "forEverbb4" + "forEverbb4" -> "forEverbb4" [label="T"] +} diff --git a/test-output/forEver.combined.dot b/test-output/forEver.combined.dot new file mode 100644 index 0000000..0213236 --- /dev/null +++ b/test-output/forEver.combined.dot @@ -0,0 +1,12 @@ +digraph combined { + label="forEver" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"] + 4 [shape=record,label="4|{4: // label\l|5: // stack frame map\l|6: IINC 2 1\l|7: GOTO 4\l}"] + -1 -> 0 [label=""] + 0 -> 4 [label=""] + 4 -> 4 [label="T"] + 0 -> 4 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/forEver.dt.dot b/test-output/forEver.dt.dot new file mode 100644 index 0000000..f80b1dd --- /dev/null +++ b/test-output/forEver.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="forEver" + "D(-1)" [style=filled] + "D(0)" + "D(4)" + "D(0)" -> "D(4)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/forMethod.asm.txt b/test-output/forMethod.asm.txt new file mode 100644 index 0000000..e9962ff --- /dev/null +++ b/test-output/forMethod.asm.txt @@ -0,0 +1,29 @@ + Method: forMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ICONST_0 + 7: ISTORE 3 + 8: // label + 9: // stack frame map + 10: ILOAD 3 + 11: ILOAD 1 + 12: IF_ICMPGE 23 + 13: // label + 14: // line number information + 15: ILOAD 2 + 16: ILOAD 3 + 17: IADD + 18: ISTORE 2 + 19: // label + 20: // line number information + 21: IINC 1 1 + 22: GOTO 8 + 23: // label + 24: // line number information + 25: // stack frame map + 26: ILOAD 2 + 27: IRETURN diff --git a/test-output/forMethod.cfg.dot b/test-output/forMethod.cfg.dot new file mode 100644 index 0000000..e297cc2 --- /dev/null +++ b/test-output/forMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph forMethod { + + node [shape=record] + "forMethodbb-1" [shape=circle,label="e",xlabel="forMethod"] + "forMethodbb-2" [shape=circle,label="x"] + "forMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + "forMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 23}"] + "forMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 2|16: ILOAD 3|17: IADD |18: ISTORE 2|19: // label|20: // line number information|21: IINC 1 1|22: GOTO 8}"] + "forMethodbb23" [label="23|{23: // label|24: // line number information|25: // stack frame map|26: ILOAD 2|27: IRETURN }"] + + "forMethodbb-1" -> "forMethodbb0" + "forMethodbb0" -> "forMethodbb8" + "forMethodbb8" -> "forMethodbb13" + "forMethodbb23" -> "forMethodbb-2" + "forMethodbb13" -> "forMethodbb8" [label="T"] + "forMethodbb8" -> "forMethodbb23" [label="T"] +} diff --git a/test-output/forMethod.combined.dot b/test-output/forMethod.combined.dot new file mode 100644 index 0000000..5956aed --- /dev/null +++ b/test-output/forMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="forMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 23\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 2\l|16: ILOAD 3\l|17: IADD \l|18: ISTORE 2\l|19: // label\l|20: // line number information\l|21: IINC 1 1\l|22: GOTO 8\l}"] + 23 [shape=record,label="23|{23: // label\l|24: // line number information\l|25: // stack frame map\l|26: ILOAD 2\l|27: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 8 -> 13 [label=""] + 23 -> -2 [label=""] + 13 -> 8 [label="T"] + 8 -> 23 [label="T"] + 0 -> 8 [style=dotted] + 23 -> -2 [style=dotted] + 8 -> 23 [style=dotted] + -1 -> 0 [style=dotted] + 8 -> 13 [style=dotted] +} diff --git a/test-output/forMethod.dt.dot b/test-output/forMethod.dt.dot new file mode 100644 index 0000000..b837ce0 --- /dev/null +++ b/test-output/forMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="forMethod" + "D(-1)" [style=filled] + "D(0)" + "D(8)" + "D(23)" + "D(-2)" + "D(13)" + "D(0)" -> "D(8)" + "D(23)" -> "D(-2)" + "D(8)" -> "D(23)" + "D(-1)" -> "D(0)" + "D(8)" -> "D(13)" +} diff --git a/test-output/forWithBreakMethod.asm.txt b/test-output/forWithBreakMethod.asm.txt new file mode 100644 index 0000000..9ed276b --- /dev/null +++ b/test-output/forWithBreakMethod.asm.txt @@ -0,0 +1,38 @@ + Method: forWithBreakMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ICONST_0 + 7: ISTORE 3 + 8: // label + 9: // stack frame map + 10: ILOAD 3 + 11: ILOAD 1 + 12: IF_ICMPGE 32 + 13: // label + 14: // line number information + 15: ILOAD 3 + 16: BIPUSH 10 + 17: IF_ICMPNE 21 + 18: // label + 19: // line number information + 20: GOTO 32 + 21: // label + 22: // line number information + 23: // stack frame map + 24: ILOAD 2 + 25: ILOAD 3 + 26: IADD + 27: ISTORE 2 + 28: // label + 29: // line number information + 30: IINC 3 1 + 31: GOTO 8 + 32: // label + 33: // line number information + 34: // stack frame map + 35: ILOAD 2 + 36: IRETURN diff --git a/test-output/forWithBreakMethod.cfg.dot b/test-output/forWithBreakMethod.cfg.dot new file mode 100644 index 0000000..c67a277 --- /dev/null +++ b/test-output/forWithBreakMethod.cfg.dot @@ -0,0 +1,22 @@ +digraph forWithBreakMethod { + + node [shape=record] + "forWithBreakMethodbb-1" [shape=circle,label="e",xlabel="forWithBreakMethod"] + "forWithBreakMethodbb-2" [shape=circle,label="x"] + "forWithBreakMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + "forWithBreakMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 32}"] + "forWithBreakMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"] + "forWithBreakMethodbb18" [label="18|{18: // label|19: // line number information|20: GOTO 32}"] + "forWithBreakMethodbb21" [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 3 1|31: GOTO 8}"] + "forWithBreakMethodbb32" [label="32|{32: // label|33: // line number information|34: // stack frame map|35: ILOAD 2|36: IRETURN }"] + + "forWithBreakMethodbb-1" -> "forWithBreakMethodbb0" + "forWithBreakMethodbb0" -> "forWithBreakMethodbb8" + "forWithBreakMethodbb8" -> "forWithBreakMethodbb13" + "forWithBreakMethodbb13" -> "forWithBreakMethodbb18" + "forWithBreakMethodbb32" -> "forWithBreakMethodbb-2" + "forWithBreakMethodbb21" -> "forWithBreakMethodbb8" [label="T"] + "forWithBreakMethodbb13" -> "forWithBreakMethodbb21" [label="T"] + "forWithBreakMethodbb8" -> "forWithBreakMethodbb32" [label="T"] + "forWithBreakMethodbb18" -> "forWithBreakMethodbb32" [label="T"] +} diff --git a/test-output/forWithBreakMethod.combined.dot b/test-output/forWithBreakMethod.combined.dot new file mode 100644 index 0000000..01559c2 --- /dev/null +++ b/test-output/forWithBreakMethod.combined.dot @@ -0,0 +1,27 @@ +digraph combined { + label="forWithBreakMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 32\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}"] + 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: GOTO 32\l}"] + 21 [shape=record,label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // line number information\l|30: IINC 3 1\l|31: GOTO 8\l}"] + 32 [shape=record,label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: ILOAD 2\l|36: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 8 -> 13 [label=""] + 13 -> 18 [label=""] + 32 -> -2 [label=""] + 21 -> 8 [label="T"] + 13 -> 21 [label="T"] + 8 -> 32 [label="T"] + 18 -> 32 [label="T"] + -1 -> 0 [style=dotted] + 32 -> -2 [style=dotted] + 13 -> 21 [style=dotted] + 13 -> 18 [style=dotted] + 8 -> 32 [style=dotted] + 8 -> 13 [style=dotted] + 0 -> 8 [style=dotted] +} diff --git a/test-output/forWithBreakMethod.dt.dot b/test-output/forWithBreakMethod.dt.dot new file mode 100644 index 0000000..e9b0456 --- /dev/null +++ b/test-output/forWithBreakMethod.dt.dot @@ -0,0 +1,18 @@ +digraph dominatorTree { + label="forWithBreakMethod" + "D(-1)" [style=filled] + "D(0)" + "D(32)" + "D(-2)" + "D(13)" + "D(21)" + "D(18)" + "D(8)" + "D(-1)" -> "D(0)" + "D(32)" -> "D(-2)" + "D(13)" -> "D(21)" + "D(13)" -> "D(18)" + "D(8)" -> "D(32)" + "D(8)" -> "D(13)" + "D(0)" -> "D(8)" +} diff --git a/test-output/forWithContinueMethod.asm.txt b/test-output/forWithContinueMethod.asm.txt new file mode 100644 index 0000000..68ff61a --- /dev/null +++ b/test-output/forWithContinueMethod.asm.txt @@ -0,0 +1,39 @@ + Method: forWithContinueMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ICONST_0 + 7: ISTORE 3 + 8: // label + 9: // stack frame map + 10: ILOAD 3 + 11: ILOAD 1 + 12: IF_ICMPGE 33 + 13: // label + 14: // line number information + 15: ILOAD 3 + 16: BIPUSH 10 + 17: IF_ICMPNE 21 + 18: // label + 19: // line number information + 20: GOTO 28 + 21: // label + 22: // line number information + 23: // stack frame map + 24: ILOAD 2 + 25: ILOAD 3 + 26: IADD + 27: ISTORE 2 + 28: // label + 29: // line number information + 30: // stack frame map + 31: IINC 3 1 + 32: GOTO 8 + 33: // label + 34: // line number information + 35: // stack frame map + 36: ILOAD 2 + 37: IRETURN diff --git a/test-output/forWithContinueMethod.cfg.dot b/test-output/forWithContinueMethod.cfg.dot new file mode 100644 index 0000000..5ceda39 --- /dev/null +++ b/test-output/forWithContinueMethod.cfg.dot @@ -0,0 +1,24 @@ +digraph forWithContinueMethod { + + node [shape=record] + "forWithContinueMethodbb-1" [shape=circle,label="e",xlabel="forWithContinueMethod"] + "forWithContinueMethodbb-2" [shape=circle,label="x"] + "forWithContinueMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + "forWithContinueMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 33}"] + "forWithContinueMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"] + "forWithContinueMethodbb18" [label="18|{18: // label|19: // line number information|20: GOTO 28}"] + "forWithContinueMethodbb21" [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2}"] + "forWithContinueMethodbb28" [label="28|{28: // label|29: // line number information|30: // stack frame map|31: IINC 3 1|32: GOTO 8}"] + "forWithContinueMethodbb33" [label="33|{33: // label|34: // line number information|35: // stack frame map|36: ILOAD 2|37: IRETURN }"] + + "forWithContinueMethodbb-1" -> "forWithContinueMethodbb0" + "forWithContinueMethodbb0" -> "forWithContinueMethodbb8" + "forWithContinueMethodbb8" -> "forWithContinueMethodbb13" + "forWithContinueMethodbb13" -> "forWithContinueMethodbb18" + "forWithContinueMethodbb21" -> "forWithContinueMethodbb28" + "forWithContinueMethodbb33" -> "forWithContinueMethodbb-2" + "forWithContinueMethodbb28" -> "forWithContinueMethodbb8" [label="T"] + "forWithContinueMethodbb13" -> "forWithContinueMethodbb21" [label="T"] + "forWithContinueMethodbb18" -> "forWithContinueMethodbb28" [label="T"] + "forWithContinueMethodbb8" -> "forWithContinueMethodbb33" [label="T"] +} diff --git a/test-output/forWithContinueMethod.combined.dot b/test-output/forWithContinueMethod.combined.dot new file mode 100644 index 0000000..9590439 --- /dev/null +++ b/test-output/forWithContinueMethod.combined.dot @@ -0,0 +1,30 @@ +digraph combined { + label="forWithContinueMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 33\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}"] + 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: GOTO 28\l}"] + 21 [shape=record,label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE 2\l}"] + 28 [shape=record,label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: IINC 3 1\l|32: GOTO 8\l}"] + 33 [shape=record,label="33|{33: // label\l|34: // line number information\l|35: // stack frame map\l|36: ILOAD 2\l|37: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 8 -> 13 [label=""] + 13 -> 18 [label=""] + 21 -> 28 [label=""] + 33 -> -2 [label=""] + 28 -> 8 [label="T"] + 13 -> 21 [label="T"] + 18 -> 28 [label="T"] + 8 -> 33 [label="T"] + 33 -> -2 [style=dotted] + 8 -> 33 [style=dotted] + 13 -> 21 [style=dotted] + -1 -> 0 [style=dotted] + 0 -> 8 [style=dotted] + 13 -> 18 [style=dotted] + 13 -> 28 [style=dotted] + 8 -> 13 [style=dotted] +} diff --git a/test-output/forWithContinueMethod.dt.dot b/test-output/forWithContinueMethod.dt.dot new file mode 100644 index 0000000..42f402e --- /dev/null +++ b/test-output/forWithContinueMethod.dt.dot @@ -0,0 +1,20 @@ +digraph dominatorTree { + label="forWithContinueMethod" + "D(-1)" [style=filled] + "D(33)" + "D(-2)" + "D(8)" + "D(13)" + "D(21)" + "D(0)" + "D(18)" + "D(28)" + "D(33)" -> "D(-2)" + "D(8)" -> "D(33)" + "D(13)" -> "D(21)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(8)" + "D(13)" -> "D(18)" + "D(13)" -> "D(28)" + "D(8)" -> "D(13)" +} diff --git a/test-output/ifElseMethod.asm.txt b/test-output/ifElseMethod.asm.txt new file mode 100644 index 0000000..05d205b --- /dev/null +++ b/test-output/ifElseMethod.asm.txt @@ -0,0 +1,24 @@ + Method: ifElseMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ILOAD 1 + 7: IFLE 13 + 8: // label + 9: // line number information + 10: ICONST_0 + 11: ISTORE 2 + 12: GOTO 18 + 13: // label + 14: // line number information + 15: // stack frame map + 16: ILOAD 1 + 17: ISTORE 2 + 18: // label + 19: // line number information + 20: // stack frame map + 21: ILOAD 2 + 22: IRETURN diff --git a/test-output/ifElseMethod.cfg.dot b/test-output/ifElseMethod.cfg.dot new file mode 100644 index 0000000..190e71c --- /dev/null +++ b/test-output/ifElseMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph ifElseMethod { + + node [shape=record] + "ifElseMethodbb-1" [shape=circle,label="e",xlabel="ifElseMethod"] + "ifElseMethodbb-2" [shape=circle,label="x"] + "ifElseMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFLE 13}"] + "ifElseMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_0 |11: ISTORE 2|12: GOTO 18}"] + "ifElseMethodbb13" [label="13|{13: // label|14: // line number information|15: // stack frame map|16: ILOAD 1|17: ISTORE 2}"] + "ifElseMethodbb18" [label="18|{18: // label|19: // line number information|20: // stack frame map|21: ILOAD 2|22: IRETURN }"] + + "ifElseMethodbb-1" -> "ifElseMethodbb0" + "ifElseMethodbb0" -> "ifElseMethodbb8" + "ifElseMethodbb13" -> "ifElseMethodbb18" + "ifElseMethodbb18" -> "ifElseMethodbb-2" + "ifElseMethodbb0" -> "ifElseMethodbb13" [label="T"] + "ifElseMethodbb8" -> "ifElseMethodbb18" [label="T"] +} diff --git a/test-output/ifElseMethod.combined.dot b/test-output/ifElseMethod.combined.dot new file mode 100644 index 0000000..19148cb --- /dev/null +++ b/test-output/ifElseMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="ifElseMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: IFLE 13\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_0 \l|11: ISTORE 2\l|12: GOTO 18\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: // stack frame map\l|16: ILOAD 1\l|17: ISTORE 2\l}"] + 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: // stack frame map\l|21: ILOAD 2\l|22: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 13 -> 18 [label=""] + 18 -> -2 [label=""] + 0 -> 13 [label="T"] + 8 -> 18 [label="T"] + -1 -> 0 [style=dotted] + 0 -> 13 [style=dotted] + 18 -> -2 [style=dotted] + 0 -> 8 [style=dotted] + 0 -> 18 [style=dotted] +} diff --git a/test-output/ifElseMethod.dt.dot b/test-output/ifElseMethod.dt.dot new file mode 100644 index 0000000..a5f5c55 --- /dev/null +++ b/test-output/ifElseMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="ifElseMethod" + "D(-1)" [style=filled] + "D(0)" + "D(13)" + "D(18)" + "D(-2)" + "D(8)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(13)" + "D(18)" -> "D(-2)" + "D(0)" -> "D(8)" + "D(0)" -> "D(18)" +} diff --git a/test-output/ifMethod.asm.txt b/test-output/ifMethod.asm.txt new file mode 100644 index 0000000..90e7767 --- /dev/null +++ b/test-output/ifMethod.asm.txt @@ -0,0 +1,18 @@ + Method: ifMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ILOAD 1 + 7: IFGE 12 + 8: // label + 9: // line number information + 10: ICONST_1 + 11: ISTORE 2 + 12: // label + 13: // line number information + 14: // stack frame map + 15: ILOAD 2 + 16: IRETURN diff --git a/test-output/ifMethod.cfg.dot b/test-output/ifMethod.cfg.dot new file mode 100644 index 0000000..66ac008 --- /dev/null +++ b/test-output/ifMethod.cfg.dot @@ -0,0 +1,15 @@ +digraph ifMethod { + + node [shape=record] + "ifMethodbb-1" [shape=circle,label="e",xlabel="ifMethod"] + "ifMethodbb-2" [shape=circle,label="x"] + "ifMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFGE 12}"] + "ifMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: ISTORE 2}"] + "ifMethodbb12" [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ILOAD 2|16: IRETURN }"] + + "ifMethodbb-1" -> "ifMethodbb0" + "ifMethodbb0" -> "ifMethodbb8" + "ifMethodbb8" -> "ifMethodbb12" + "ifMethodbb12" -> "ifMethodbb-2" + "ifMethodbb0" -> "ifMethodbb12" [label="T"] +} diff --git a/test-output/ifMethod.combined.dot b/test-output/ifMethod.combined.dot new file mode 100644 index 0000000..3580dfc --- /dev/null +++ b/test-output/ifMethod.combined.dot @@ -0,0 +1,17 @@ +digraph combined { + label="ifMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: IFGE 12\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: ISTORE 2\l}"] + 12 [shape=record,label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ILOAD 2\l|16: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 8 -> 12 [label=""] + 12 -> -2 [label=""] + 0 -> 12 [label="T"] + 0 -> 8 [style=dotted] + 12 -> -2 [style=dotted] + 0 -> 12 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/ifMethod.dt.dot b/test-output/ifMethod.dt.dot new file mode 100644 index 0000000..db902b6 --- /dev/null +++ b/test-output/ifMethod.dt.dot @@ -0,0 +1,12 @@ +digraph dominatorTree { + label="ifMethod" + "D(-1)" [style=filled] + "D(0)" + "D(8)" + "D(12)" + "D(-2)" + "D(0)" -> "D(8)" + "D(12)" -> "D(-2)" + "D(0)" -> "D(12)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/instanceCallMethod.asm.txt b/test-output/instanceCallMethod.asm.txt new file mode 100644 index 0000000..2afff13 --- /dev/null +++ b/test-output/instanceCallMethod.asm.txt @@ -0,0 +1,9 @@ + Method: instanceCallMethod(LExampleClass;)I + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V + 4: // label + 5: // line number information + 6: ICONST_2 + 7: IRETURN diff --git a/test-output/instanceCallMethod.cfg.dot b/test-output/instanceCallMethod.cfg.dot new file mode 100644 index 0000000..840b3a1 --- /dev/null +++ b/test-output/instanceCallMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph instanceCallMethod { + + node [shape=record] + "instanceCallMethodbb-1" [shape=circle,label="e",xlabel="instanceCallMethod"] + "instanceCallMethodbb-2" [shape=circle,label="x"] + "instanceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + "instanceCallMethodbb-1" -> "instanceCallMethodbb0" + "instanceCallMethodbb0" -> "instanceCallMethodbb-2" +} diff --git a/test-output/instanceCallMethod.combined.dot b/test-output/instanceCallMethod.combined.dot new file mode 100644 index 0000000..4dc9d84 --- /dev/null +++ b/test-output/instanceCallMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="instanceCallMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/instanceCallMethod.dt.dot b/test-output/instanceCallMethod.dt.dot new file mode 100644 index 0000000..537687c --- /dev/null +++ b/test-output/instanceCallMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="instanceCallMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/instanceCallTarget.asm.txt b/test-output/instanceCallTarget.asm.txt new file mode 100644 index 0000000..56a689f --- /dev/null +++ b/test-output/instanceCallTarget.asm.txt @@ -0,0 +1,4 @@ + Method: instanceCallTarget()V + 0: // label + 1: // line number information + 2: RETURN diff --git a/test-output/instanceCallTarget.cfg.dot b/test-output/instanceCallTarget.cfg.dot new file mode 100644 index 0000000..29ade3a --- /dev/null +++ b/test-output/instanceCallTarget.cfg.dot @@ -0,0 +1,10 @@ +digraph instanceCallTarget { + + node [shape=record] + "instanceCallTargetbb-1" [shape=circle,label="e",xlabel="instanceCallTarget"] + "instanceCallTargetbb-2" [shape=circle,label="x"] + "instanceCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"] + + "instanceCallTargetbb-1" -> "instanceCallTargetbb0" + "instanceCallTargetbb0" -> "instanceCallTargetbb-2" +} diff --git a/test-output/instanceCallTarget.combined.dot b/test-output/instanceCallTarget.combined.dot new file mode 100644 index 0000000..534cc5a --- /dev/null +++ b/test-output/instanceCallTarget.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="instanceCallTarget" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/instanceCallTarget.dt.dot b/test-output/instanceCallTarget.dt.dot new file mode 100644 index 0000000..6e5ad7a --- /dev/null +++ b/test-output/instanceCallTarget.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="instanceCallTarget" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/interfaceCallMethod.asm.txt b/test-output/interfaceCallMethod.asm.txt new file mode 100644 index 0000000..92924cc --- /dev/null +++ b/test-output/interfaceCallMethod.asm.txt @@ -0,0 +1,9 @@ + Method: interfaceCallMethod(LExampleClass$Interface;)I + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V + 4: // label + 5: // line number information + 6: ICONST_2 + 7: IRETURN diff --git a/test-output/interfaceCallMethod.cfg.dot b/test-output/interfaceCallMethod.cfg.dot new file mode 100644 index 0000000..b488799 --- /dev/null +++ b/test-output/interfaceCallMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph interfaceCallMethod { + + node [shape=record] + "interfaceCallMethodbb-1" [shape=circle,label="e",xlabel="interfaceCallMethod"] + "interfaceCallMethodbb-2" [shape=circle,label="x"] + "interfaceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + "interfaceCallMethodbb-1" -> "interfaceCallMethodbb0" + "interfaceCallMethodbb0" -> "interfaceCallMethodbb-2" +} diff --git a/test-output/interfaceCallMethod.combined.dot b/test-output/interfaceCallMethod.combined.dot new file mode 100644 index 0000000..885ff1a --- /dev/null +++ b/test-output/interfaceCallMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="interfaceCallMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/interfaceCallMethod.dt.dot b/test-output/interfaceCallMethod.dt.dot new file mode 100644 index 0000000..90a132e --- /dev/null +++ b/test-output/interfaceCallMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="interfaceCallMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/nestedFor.asm.txt b/test-output/nestedFor.asm.txt new file mode 100644 index 0000000..5ecdb14 --- /dev/null +++ b/test-output/nestedFor.asm.txt @@ -0,0 +1,43 @@ + Method: nestedFor(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ICONST_0 + 7: ISTORE 3 + 8: // label + 9: // stack frame map + 10: ILOAD 3 + 11: ILOAD 1 + 12: IF_ICMPGE 37 + 13: // label + 14: // line number information + 15: ICONST_0 + 16: ISTORE 4 + 17: // label + 18: // stack frame map + 19: ILOAD 4 + 20: ILOAD 3 + 21: IF_ICMPGE 32 + 22: // label + 23: // line number information + 24: ILOAD 2 + 25: ILOAD 4 + 26: IADD + 27: ISTORE 2 + 28: // label + 29: // line number information + 30: IINC 4 1 + 31: GOTO 17 + 32: // label + 33: // line number information + 34: // stack frame map + 35: IINC 3 1 + 36: GOTO 8 + 37: // label + 38: // line number information + 39: // stack frame map + 40: ILOAD 2 + 41: IRETURN diff --git a/test-output/nestedFor.cfg.dot b/test-output/nestedFor.cfg.dot new file mode 100644 index 0000000..7c70285 --- /dev/null +++ b/test-output/nestedFor.cfg.dot @@ -0,0 +1,24 @@ +digraph nestedFor { + + node [shape=record] + "nestedForbb-1" [shape=circle,label="e",xlabel="nestedFor"] + "nestedForbb-2" [shape=circle,label="x"] + "nestedForbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + "nestedForbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 37}"] + "nestedForbb13" [label="13|{13: // label|14: // line number information|15: ICONST_0 |16: ISTORE 4}"] + "nestedForbb17" [label="17|{17: // label|18: // stack frame map|19: ILOAD 4|20: ILOAD 3|21: IF_ICMPGE 32}"] + "nestedForbb22" [label="22|{22: // label|23: // line number information|24: ILOAD 2|25: ILOAD 4|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 4 1|31: GOTO 17}"] + "nestedForbb32" [label="32|{32: // label|33: // line number information|34: // stack frame map|35: IINC 3 1|36: GOTO 8}"] + "nestedForbb37" [label="37|{37: // label|38: // line number information|39: // stack frame map|40: ILOAD 2|41: IRETURN }"] + + "nestedForbb-1" -> "nestedForbb0" + "nestedForbb0" -> "nestedForbb8" + "nestedForbb8" -> "nestedForbb13" + "nestedForbb13" -> "nestedForbb17" + "nestedForbb17" -> "nestedForbb22" + "nestedForbb37" -> "nestedForbb-2" + "nestedForbb32" -> "nestedForbb8" [label="T"] + "nestedForbb22" -> "nestedForbb17" [label="T"] + "nestedForbb17" -> "nestedForbb32" [label="T"] + "nestedForbb8" -> "nestedForbb37" [label="T"] +} diff --git a/test-output/nestedFor.combined.dot b/test-output/nestedFor.combined.dot new file mode 100644 index 0000000..d92acff --- /dev/null +++ b/test-output/nestedFor.combined.dot @@ -0,0 +1,30 @@ +digraph combined { + label="nestedFor" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 37\l}"] + 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ICONST_0 \l|16: ISTORE 4\l}"] + 17 [shape=record,label="17|{17: // label\l|18: // stack frame map\l|19: ILOAD 4\l|20: ILOAD 3\l|21: IF_ICMPGE 32\l}"] + 22 [shape=record,label="22|{22: // label\l|23: // line number information\l|24: ILOAD 2\l|25: ILOAD 4\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // line number information\l|30: IINC 4 1\l|31: GOTO 17\l}"] + 32 [shape=record,label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: IINC 3 1\l|36: GOTO 8\l}"] + 37 [shape=record,label="37|{37: // label\l|38: // line number information\l|39: // stack frame map\l|40: ILOAD 2\l|41: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 8 [label=""] + 8 -> 13 [label=""] + 13 -> 17 [label=""] + 17 -> 22 [label=""] + 37 -> -2 [label=""] + 32 -> 8 [label="T"] + 22 -> 17 [label="T"] + 17 -> 32 [label="T"] + 8 -> 37 [label="T"] + 17 -> 32 [style=dotted] + -1 -> 0 [style=dotted] + 8 -> 13 [style=dotted] + 0 -> 8 [style=dotted] + 8 -> 37 [style=dotted] + 37 -> -2 [style=dotted] + 13 -> 17 [style=dotted] + 17 -> 22 [style=dotted] +} diff --git a/test-output/nestedFor.dt.dot b/test-output/nestedFor.dt.dot new file mode 100644 index 0000000..f1f02f5 --- /dev/null +++ b/test-output/nestedFor.dt.dot @@ -0,0 +1,20 @@ +digraph dominatorTree { + label="nestedFor" + "D(-1)" [style=filled] + "D(17)" + "D(32)" + "D(0)" + "D(8)" + "D(13)" + "D(37)" + "D(-2)" + "D(22)" + "D(17)" -> "D(32)" + "D(-1)" -> "D(0)" + "D(8)" -> "D(13)" + "D(0)" -> "D(8)" + "D(8)" -> "D(37)" + "D(37)" -> "D(-2)" + "D(13)" -> "D(17)" + "D(17)" -> "D(22)" +} diff --git a/test-output/nonShortCircuitMethod.asm.txt b/test-output/nonShortCircuitMethod.asm.txt new file mode 100644 index 0000000..a029161 --- /dev/null +++ b/test-output/nonShortCircuitMethod.asm.txt @@ -0,0 +1,34 @@ + Method: nonShortCircuitMethod(III)I + 0: // label + 1: // line number information + 2: ILOAD 1 + 3: ILOAD 2 + 4: IF_ICMPLE 7 + 5: ICONST_1 + 6: GOTO 10 + 7: // label + 8: // stack frame map + 9: ICONST_0 + 10: // label + 11: // stack frame map + 12: ILOAD 1 + 13: ILOAD 3 + 14: IF_ICMPGE 17 + 15: ICONST_1 + 16: GOTO 20 + 17: // label + 18: // stack frame map + 19: ICONST_0 + 20: // label + 21: // stack frame map + 22: IAND + 23: IFEQ 28 + 24: // label + 25: // line number information + 26: ICONST_1 + 27: IRETURN + 28: // label + 29: // line number information + 30: // stack frame map + 31: ICONST_0 + 32: IRETURN diff --git a/test-output/nonShortCircuitMethod.cfg.dot b/test-output/nonShortCircuitMethod.cfg.dot new file mode 100644 index 0000000..d61827a --- /dev/null +++ b/test-output/nonShortCircuitMethod.cfg.dot @@ -0,0 +1,30 @@ +digraph nonShortCircuitMethod { + + node [shape=record] + "nonShortCircuitMethodbb-1" [shape=circle,label="e",xlabel="nonShortCircuitMethod"] + "nonShortCircuitMethodbb-2" [shape=circle,label="x"] + "nonShortCircuitMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"] + "nonShortCircuitMethodbb5" [label="5|{5: ICONST_1 |6: GOTO 10}"] + "nonShortCircuitMethodbb7" [label="7|{7: // label|8: // stack frame map|9: ICONST_0 }"] + "nonShortCircuitMethodbb10" [label="10|{10: // label|11: // stack frame map|12: ILOAD 1|13: ILOAD 3|14: IF_ICMPGE 17}"] + "nonShortCircuitMethodbb15" [label="15|{15: ICONST_1 |16: GOTO 20}"] + "nonShortCircuitMethodbb17" [label="17|{17: // label|18: // stack frame map|19: ICONST_0 }"] + "nonShortCircuitMethodbb20" [label="20|{20: // label|21: // stack frame map|22: IAND |23: IFEQ 28}"] + "nonShortCircuitMethodbb24" [label="24|{24: // label|25: // line number information|26: ICONST_1 |27: IRETURN }"] + "nonShortCircuitMethodbb28" [label="28|{28: // label|29: // line number information|30: // stack frame map|31: ICONST_0 |32: IRETURN }"] + + "nonShortCircuitMethodbb-1" -> "nonShortCircuitMethodbb0" + "nonShortCircuitMethodbb0" -> "nonShortCircuitMethodbb5" + "nonShortCircuitMethodbb7" -> "nonShortCircuitMethodbb10" + "nonShortCircuitMethodbb10" -> "nonShortCircuitMethodbb15" + "nonShortCircuitMethodbb17" -> "nonShortCircuitMethodbb20" + "nonShortCircuitMethodbb20" -> "nonShortCircuitMethodbb24" + "nonShortCircuitMethodbb24" -> "nonShortCircuitMethodbb-2" + "nonShortCircuitMethodbb24" -> "nonShortCircuitMethodbb28" + "nonShortCircuitMethodbb28" -> "nonShortCircuitMethodbb-2" + "nonShortCircuitMethodbb0" -> "nonShortCircuitMethodbb7" [label="T"] + "nonShortCircuitMethodbb5" -> "nonShortCircuitMethodbb10" [label="T"] + "nonShortCircuitMethodbb10" -> "nonShortCircuitMethodbb17" [label="T"] + "nonShortCircuitMethodbb15" -> "nonShortCircuitMethodbb20" [label="T"] + "nonShortCircuitMethodbb20" -> "nonShortCircuitMethodbb28" [label="T"] +} diff --git a/test-output/nonShortCircuitMethod.combined.dot b/test-output/nonShortCircuitMethod.combined.dot new file mode 100644 index 0000000..ddb90b6 --- /dev/null +++ b/test-output/nonShortCircuitMethod.combined.dot @@ -0,0 +1,38 @@ +digraph combined { + label="nonShortCircuitMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}"] + 5 [shape=record,label="5|{5: ICONST_1 \l|6: GOTO 10\l}"] + 7 [shape=record,label="7|{7: // label\l|8: // stack frame map\l|9: ICONST_0 \l}"] + 10 [shape=record,label="10|{10: // label\l|11: // stack frame map\l|12: ILOAD 1\l|13: ILOAD 3\l|14: IF_ICMPGE 17\l}"] + 15 [shape=record,label="15|{15: ICONST_1 \l|16: GOTO 20\l}"] + 17 [shape=record,label="17|{17: // label\l|18: // stack frame map\l|19: ICONST_0 \l}"] + 20 [shape=record,label="20|{20: // label\l|21: // stack frame map\l|22: IAND \l|23: IFEQ 28\l}"] + 24 [shape=record,label="24|{24: // label\l|25: // line number information\l|26: ICONST_1 \l|27: IRETURN \l}"] + 28 [shape=record,label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: ICONST_0 \l|32: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 5 [label=""] + 7 -> 10 [label=""] + 10 -> 15 [label=""] + 17 -> 20 [label=""] + 20 -> 24 [label=""] + 24 -> -2 [label=""] + 24 -> 28 [label=""] + 28 -> -2 [label=""] + 0 -> 7 [label="T"] + 5 -> 10 [label="T"] + 10 -> 17 [label="T"] + 15 -> 20 [label="T"] + 20 -> 28 [label="T"] + 10 -> 20 [style=dotted] + 20 -> -2 [style=dotted] + 10 -> 17 [style=dotted] + -1 -> 0 [style=dotted] + 20 -> 28 [style=dotted] + 20 -> 24 [style=dotted] + 0 -> 7 [style=dotted] + 0 -> 10 [style=dotted] + 0 -> 5 [style=dotted] + 10 -> 15 [style=dotted] +} diff --git a/test-output/nonShortCircuitMethod.dt.dot b/test-output/nonShortCircuitMethod.dt.dot new file mode 100644 index 0000000..0466944 --- /dev/null +++ b/test-output/nonShortCircuitMethod.dt.dot @@ -0,0 +1,24 @@ +digraph dominatorTree { + label="nonShortCircuitMethod" + "D(-1)" [style=filled] + "D(10)" + "D(20)" + "D(-2)" + "D(17)" + "D(0)" + "D(28)" + "D(24)" + "D(7)" + "D(5)" + "D(15)" + "D(10)" -> "D(20)" + "D(20)" -> "D(-2)" + "D(10)" -> "D(17)" + "D(-1)" -> "D(0)" + "D(20)" -> "D(28)" + "D(20)" -> "D(24)" + "D(0)" -> "D(7)" + "D(0)" -> "D(10)" + "D(0)" -> "D(5)" + "D(10)" -> "D(15)" +} diff --git a/test-output/privateInstanceCallMethod.asm.txt b/test-output/privateInstanceCallMethod.asm.txt new file mode 100644 index 0000000..b75ef45 --- /dev/null +++ b/test-output/privateInstanceCallMethod.asm.txt @@ -0,0 +1,9 @@ + Method: privateInstanceCallMethod(LExampleClass;)I + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V + 4: // label + 5: // line number information + 6: ICONST_2 + 7: IRETURN diff --git a/test-output/privateInstanceCallMethod.cfg.dot b/test-output/privateInstanceCallMethod.cfg.dot new file mode 100644 index 0000000..c14d74e --- /dev/null +++ b/test-output/privateInstanceCallMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph privateInstanceCallMethod { + + node [shape=record] + "privateInstanceCallMethodbb-1" [shape=circle,label="e",xlabel="privateInstanceCallMethod"] + "privateInstanceCallMethodbb-2" [shape=circle,label="x"] + "privateInstanceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + "privateInstanceCallMethodbb-1" -> "privateInstanceCallMethodbb0" + "privateInstanceCallMethodbb0" -> "privateInstanceCallMethodbb-2" +} diff --git a/test-output/privateInstanceCallMethod.combined.dot b/test-output/privateInstanceCallMethod.combined.dot new file mode 100644 index 0000000..f5a5876 --- /dev/null +++ b/test-output/privateInstanceCallMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="privateInstanceCallMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/privateInstanceCallMethod.dt.dot b/test-output/privateInstanceCallMethod.dt.dot new file mode 100644 index 0000000..a2d12f1 --- /dev/null +++ b/test-output/privateInstanceCallMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="privateInstanceCallMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/privateInstanceCallTarget.asm.txt b/test-output/privateInstanceCallTarget.asm.txt new file mode 100644 index 0000000..073ee34 --- /dev/null +++ b/test-output/privateInstanceCallTarget.asm.txt @@ -0,0 +1,4 @@ + Method: privateInstanceCallTarget()V + 0: // label + 1: // line number information + 2: RETURN diff --git a/test-output/privateInstanceCallTarget.cfg.dot b/test-output/privateInstanceCallTarget.cfg.dot new file mode 100644 index 0000000..ce86815 --- /dev/null +++ b/test-output/privateInstanceCallTarget.cfg.dot @@ -0,0 +1,10 @@ +digraph privateInstanceCallTarget { + + node [shape=record] + "privateInstanceCallTargetbb-1" [shape=circle,label="e",xlabel="privateInstanceCallTarget"] + "privateInstanceCallTargetbb-2" [shape=circle,label="x"] + "privateInstanceCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"] + + "privateInstanceCallTargetbb-1" -> "privateInstanceCallTargetbb0" + "privateInstanceCallTargetbb0" -> "privateInstanceCallTargetbb-2" +} diff --git a/test-output/privateInstanceCallTarget.combined.dot b/test-output/privateInstanceCallTarget.combined.dot new file mode 100644 index 0000000..6b2cee8 --- /dev/null +++ b/test-output/privateInstanceCallTarget.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="privateInstanceCallTarget" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/privateInstanceCallTarget.dt.dot b/test-output/privateInstanceCallTarget.dt.dot new file mode 100644 index 0000000..3ca35d7 --- /dev/null +++ b/test-output/privateInstanceCallTarget.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="privateInstanceCallTarget" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/shortCircuitMethod.asm.txt b/test-output/shortCircuitMethod.asm.txt new file mode 100644 index 0000000..5dae89d --- /dev/null +++ b/test-output/shortCircuitMethod.asm.txt @@ -0,0 +1,18 @@ + Method: shortCircuitMethod(III)I + 0: // label + 1: // line number information + 2: ILOAD 1 + 3: ILOAD 2 + 4: IF_ICMPLE 12 + 5: ILOAD 1 + 6: ILOAD 3 + 7: IF_ICMPGE 12 + 8: // label + 9: // line number information + 10: ICONST_1 + 11: IRETURN + 12: // label + 13: // line number information + 14: // stack frame map + 15: ICONST_0 + 16: IRETURN diff --git a/test-output/shortCircuitMethod.cfg.dot b/test-output/shortCircuitMethod.cfg.dot new file mode 100644 index 0000000..262f0fd --- /dev/null +++ b/test-output/shortCircuitMethod.cfg.dot @@ -0,0 +1,19 @@ +digraph shortCircuitMethod { + + node [shape=record] + "shortCircuitMethodbb-1" [shape=circle,label="e",xlabel="shortCircuitMethod"] + "shortCircuitMethodbb-2" [shape=circle,label="x"] + "shortCircuitMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 12}"] + "shortCircuitMethodbb5" [label="5|{5: ILOAD 1|6: ILOAD 3|7: IF_ICMPGE 12}"] + "shortCircuitMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: IRETURN }"] + "shortCircuitMethodbb12" [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ICONST_0 |16: IRETURN }"] + + "shortCircuitMethodbb-1" -> "shortCircuitMethodbb0" + "shortCircuitMethodbb0" -> "shortCircuitMethodbb5" + "shortCircuitMethodbb5" -> "shortCircuitMethodbb8" + "shortCircuitMethodbb8" -> "shortCircuitMethodbb-2" + "shortCircuitMethodbb8" -> "shortCircuitMethodbb12" + "shortCircuitMethodbb12" -> "shortCircuitMethodbb-2" + "shortCircuitMethodbb0" -> "shortCircuitMethodbb12" [label="T"] + "shortCircuitMethodbb5" -> "shortCircuitMethodbb12" [label="T"] +} diff --git a/test-output/shortCircuitMethod.combined.dot b/test-output/shortCircuitMethod.combined.dot new file mode 100644 index 0000000..a965db2 --- /dev/null +++ b/test-output/shortCircuitMethod.combined.dot @@ -0,0 +1,22 @@ +digraph combined { + label="shortCircuitMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 12\l}"] + 5 [shape=record,label="5|{5: ILOAD 1\l|6: ILOAD 3\l|7: IF_ICMPGE 12\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: IRETURN \l}"] + 12 [shape=record,label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ICONST_0 \l|16: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 5 [label=""] + 5 -> 8 [label=""] + 8 -> -2 [label=""] + 8 -> 12 [label=""] + 12 -> -2 [label=""] + 0 -> 12 [label="T"] + 5 -> 12 [label="T"] + -1 -> 0 [style=dotted] + 5 -> 8 [style=dotted] + 0 -> 12 [style=dotted] + 0 -> 5 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/shortCircuitMethod.dt.dot b/test-output/shortCircuitMethod.dt.dot new file mode 100644 index 0000000..6640bae --- /dev/null +++ b/test-output/shortCircuitMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="shortCircuitMethod" + "D(-1)" [style=filled] + "D(0)" + "D(5)" + "D(8)" + "D(12)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(5)" -> "D(8)" + "D(0)" -> "D(12)" + "D(0)" -> "D(5)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/staticCallMethod.asm.txt b/test-output/staticCallMethod.asm.txt new file mode 100644 index 0000000..655b5b8 --- /dev/null +++ b/test-output/staticCallMethod.asm.txt @@ -0,0 +1,8 @@ + Method: staticCallMethod(I)I + 0: // label + 1: // line number information + 2: INVOKESTATIC ExampleClass.staticCallTarget ()V + 3: // label + 4: // line number information + 5: ICONST_2 + 6: IRETURN diff --git a/test-output/staticCallMethod.cfg.dot b/test-output/staticCallMethod.cfg.dot new file mode 100644 index 0000000..88128c9 --- /dev/null +++ b/test-output/staticCallMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph staticCallMethod { + + node [shape=record] + "staticCallMethodbb-1" [shape=circle,label="e",xlabel="staticCallMethod"] + "staticCallMethodbb-2" [shape=circle,label="x"] + "staticCallMethodbb0" [label="0|{0: // label|1: // line number information|2: INVOKESTATIC ExampleClass.staticCallTarget ()V|3: // label|4: // line number information|5: ICONST_2 |6: IRETURN }"] + + "staticCallMethodbb-1" -> "staticCallMethodbb0" + "staticCallMethodbb0" -> "staticCallMethodbb-2" +} diff --git a/test-output/staticCallMethod.combined.dot b/test-output/staticCallMethod.combined.dot new file mode 100644 index 0000000..ec5bdda --- /dev/null +++ b/test-output/staticCallMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="staticCallMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: INVOKESTATIC ExampleClass.staticCallTarget ()V\l|3: // label\l|4: // line number information\l|5: ICONST_2 \l|6: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/staticCallMethod.dt.dot b/test-output/staticCallMethod.dt.dot new file mode 100644 index 0000000..0843bbd --- /dev/null +++ b/test-output/staticCallMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="staticCallMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/staticCallTarget.asm.txt b/test-output/staticCallTarget.asm.txt new file mode 100644 index 0000000..1e26d76 --- /dev/null +++ b/test-output/staticCallTarget.asm.txt @@ -0,0 +1,4 @@ + Method: staticCallTarget()V + 0: // label + 1: // line number information + 2: RETURN diff --git a/test-output/staticCallTarget.cfg.dot b/test-output/staticCallTarget.cfg.dot new file mode 100644 index 0000000..fc92b36 --- /dev/null +++ b/test-output/staticCallTarget.cfg.dot @@ -0,0 +1,10 @@ +digraph staticCallTarget { + + node [shape=record] + "staticCallTargetbb-1" [shape=circle,label="e",xlabel="staticCallTarget"] + "staticCallTargetbb-2" [shape=circle,label="x"] + "staticCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"] + + "staticCallTargetbb-1" -> "staticCallTargetbb0" + "staticCallTargetbb0" -> "staticCallTargetbb-2" +} diff --git a/test-output/staticCallTarget.combined.dot b/test-output/staticCallTarget.combined.dot new file mode 100644 index 0000000..0c13ea7 --- /dev/null +++ b/test-output/staticCallTarget.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="staticCallTarget" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + -1 -> 0 [style=dotted] + 0 -> -2 [style=dotted] +} diff --git a/test-output/staticCallTarget.dt.dot b/test-output/staticCallTarget.dt.dot new file mode 100644 index 0000000..70ed860 --- /dev/null +++ b/test-output/staticCallTarget.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="staticCallTarget" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(-2)" +} diff --git a/test-output/staticFieldReadMethod.asm.txt b/test-output/staticFieldReadMethod.asm.txt new file mode 100644 index 0000000..82a4ec0 --- /dev/null +++ b/test-output/staticFieldReadMethod.asm.txt @@ -0,0 +1,5 @@ + Method: staticFieldReadMethod()Ljava/lang/String; + 0: // label + 1: // line number information + 2: GETSTATIC ExampleClass.staticField Ljava/lang/String; + 3: ARETURN diff --git a/test-output/staticFieldReadMethod.cfg.dot b/test-output/staticFieldReadMethod.cfg.dot new file mode 100644 index 0000000..c2ad464 --- /dev/null +++ b/test-output/staticFieldReadMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph staticFieldReadMethod { + + node [shape=record] + "staticFieldReadMethodbb-1" [shape=circle,label="e",xlabel="staticFieldReadMethod"] + "staticFieldReadMethodbb-2" [shape=circle,label="x"] + "staticFieldReadMethodbb0" [label="0|{0: // label|1: // line number information|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;|3: ARETURN }"] + + "staticFieldReadMethodbb-1" -> "staticFieldReadMethodbb0" + "staticFieldReadMethodbb0" -> "staticFieldReadMethodbb-2" +} diff --git a/test-output/staticFieldReadMethod.combined.dot b/test-output/staticFieldReadMethod.combined.dot new file mode 100644 index 0000000..fb1ddd5 --- /dev/null +++ b/test-output/staticFieldReadMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="staticFieldReadMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;\l|3: ARETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/staticFieldReadMethod.dt.dot b/test-output/staticFieldReadMethod.dt.dot new file mode 100644 index 0000000..135dbd3 --- /dev/null +++ b/test-output/staticFieldReadMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="staticFieldReadMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/staticFieldWriteMethod.asm.txt b/test-output/staticFieldWriteMethod.asm.txt new file mode 100644 index 0000000..20d506e --- /dev/null +++ b/test-output/staticFieldWriteMethod.asm.txt @@ -0,0 +1,8 @@ + Method: staticFieldWriteMethod(Ljava/lang/String;)V + 0: // label + 1: // line number information + 2: ALOAD 1 + 3: PUTSTATIC ExampleClass.staticField Ljava/lang/String; + 4: // label + 5: // line number information + 6: RETURN diff --git a/test-output/staticFieldWriteMethod.cfg.dot b/test-output/staticFieldWriteMethod.cfg.dot new file mode 100644 index 0000000..4f5f825 --- /dev/null +++ b/test-output/staticFieldWriteMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph staticFieldWriteMethod { + + node [shape=record] + "staticFieldWriteMethodbb-1" [shape=circle,label="e",xlabel="staticFieldWriteMethod"] + "staticFieldWriteMethodbb-2" [shape=circle,label="x"] + "staticFieldWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;|4: // label|5: // line number information|6: RETURN }"] + + "staticFieldWriteMethodbb-1" -> "staticFieldWriteMethodbb0" + "staticFieldWriteMethodbb0" -> "staticFieldWriteMethodbb-2" +} diff --git a/test-output/staticFieldWriteMethod.combined.dot b/test-output/staticFieldWriteMethod.combined.dot new file mode 100644 index 0000000..ff2cb80 --- /dev/null +++ b/test-output/staticFieldWriteMethod.combined.dot @@ -0,0 +1,10 @@ +digraph combined { + label="staticFieldWriteMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;\l|4: // label\l|5: // line number information\l|6: RETURN \l}"] + -1 -> 0 [label=""] + 0 -> -2 [label=""] + 0 -> -2 [style=dotted] + -1 -> 0 [style=dotted] +} diff --git a/test-output/staticFieldWriteMethod.dt.dot b/test-output/staticFieldWriteMethod.dt.dot new file mode 100644 index 0000000..bb4ac73 --- /dev/null +++ b/test-output/staticFieldWriteMethod.dt.dot @@ -0,0 +1,8 @@ +digraph dominatorTree { + label="staticFieldWriteMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-2)" + "D(0)" -> "D(-2)" + "D(-1)" -> "D(0)" +} diff --git a/test-output/switchMethod.asm.txt b/test-output/switchMethod.asm.txt new file mode 100644 index 0000000..ca1687e --- /dev/null +++ b/test-output/switchMethod.asm.txt @@ -0,0 +1,37 @@ + Method: switchMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ILOAD 1 + 7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26 + 8: // label + 9: // line number information + 10: // stack frame map + 11: ICONST_0 + 12: ISTORE 2 + 13: GOTO 31 + 14: // label + 15: // line number information + 16: // stack frame map + 17: ICONST_1 + 18: ISTORE 2 + 19: GOTO 31 + 20: // label + 21: // line number information + 22: // stack frame map + 23: ICONST_2 + 24: ISTORE 2 + 25: GOTO 31 + 26: // label + 27: // line number information + 28: // stack frame map + 29: ICONST_M1 + 30: ISTORE 2 + 31: // label + 32: // line number information + 33: // stack frame map + 34: ILOAD 2 + 35: IRETURN diff --git a/test-output/switchMethod.cfg.dot b/test-output/switchMethod.cfg.dot new file mode 100644 index 0000000..695ff2f --- /dev/null +++ b/test-output/switchMethod.cfg.dot @@ -0,0 +1,23 @@ +digraph switchMethod { + + node [shape=record] + "switchMethodbb-1" [shape=circle,label="e",xlabel="switchMethod"] + "switchMethodbb-2" [shape=circle,label="x"] + "switchMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26}"] + "switchMethodbb8" [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"] + "switchMethodbb14" [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"] + "switchMethodbb20" [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"] + "switchMethodbb26" [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"] + "switchMethodbb31" [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"] + + "switchMethodbb-1" -> "switchMethodbb0" + "switchMethodbb26" -> "switchMethodbb31" + "switchMethodbb31" -> "switchMethodbb-2" + "switchMethodbb0" -> "switchMethodbb8" [label="0"] + "switchMethodbb0" -> "switchMethodbb14" [label="1"] + "switchMethodbb0" -> "switchMethodbb20" [label="2"] + "switchMethodbb0" -> "switchMethodbb26" [label="default"] + "switchMethodbb8" -> "switchMethodbb31" [label="T"] + "switchMethodbb14" -> "switchMethodbb31" [label="T"] + "switchMethodbb20" -> "switchMethodbb31" [label="T"] +} diff --git a/test-output/switchMethod.combined.dot b/test-output/switchMethod.combined.dot new file mode 100644 index 0000000..6b937cb --- /dev/null +++ b/test-output/switchMethod.combined.dot @@ -0,0 +1,28 @@ +digraph combined { + label="switchMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}"] + 14 [shape=record,label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}"] + 20 [shape=record,label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}"] + 26 [shape=record,label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}"] + 31 [shape=record,label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}"] + -1 -> 0 [label=""] + 26 -> 31 [label=""] + 31 -> -2 [label=""] + 0 -> 8 [label="0"] + 0 -> 14 [label="1"] + 0 -> 20 [label="2"] + 0 -> 26 [label="default"] + 8 -> 31 [label="T"] + 14 -> 31 [label="T"] + 20 -> 31 [label="T"] + 31 -> -2 [style=dotted] + -1 -> 0 [style=dotted] + 0 -> 26 [style=dotted] + 0 -> 8 [style=dotted] + 0 -> 31 [style=dotted] + 0 -> 20 [style=dotted] + 0 -> 14 [style=dotted] +} diff --git a/test-output/switchMethod.dt.dot b/test-output/switchMethod.dt.dot new file mode 100644 index 0000000..5716e21 --- /dev/null +++ b/test-output/switchMethod.dt.dot @@ -0,0 +1,18 @@ +digraph dominatorTree { + label="switchMethod" + "D(-1)" [style=filled] + "D(31)" + "D(-2)" + "D(0)" + "D(26)" + "D(8)" + "D(20)" + "D(14)" + "D(31)" -> "D(-2)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(26)" + "D(0)" -> "D(8)" + "D(0)" -> "D(31)" + "D(0)" -> "D(20)" + "D(0)" -> "D(14)" +} diff --git a/test-output/switchMethod2.asm.txt b/test-output/switchMethod2.asm.txt new file mode 100644 index 0000000..db070f2 --- /dev/null +++ b/test-output/switchMethod2.asm.txt @@ -0,0 +1,37 @@ + Method: switchMethod2(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: ILOAD 1 + 7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26 + 8: // label + 9: // line number information + 10: // stack frame map + 11: ICONST_0 + 12: ISTORE 2 + 13: GOTO 31 + 14: // label + 15: // line number information + 16: // stack frame map + 17: ICONST_1 + 18: ISTORE 2 + 19: GOTO 31 + 20: // label + 21: // line number information + 22: // stack frame map + 23: ICONST_2 + 24: ISTORE 2 + 25: GOTO 31 + 26: // label + 27: // line number information + 28: // stack frame map + 29: ICONST_M1 + 30: ISTORE 2 + 31: // label + 32: // line number information + 33: // stack frame map + 34: ILOAD 2 + 35: IRETURN diff --git a/test-output/switchMethod2.cfg.dot b/test-output/switchMethod2.cfg.dot new file mode 100644 index 0000000..ca3be64 --- /dev/null +++ b/test-output/switchMethod2.cfg.dot @@ -0,0 +1,23 @@ +digraph switchMethod2 { + + node [shape=record] + "switchMethod2bb-1" [shape=circle,label="e",xlabel="switchMethod2"] + "switchMethod2bb-2" [shape=circle,label="x"] + "switchMethod2bb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26}"] + "switchMethod2bb8" [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"] + "switchMethod2bb14" [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"] + "switchMethod2bb20" [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"] + "switchMethod2bb26" [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"] + "switchMethod2bb31" [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"] + + "switchMethod2bb-1" -> "switchMethod2bb0" + "switchMethod2bb26" -> "switchMethod2bb31" + "switchMethod2bb31" -> "switchMethod2bb-2" + "switchMethod2bb0" -> "switchMethod2bb8" [label="0"] + "switchMethod2bb0" -> "switchMethod2bb14" [label="1000"] + "switchMethod2bb0" -> "switchMethod2bb20" [label="2000"] + "switchMethod2bb0" -> "switchMethod2bb26" [label="default"] + "switchMethod2bb8" -> "switchMethod2bb31" [label="T"] + "switchMethod2bb14" -> "switchMethod2bb31" [label="T"] + "switchMethod2bb20" -> "switchMethod2bb31" [label="T"] +} diff --git a/test-output/switchMethod2.combined.dot b/test-output/switchMethod2.combined.dot new file mode 100644 index 0000000..31f5823 --- /dev/null +++ b/test-output/switchMethod2.combined.dot @@ -0,0 +1,28 @@ +digraph combined { + label="switchMethod2" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26\l}"] + 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}"] + 14 [shape=record,label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}"] + 20 [shape=record,label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}"] + 26 [shape=record,label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}"] + 31 [shape=record,label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}"] + -1 -> 0 [label=""] + 26 -> 31 [label=""] + 31 -> -2 [label=""] + 0 -> 8 [label="0"] + 0 -> 14 [label="1000"] + 0 -> 20 [label="2000"] + 0 -> 26 [label="default"] + 8 -> 31 [label="T"] + 14 -> 31 [label="T"] + 20 -> 31 [label="T"] + 0 -> 31 [style=dotted] + 0 -> 8 [style=dotted] + 0 -> 14 [style=dotted] + 0 -> 20 [style=dotted] + -1 -> 0 [style=dotted] + 0 -> 26 [style=dotted] + 31 -> -2 [style=dotted] +} diff --git a/test-output/switchMethod2.dt.dot b/test-output/switchMethod2.dt.dot new file mode 100644 index 0000000..dc4f332 --- /dev/null +++ b/test-output/switchMethod2.dt.dot @@ -0,0 +1,18 @@ +digraph dominatorTree { + label="switchMethod2" + "D(-1)" [style=filled] + "D(0)" + "D(31)" + "D(8)" + "D(14)" + "D(20)" + "D(26)" + "D(-2)" + "D(0)" -> "D(31)" + "D(0)" -> "D(8)" + "D(0)" -> "D(14)" + "D(0)" -> "D(20)" + "D(-1)" -> "D(0)" + "D(0)" -> "D(26)" + "D(31)" -> "D(-2)" +} diff --git a/test-output/whileMethod.asm.txt b/test-output/whileMethod.asm.txt new file mode 100644 index 0000000..72bea2f --- /dev/null +++ b/test-output/whileMethod.asm.txt @@ -0,0 +1,25 @@ + Method: whileMethod(I)I + 0: // label + 1: // line number information + 2: ICONST_0 + 3: ISTORE 2 + 4: // label + 5: // line number information + 6: // stack frame map + 7: ILOAD 1 + 8: IFLE 19 + 9: // label + 10: // line number information + 11: ILOAD 2 + 12: ILOAD 1 + 13: IADD + 14: ISTORE 2 + 15: // label + 16: // line number information + 17: IINC 1 -1 + 18: GOTO 4 + 19: // label + 20: // line number information + 21: // stack frame map + 22: ILOAD 2 + 23: IRETURN diff --git a/test-output/whileMethod.cfg.dot b/test-output/whileMethod.cfg.dot new file mode 100644 index 0000000..b2f3503 --- /dev/null +++ b/test-output/whileMethod.cfg.dot @@ -0,0 +1,17 @@ +digraph whileMethod { + + node [shape=record] + "whileMethodbb-1" [shape=circle,label="e",xlabel="whileMethod"] + "whileMethodbb-2" [shape=circle,label="x"] + "whileMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + "whileMethodbb4" [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 1|8: IFLE 19}"] + "whileMethodbb9" [label="9|{9: // label|10: // line number information|11: ILOAD 2|12: ILOAD 1|13: IADD |14: ISTORE 2|15: // label|16: // line number information|17: IINC 1 -1|18: GOTO 4}"] + "whileMethodbb19" [label="19|{19: // label|20: // line number information|21: // stack frame map|22: ILOAD 2|23: IRETURN }"] + + "whileMethodbb-1" -> "whileMethodbb0" + "whileMethodbb0" -> "whileMethodbb4" + "whileMethodbb4" -> "whileMethodbb9" + "whileMethodbb19" -> "whileMethodbb-2" + "whileMethodbb9" -> "whileMethodbb4" [label="T"] + "whileMethodbb4" -> "whileMethodbb19" [label="T"] +} diff --git a/test-output/whileMethod.combined.dot b/test-output/whileMethod.combined.dot new file mode 100644 index 0000000..0fd3c61 --- /dev/null +++ b/test-output/whileMethod.combined.dot @@ -0,0 +1,20 @@ +digraph combined { + label="whileMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"] + 4 [shape=record,label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 1\l|8: IFLE 19\l}"] + 9 [shape=record,label="9|{9: // label\l|10: // line number information\l|11: ILOAD 2\l|12: ILOAD 1\l|13: IADD \l|14: ISTORE 2\l|15: // label\l|16: // line number information\l|17: IINC 1 -1\l|18: GOTO 4\l}"] + 19 [shape=record,label="19|{19: // label\l|20: // line number information\l|21: // stack frame map\l|22: ILOAD 2\l|23: IRETURN \l}"] + -1 -> 0 [label=""] + 0 -> 4 [label=""] + 4 -> 9 [label=""] + 19 -> -2 [label=""] + 9 -> 4 [label="T"] + 4 -> 19 [label="T"] + 0 -> 4 [style=dotted] + -1 -> 0 [style=dotted] + 19 -> -2 [style=dotted] + 4 -> 9 [style=dotted] + 4 -> 19 [style=dotted] +} diff --git a/test-output/whileMethod.dt.dot b/test-output/whileMethod.dt.dot new file mode 100644 index 0000000..8d3641f --- /dev/null +++ b/test-output/whileMethod.dt.dot @@ -0,0 +1,14 @@ +digraph dominatorTree { + label="whileMethod" + "D(-1)" [style=filled] + "D(0)" + "D(4)" + "D(19)" + "D(-2)" + "D(9)" + "D(0)" -> "D(4)" + "D(-1)" -> "D(0)" + "D(19)" -> "D(-2)" + "D(4)" -> "D(9)" + "D(4)" -> "D(19)" +} diff --git a/test-output/whileTrueMethod.asm.txt b/test-output/whileTrueMethod.asm.txt new file mode 100644 index 0000000..185b4da --- /dev/null +++ b/test-output/whileTrueMethod.asm.txt @@ -0,0 +1,6 @@ + Method: whileTrueMethod(I)I + 0: // label + 1: // line number information + 2: // stack frame map + 3: IINC 1 1 + 4: GOTO 0 diff --git a/test-output/whileTrueMethod.cfg.dot b/test-output/whileTrueMethod.cfg.dot new file mode 100644 index 0000000..11743c1 --- /dev/null +++ b/test-output/whileTrueMethod.cfg.dot @@ -0,0 +1,10 @@ +digraph whileTrueMethod { + + node [shape=record] + "whileTrueMethodbb-1" [shape=circle,label="e",xlabel="whileTrueMethod"] + "whileTrueMethodbb-2" [shape=circle,label="e",xlabel="whileTrueMethod"] + "whileTrueMethodbb0" [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: GOTO 0}"] + + "whileTrueMethodbb-1" -> "whileTrueMethodbb0" + "whileTrueMethodbb0" -> "whileTrueMethodbb0" [label="T"] +} diff --git a/test-output/whileTrueMethod.combined.dot b/test-output/whileTrueMethod.combined.dot new file mode 100644 index 0000000..a6b8d8d --- /dev/null +++ b/test-output/whileTrueMethod.combined.dot @@ -0,0 +1,9 @@ +digraph combined { + label="whileTrueMethod" + -1 [shape=record,style=filled,label="-1|entry"] + -2 [shape=record,label="-2|exit"] + 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: GOTO 0\l}"] + -1 -> 0 [label=""] + 0 -> 0 [label="T"] + -1 -> 0 [style=dotted] +} diff --git a/test-output/whileTrueMethod.dt.dot b/test-output/whileTrueMethod.dt.dot new file mode 100644 index 0000000..4312a93 --- /dev/null +++ b/test-output/whileTrueMethod.dt.dot @@ -0,0 +1,6 @@ +digraph dominatorTree { + label="whileTrueMethod" + "D(-1)" [style=filled] + "D(0)" + "D(-1)" -> "D(0)" +}