From 7bcd8c53dffdebf96c94d6a2aa6bfc9bf8f788fa Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Wed, 18 Oct 2023 23:10:43 +0200 Subject: [PATCH] done --- .gitignore | 2 + .idea/jpa-buddy.xml | 6 + .idea/misc.xml | 3 + README.md | 47 +- compile-tests.sh | 9 + src/ch/usi/inf/sp/cfg/ControlFlowGraph.java | 24 +- .../inf/sp/cfg/ControlFlowGraphBuilder.java | 144 +- .../inf/sp/cfg/ControlFlowGraphRenderer.java | 60 +- src/ch/usi/inf/sp/cfg/builder/JumpSource.java | 40 + .../LookupSwitchInstructionNodeInfo.java | 38 + src/ch/usi/inf/sp/cfg/builder/MultiMap.java | 23 + .../builder/SwitchInstructionNodeInfo.java | 13 + .../TableSwitchInstructionNodeInfo.java | 38 + src/ch/usi/inf/sp/dom/DominatorAnalyzer.java | 72 +- src/ch/usi/inf/sp/graph/Traversal.java | 30 +- starter-lab-04-dominator-analysis.iml | 16 + test-output/.asm.txt | 6 + test-output/.cfg.dot | 10 + test-output/.combined.dot | 10 + test-output/.dt.dot | 8 + test-output/all.cfg.dot | 805 +++++++++++ test-output/all.cfg.pdf | Bin 0 -> 71759 bytes test-output/all.combined.dot | 1206 +++++++++++++++++ test-output/all.combined.pdf | Bin 0 -> 76303 bytes test-output/all.dt.dot | 448 ++++++ test-output/all.dt.pdf | Bin 0 -> 31216 bytes test-output/alloc2Of3dArrayMethod.asm.txt | 7 + test-output/alloc2Of3dArrayMethod.cfg.dot | 10 + .../alloc2Of3dArrayMethod.combined.dot | 10 + test-output/alloc2Of3dArrayMethod.dt.dot | 8 + test-output/alloc2dArrayMethod.asm.txt | 7 + test-output/alloc2dArrayMethod.cfg.dot | 10 + test-output/alloc2dArrayMethod.combined.dot | 10 + test-output/alloc2dArrayMethod.dt.dot | 8 + test-output/allocAndInit2dArrayMethod.asm.txt | 15 + test-output/allocAndInit2dArrayMethod.cfg.dot | 10 + .../allocAndInit2dArrayMethod.combined.dot | 10 + test-output/allocAndInit2dArrayMethod.dt.dot | 8 + .../allocAndInitIntArrayMethod.asm.txt | 14 + .../allocAndInitIntArrayMethod.cfg.dot | 10 + .../allocAndInitIntArrayMethod.combined.dot | 10 + test-output/allocAndInitIntArrayMethod.dt.dot | 8 + .../allocAndInitObjectArrayMethod.asm.txt | 14 + .../allocAndInitObjectArrayMethod.cfg.dot | 10 + ...allocAndInitObjectArrayMethod.combined.dot | 10 + .../allocAndInitObjectArrayMethod.dt.dot | 8 + .../allocIncomplete2dArrayMethod.asm.txt | 6 + .../allocIncomplete2dArrayMethod.cfg.dot | 10 + .../allocIncomplete2dArrayMethod.combined.dot | 10 + .../allocIncomplete2dArrayMethod.dt.dot | 8 + test-output/allocIntArrayMethod.asm.txt | 6 + test-output/allocIntArrayMethod.cfg.dot | 10 + test-output/allocIntArrayMethod.combined.dot | 10 + test-output/allocIntArrayMethod.dt.dot | 8 + test-output/allocObjectArrayMethod.asm.txt | 6 + test-output/allocObjectArrayMethod.cfg.dot | 10 + .../allocObjectArrayMethod.combined.dot | 10 + test-output/allocObjectArrayMethod.dt.dot | 8 + test-output/allocObjectMethod.asm.txt | 7 + test-output/allocObjectMethod.cfg.dot | 10 + test-output/allocObjectMethod.combined.dot | 10 + test-output/allocObjectMethod.dt.dot | 8 + test-output/arrayLengthMethod.asm.txt | 6 + test-output/arrayLengthMethod.cfg.dot | 10 + test-output/arrayLengthMethod.combined.dot | 10 + test-output/arrayLengthMethod.dt.dot | 8 + test-output/arrayReadMethod.asm.txt | 7 + test-output/arrayReadMethod.cfg.dot | 10 + test-output/arrayReadMethod.combined.dot | 10 + test-output/arrayReadMethod.dt.dot | 8 + test-output/arrayWriteMethod.asm.txt | 10 + test-output/arrayWriteMethod.cfg.dot | 10 + test-output/arrayWriteMethod.combined.dot | 10 + test-output/arrayWriteMethod.dt.dot | 8 + test-output/condMethod.asm.txt | 14 + test-output/condMethod.cfg.dot | 17 + test-output/condMethod.combined.dot | 20 + test-output/condMethod.dt.dot | 14 + test-output/doWhileMethod.asm.txt | 23 + test-output/doWhileMethod.cfg.dot | 15 + test-output/doWhileMethod.combined.dot | 17 + test-output/doWhileMethod.dt.dot | 12 + test-output/doWhileTrue.asm.txt | 8 + test-output/doWhileTrue.cfg.dot | 10 + test-output/doWhileTrue.combined.dot | 9 + test-output/doWhileTrue.dt.dot | 6 + test-output/emptyMethod.asm.txt | 4 + test-output/emptyMethod.cfg.dot | 10 + test-output/emptyMethod.combined.dot | 10 + test-output/emptyMethod.dt.dot | 8 + test-output/fieldReadMethod.asm.txt | 6 + test-output/fieldReadMethod.cfg.dot | 10 + test-output/fieldReadMethod.combined.dot | 10 + test-output/fieldReadMethod.dt.dot | 8 + test-output/fieldWriteMethod.asm.txt | 9 + test-output/fieldWriteMethod.cfg.dot | 10 + test-output/fieldWriteMethod.combined.dot | 10 + test-output/fieldWriteMethod.dt.dot | 8 + test-output/forEachArrayMethod.asm.txt | 35 + test-output/forEachArrayMethod.cfg.dot | 17 + test-output/forEachArrayMethod.combined.dot | 20 + test-output/forEachArrayMethod.dt.dot | 14 + test-output/forEachCollectionMethod.asm.txt | 30 + test-output/forEachCollectionMethod.cfg.dot | 17 + .../forEachCollectionMethod.combined.dot | 20 + test-output/forEachCollectionMethod.dt.dot | 14 + test-output/forEver.asm.txt | 9 + test-output/forEver.cfg.dot | 12 + test-output/forEver.combined.dot | 12 + test-output/forEver.dt.dot | 8 + test-output/forMethod.asm.txt | 29 + test-output/forMethod.cfg.dot | 17 + test-output/forMethod.combined.dot | 20 + test-output/forMethod.dt.dot | 14 + test-output/forWithBreakMethod.asm.txt | 38 + test-output/forWithBreakMethod.cfg.dot | 22 + test-output/forWithBreakMethod.combined.dot | 27 + test-output/forWithBreakMethod.dt.dot | 18 + test-output/forWithContinueMethod.asm.txt | 39 + test-output/forWithContinueMethod.cfg.dot | 24 + .../forWithContinueMethod.combined.dot | 30 + test-output/forWithContinueMethod.dt.dot | 20 + test-output/ifElseMethod.asm.txt | 24 + test-output/ifElseMethod.cfg.dot | 17 + test-output/ifElseMethod.combined.dot | 20 + test-output/ifElseMethod.dt.dot | 14 + test-output/ifMethod.asm.txt | 18 + test-output/ifMethod.cfg.dot | 15 + test-output/ifMethod.combined.dot | 17 + test-output/ifMethod.dt.dot | 12 + test-output/instanceCallMethod.asm.txt | 9 + test-output/instanceCallMethod.cfg.dot | 10 + test-output/instanceCallMethod.combined.dot | 10 + test-output/instanceCallMethod.dt.dot | 8 + test-output/instanceCallTarget.asm.txt | 4 + test-output/instanceCallTarget.cfg.dot | 10 + test-output/instanceCallTarget.combined.dot | 10 + test-output/instanceCallTarget.dt.dot | 8 + test-output/interfaceCallMethod.asm.txt | 9 + test-output/interfaceCallMethod.cfg.dot | 10 + test-output/interfaceCallMethod.combined.dot | 10 + test-output/interfaceCallMethod.dt.dot | 8 + test-output/nestedFor.asm.txt | 43 + test-output/nestedFor.cfg.dot | 24 + test-output/nestedFor.combined.dot | 30 + test-output/nestedFor.dt.dot | 20 + test-output/nonShortCircuitMethod.asm.txt | 34 + test-output/nonShortCircuitMethod.cfg.dot | 30 + .../nonShortCircuitMethod.combined.dot | 38 + test-output/nonShortCircuitMethod.dt.dot | 24 + test-output/privateInstanceCallMethod.asm.txt | 9 + test-output/privateInstanceCallMethod.cfg.dot | 10 + .../privateInstanceCallMethod.combined.dot | 10 + test-output/privateInstanceCallMethod.dt.dot | 8 + test-output/privateInstanceCallTarget.asm.txt | 4 + test-output/privateInstanceCallTarget.cfg.dot | 10 + .../privateInstanceCallTarget.combined.dot | 10 + test-output/privateInstanceCallTarget.dt.dot | 8 + test-output/shortCircuitMethod.asm.txt | 18 + test-output/shortCircuitMethod.cfg.dot | 19 + test-output/shortCircuitMethod.combined.dot | 22 + test-output/shortCircuitMethod.dt.dot | 14 + test-output/staticCallMethod.asm.txt | 8 + test-output/staticCallMethod.cfg.dot | 10 + test-output/staticCallMethod.combined.dot | 10 + test-output/staticCallMethod.dt.dot | 8 + test-output/staticCallTarget.asm.txt | 4 + test-output/staticCallTarget.cfg.dot | 10 + test-output/staticCallTarget.combined.dot | 10 + test-output/staticCallTarget.dt.dot | 8 + test-output/staticFieldReadMethod.asm.txt | 5 + test-output/staticFieldReadMethod.cfg.dot | 10 + .../staticFieldReadMethod.combined.dot | 10 + test-output/staticFieldReadMethod.dt.dot | 8 + test-output/staticFieldWriteMethod.asm.txt | 8 + test-output/staticFieldWriteMethod.cfg.dot | 10 + .../staticFieldWriteMethod.combined.dot | 10 + test-output/staticFieldWriteMethod.dt.dot | 8 + test-output/switchMethod.asm.txt | 37 + test-output/switchMethod.cfg.dot | 23 + test-output/switchMethod.combined.dot | 28 + test-output/switchMethod.dt.dot | 18 + test-output/switchMethod2.asm.txt | 37 + test-output/switchMethod2.cfg.dot | 23 + test-output/switchMethod2.combined.dot | 28 + test-output/switchMethod2.dt.dot | 18 + test-output/whileMethod.asm.txt | 25 + test-output/whileMethod.cfg.dot | 17 + test-output/whileMethod.combined.dot | 20 + test-output/whileMethod.dt.dot | 14 + test-output/whileTrueMethod.asm.txt | 6 + test-output/whileTrueMethod.cfg.dot | 10 + test-output/whileTrueMethod.combined.dot | 9 + test-output/whileTrueMethod.dt.dot | 6 + 194 files changed, 5282 insertions(+), 75 deletions(-) create mode 100644 .gitignore create mode 100644 .idea/jpa-buddy.xml create mode 100755 compile-tests.sh create mode 100644 src/ch/usi/inf/sp/cfg/builder/JumpSource.java create mode 100644 src/ch/usi/inf/sp/cfg/builder/LookupSwitchInstructionNodeInfo.java create mode 100644 src/ch/usi/inf/sp/cfg/builder/MultiMap.java create mode 100644 src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java create mode 100644 src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java create mode 100644 test-output/.asm.txt create mode 100644 test-output/.cfg.dot create mode 100644 test-output/.combined.dot create mode 100644 test-output/.dt.dot create mode 100644 test-output/all.cfg.dot create mode 100644 test-output/all.cfg.pdf create mode 100644 test-output/all.combined.dot create mode 100644 test-output/all.combined.pdf create mode 100644 test-output/all.dt.dot create mode 100644 test-output/all.dt.pdf create mode 100644 test-output/alloc2Of3dArrayMethod.asm.txt create mode 100644 test-output/alloc2Of3dArrayMethod.cfg.dot create mode 100644 test-output/alloc2Of3dArrayMethod.combined.dot create mode 100644 test-output/alloc2Of3dArrayMethod.dt.dot create mode 100644 test-output/alloc2dArrayMethod.asm.txt create mode 100644 test-output/alloc2dArrayMethod.cfg.dot create mode 100644 test-output/alloc2dArrayMethod.combined.dot create mode 100644 test-output/alloc2dArrayMethod.dt.dot create mode 100644 test-output/allocAndInit2dArrayMethod.asm.txt create mode 100644 test-output/allocAndInit2dArrayMethod.cfg.dot create mode 100644 test-output/allocAndInit2dArrayMethod.combined.dot create mode 100644 test-output/allocAndInit2dArrayMethod.dt.dot create mode 100644 test-output/allocAndInitIntArrayMethod.asm.txt create mode 100644 test-output/allocAndInitIntArrayMethod.cfg.dot create mode 100644 test-output/allocAndInitIntArrayMethod.combined.dot create mode 100644 test-output/allocAndInitIntArrayMethod.dt.dot create mode 100644 test-output/allocAndInitObjectArrayMethod.asm.txt create mode 100644 test-output/allocAndInitObjectArrayMethod.cfg.dot create mode 100644 test-output/allocAndInitObjectArrayMethod.combined.dot create mode 100644 test-output/allocAndInitObjectArrayMethod.dt.dot create mode 100644 test-output/allocIncomplete2dArrayMethod.asm.txt create mode 100644 test-output/allocIncomplete2dArrayMethod.cfg.dot create mode 100644 test-output/allocIncomplete2dArrayMethod.combined.dot create mode 100644 test-output/allocIncomplete2dArrayMethod.dt.dot create mode 100644 test-output/allocIntArrayMethod.asm.txt create mode 100644 test-output/allocIntArrayMethod.cfg.dot create mode 100644 test-output/allocIntArrayMethod.combined.dot create mode 100644 test-output/allocIntArrayMethod.dt.dot create mode 100644 test-output/allocObjectArrayMethod.asm.txt create mode 100644 test-output/allocObjectArrayMethod.cfg.dot create mode 100644 test-output/allocObjectArrayMethod.combined.dot create mode 100644 test-output/allocObjectArrayMethod.dt.dot create mode 100644 test-output/allocObjectMethod.asm.txt create mode 100644 test-output/allocObjectMethod.cfg.dot create mode 100644 test-output/allocObjectMethod.combined.dot create mode 100644 test-output/allocObjectMethod.dt.dot create mode 100644 test-output/arrayLengthMethod.asm.txt create mode 100644 test-output/arrayLengthMethod.cfg.dot create mode 100644 test-output/arrayLengthMethod.combined.dot create mode 100644 test-output/arrayLengthMethod.dt.dot create mode 100644 test-output/arrayReadMethod.asm.txt create mode 100644 test-output/arrayReadMethod.cfg.dot create mode 100644 test-output/arrayReadMethod.combined.dot create mode 100644 test-output/arrayReadMethod.dt.dot create mode 100644 test-output/arrayWriteMethod.asm.txt create mode 100644 test-output/arrayWriteMethod.cfg.dot create mode 100644 test-output/arrayWriteMethod.combined.dot create mode 100644 test-output/arrayWriteMethod.dt.dot create mode 100644 test-output/condMethod.asm.txt create mode 100644 test-output/condMethod.cfg.dot create mode 100644 test-output/condMethod.combined.dot create mode 100644 test-output/condMethod.dt.dot create mode 100644 test-output/doWhileMethod.asm.txt create mode 100644 test-output/doWhileMethod.cfg.dot create mode 100644 test-output/doWhileMethod.combined.dot create mode 100644 test-output/doWhileMethod.dt.dot create mode 100644 test-output/doWhileTrue.asm.txt create mode 100644 test-output/doWhileTrue.cfg.dot create mode 100644 test-output/doWhileTrue.combined.dot create mode 100644 test-output/doWhileTrue.dt.dot create mode 100644 test-output/emptyMethod.asm.txt create mode 100644 test-output/emptyMethod.cfg.dot create mode 100644 test-output/emptyMethod.combined.dot create mode 100644 test-output/emptyMethod.dt.dot create mode 100644 test-output/fieldReadMethod.asm.txt create mode 100644 test-output/fieldReadMethod.cfg.dot create mode 100644 test-output/fieldReadMethod.combined.dot create mode 100644 test-output/fieldReadMethod.dt.dot create mode 100644 test-output/fieldWriteMethod.asm.txt create mode 100644 test-output/fieldWriteMethod.cfg.dot create mode 100644 test-output/fieldWriteMethod.combined.dot create mode 100644 test-output/fieldWriteMethod.dt.dot create mode 100644 test-output/forEachArrayMethod.asm.txt create mode 100644 test-output/forEachArrayMethod.cfg.dot create mode 100644 test-output/forEachArrayMethod.combined.dot create mode 100644 test-output/forEachArrayMethod.dt.dot create mode 100644 test-output/forEachCollectionMethod.asm.txt create mode 100644 test-output/forEachCollectionMethod.cfg.dot create mode 100644 test-output/forEachCollectionMethod.combined.dot create mode 100644 test-output/forEachCollectionMethod.dt.dot create mode 100644 test-output/forEver.asm.txt create mode 100644 test-output/forEver.cfg.dot create mode 100644 test-output/forEver.combined.dot create mode 100644 test-output/forEver.dt.dot create mode 100644 test-output/forMethod.asm.txt create mode 100644 test-output/forMethod.cfg.dot create mode 100644 test-output/forMethod.combined.dot create mode 100644 test-output/forMethod.dt.dot create mode 100644 test-output/forWithBreakMethod.asm.txt create mode 100644 test-output/forWithBreakMethod.cfg.dot create mode 100644 test-output/forWithBreakMethod.combined.dot create mode 100644 test-output/forWithBreakMethod.dt.dot create mode 100644 test-output/forWithContinueMethod.asm.txt create mode 100644 test-output/forWithContinueMethod.cfg.dot create mode 100644 test-output/forWithContinueMethod.combined.dot create mode 100644 test-output/forWithContinueMethod.dt.dot create mode 100644 test-output/ifElseMethod.asm.txt create mode 100644 test-output/ifElseMethod.cfg.dot create mode 100644 test-output/ifElseMethod.combined.dot create mode 100644 test-output/ifElseMethod.dt.dot create mode 100644 test-output/ifMethod.asm.txt create mode 100644 test-output/ifMethod.cfg.dot create mode 100644 test-output/ifMethod.combined.dot create mode 100644 test-output/ifMethod.dt.dot create mode 100644 test-output/instanceCallMethod.asm.txt create mode 100644 test-output/instanceCallMethod.cfg.dot create mode 100644 test-output/instanceCallMethod.combined.dot create mode 100644 test-output/instanceCallMethod.dt.dot create mode 100644 test-output/instanceCallTarget.asm.txt create mode 100644 test-output/instanceCallTarget.cfg.dot create mode 100644 test-output/instanceCallTarget.combined.dot create mode 100644 test-output/instanceCallTarget.dt.dot create mode 100644 test-output/interfaceCallMethod.asm.txt create mode 100644 test-output/interfaceCallMethod.cfg.dot create mode 100644 test-output/interfaceCallMethod.combined.dot create mode 100644 test-output/interfaceCallMethod.dt.dot create mode 100644 test-output/nestedFor.asm.txt create mode 100644 test-output/nestedFor.cfg.dot create mode 100644 test-output/nestedFor.combined.dot create mode 100644 test-output/nestedFor.dt.dot create mode 100644 test-output/nonShortCircuitMethod.asm.txt create mode 100644 test-output/nonShortCircuitMethod.cfg.dot create mode 100644 test-output/nonShortCircuitMethod.combined.dot create mode 100644 test-output/nonShortCircuitMethod.dt.dot create mode 100644 test-output/privateInstanceCallMethod.asm.txt create mode 100644 test-output/privateInstanceCallMethod.cfg.dot create mode 100644 test-output/privateInstanceCallMethod.combined.dot create mode 100644 test-output/privateInstanceCallMethod.dt.dot create mode 100644 test-output/privateInstanceCallTarget.asm.txt create mode 100644 test-output/privateInstanceCallTarget.cfg.dot create mode 100644 test-output/privateInstanceCallTarget.combined.dot create mode 100644 test-output/privateInstanceCallTarget.dt.dot create mode 100644 test-output/shortCircuitMethod.asm.txt create mode 100644 test-output/shortCircuitMethod.cfg.dot create mode 100644 test-output/shortCircuitMethod.combined.dot create mode 100644 test-output/shortCircuitMethod.dt.dot create mode 100644 test-output/staticCallMethod.asm.txt create mode 100644 test-output/staticCallMethod.cfg.dot create mode 100644 test-output/staticCallMethod.combined.dot create mode 100644 test-output/staticCallMethod.dt.dot create mode 100644 test-output/staticCallTarget.asm.txt create mode 100644 test-output/staticCallTarget.cfg.dot create mode 100644 test-output/staticCallTarget.combined.dot create mode 100644 test-output/staticCallTarget.dt.dot create mode 100644 test-output/staticFieldReadMethod.asm.txt create mode 100644 test-output/staticFieldReadMethod.cfg.dot create mode 100644 test-output/staticFieldReadMethod.combined.dot create mode 100644 test-output/staticFieldReadMethod.dt.dot create mode 100644 test-output/staticFieldWriteMethod.asm.txt create mode 100644 test-output/staticFieldWriteMethod.cfg.dot create mode 100644 test-output/staticFieldWriteMethod.combined.dot create mode 100644 test-output/staticFieldWriteMethod.dt.dot create mode 100644 test-output/switchMethod.asm.txt create mode 100644 test-output/switchMethod.cfg.dot create mode 100644 test-output/switchMethod.combined.dot create mode 100644 test-output/switchMethod.dt.dot create mode 100644 test-output/switchMethod2.asm.txt create mode 100644 test-output/switchMethod2.cfg.dot create mode 100644 test-output/switchMethod2.combined.dot create mode 100644 test-output/switchMethod2.dt.dot create mode 100644 test-output/whileMethod.asm.txt create mode 100644 test-output/whileMethod.cfg.dot create mode 100644 test-output/whileMethod.combined.dot create mode 100644 test-output/whileMethod.dt.dot create mode 100644 test-output/whileTrueMethod.asm.txt create mode 100644 test-output/whileTrueMethod.cfg.dot create mode 100644 test-output/whileTrueMethod.combined.dot create mode 100644 test-output/whileTrueMethod.dt.dot 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 0000000000000000000000000000000000000000..c4bf8f7e59a6c30928217e62724f9f905fdffeac GIT binary patch literal 71759 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

x&uAxw=pO0%6%H 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 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 0000000000000000000000000000000000000000..c106b8ad16c02a9bbbc87695a7423a36a7486834 GIT binary patch literal 76303 zcmV)yK$5>DP((&8F)lX>CAICY`wBE5Fd%PYY6?6&ATLa1ZfA68AT=N`AW{k-ARsSB zX>4?5av(28Y+-a|L}g=dWMv9IJ_>Vma%Ev{3V59Cy;-v@J8~ZOzJJAj@WVL~?#03k z*a}7TX_8Hf&B0`o3c0CpP?ux-9!er9+5Y#=FB3o&YDTTKryDyMyuAyjP%9IODttMs z=Yjt3XNvx#wHls(`2O_YpN3o1!8#gT{P8dU@ccV}Gd%ypzdj8-^Ur_zte*cLy7&+D z|G$0u&3~p_hv&b2qDTGlvl`4TxMw@u+;dRR#y|hd-#vfJGwDg+e*L8EZ5Re^ZKk7M zDy1;jo11e(i0b**-=BWx?|(M@Y@i?f_1{1J=F88%D*Z)${m;Mt4^O}M>j^nVJqJ&} z_?`dcAOG?BFHZidNqax}cVCtJ^3PvY{PJ&K)$rwCK*9gFpuo~vn((Yrq@PX^OrQLD z8=rMjw_)|?zYJf0{oCe;yv7n41778C{O)OH!@yIVy_sR1-vO-tZ_FV5gR1}V@BY0S z{@pPA`}_}+8DD=!Gk)i*QuLp-X=-QMk66>c!4m%${4Ou{kBimKjC#c))&`3#SG|mf zc#9j1tJi1zpYWf57RJ{e;C3Fs)BXqk^Zo13w4bcszpOq>?>uXy<@dg7{pHu-^e@3AkNwFir@nC7ei+@& zTK+gj&0j}-b4t@!I^OhP@U^@J`fLSvi^|ibxoMT?Sa5vX4^zG-5B0a86yK%j^YxwQ zIU8tA+)cYk>!Ea_dmP_mqM?z0d|J-?_Vk-){p{%g!SP`YeFf7&<4CKe>1L#r z{#i$LKDtp)tK`xmB^uu+ce1zq&C+XBX!_0%FtjVCbf=r8pC~lS-kQ(* zc7VgiFO|OzvwXM+vwW&B3xD>(ET0|#vz#7oO1o!8D`^~k7wFH_^YS?z`2jtU%aJf6 zKHIcozSk>|aGH7InkVVOeJJ2nnAJ+N*dyU5Q?L8kr&Hk*e!UF*s-mI~^F&ZR%0U&= zj(RYHus_7g|Kh850AY?$36c62Kq?GZ{;#jbWrQ_finxYUD)|}YR|fiEeq~_?=$n>> zk>)?G5bO6=A=aJ@m&bMGh!Jt+rw0=kZuU^IeaD}Tf|U#NooKnTzk`?E=V#*~pAE4n zR6&_5Vj>u`wM%{b&ix8%P0`)lhVJHfcwd5(%7{ztp5yC&W}t>_FcT^>qYldd`6K-2 zFTv5D;UDPBGJN@uB#g}Uufg>%@O}A%ZiX+SgNSMW>)N!Rjo;zb^)0_S{-^)f`6>1y z33~eL;VKE^Q!bG3xB2b#c*CrG_xR=gQ4}Nk&qa#-3b<}nb)U@5D*FtJB7uLONN+H( zR)!nt3w-Scx~BU{72Z%$eDbuhEi26_@>4Zy>WVa-lyDUJnDQ;2l_)4Ci)oEM6^2$( z4+LrlI@U6!VW7$0S4#2E_^EwLt1=Y^Qk3%Tphun$MSY|>3_9P#^nv8%G}6;amxuNx zR#`=CcWCJ;>?q0fUd@yQEw=06*!-0Z*{u1U{6Vb}&(VJKBO2e~QD0bv1&BB|kxe6f z)y+CSy&J5j&tv|sW4?&V#ZgGELxC+K3fuaty5pd@D5rn@s;uzN`}7Aa#s9tfl(1t5 z=5IT%C_hD(bzSCrCv+8u`|{s5*FWm%YZAM(=puu3phT;Mie?3#6cud{B+{#*l~3Fd zDhK$xm;Ru)wM!;_reeO7epc8qY9bQ3>SoCvxRpkg^Osp+_9BBn?FNG8>jwO_e6X8n zZ#uwEZ3#f&*tB}MX*$iUNjEx{tv9!5{Ij7mUb|<n(`(n#*w@S$5y?Y(UC2C>XrzBVZmS=j-)`)|9Hh{#~NNQ3jjsjTavt^ z;U`B}#0A)r2euj86lDEo>+9o9drix0X{#h!UQ1wxu4x>;2I#nEa8JCzpyB`~88Z-E zbh2u^&Y%mc>=?uuyk#V2N954jV3HR)I!1hK(HV7M^dzpa@_f zcsi$@Q+%{PIc51d&JY9$f&PJzNl@%`G%oR33>(Gz(e4n7kqiR>MZZmegpRj?j%1wb zihah8HUMHGfS-UqaH=oooy1RtiB0_Uo240WzH}2n#a`?b1%Z0c@oBUnuxN?Fo{Pf` zeq%>~4`CK;YE6y_H^&hi&e@wXw5s$Ld+Qjm`I`@dEfFO^>th24hhTjmCtjb$yl+q5 z+<|+%J;XhFeYFs)QE^Yc=)yfd9O9nQ;Q7vQPvJM?o@lS&p0WTtxJOTP;7{Ch5%&~f zG43g%>cKrlP&>FsPn7*n+_NEojC+a*`fyJX!Vd1yt$E@E?$PIQPx;<4?#V24;hxOE z9`4Z-J@2J)PvIxyp2ATd?kPO&;2u3u-Ch#+BzJRSGO~`LX+nft;<&gl73B*f|xH%J7JulMtCk2tx}rA+fI?@Bx+!r^F_taWV$N4PvLD z$Fh|uD1r<|tWVAe?pe+|iF*ncJGe)8;2zM%@n~2^h3_TUcG0te1V9JdchG@=kiRK- z#B>8CI&k&S1*t{t0J%byL9v~nROBZnD zDlrYgM8u1^nD^}|dI3o!4ebOcv61OKQi|amQd)XLW0E(`a+u@ya-C^8{jQ}!K7feT z-Y4Mw;ibZ|b+QC%2yzC&@Hc{m*#c7!5;@X z6*bXj@4q*x2R!{TQLcMTN99APQoF12KsPtWZ|*8H(HvhINd>q=1bW~I zqGKvaT8GuMAvvz5Zsjra6CCWAYf8SNIS%#83*>}Bsy~8O!9T7%(@L4GN1{Cviu#_6T?UZT*O`uYVD6 zv;#xpKzLGT^NRp(Bu{9?Ml87QB60=>z!1Yp2{F16h9p?Jf&mO6?qYbRruKizsfB2*DKMZcF?d0p;B~SxNZZ{(Pbu9ruJ^WGS zWrnG==&D~M2ko42!NVPVI^_C-!_Pt^q*&0N$E2N$_utO<= z71pPxXBRx5r8FWYlMv%fiun$oyG{qNpuYpM#AZ<=uwfV0G3e$9fi2# z;AoB6t3>xZc6&f9ksVGnBsr}=@>5m9U38eb9M`)t^&3adI^=X_dwg#`YfypblbW+7 z-Hn7+fKhA=6ODk|Iv}*1Pph`FN%v?t%xX380{Q^&Og4uZD-mJ@*mO*^D*omnT8-2I zRU&+fq^;L5mOT-aqJ2&q%w>mI@)BX>Y4Z?{BsAc+5fuHvEg|eXY5HHl4nt_oV`B|N zhM@3Q!XKCti8DuR&!?S@p)$PEfP(8E8hZEU>5z_%d03_#H$~_MsjZQq9k!gu0!FAD ziBnzKibz{3(bo*faw}AwUP8PVh&PknFetW3C3-zA^PLRa&r)C}B~pDp>ueIN9eNoL zmW@v%<9Q&e$QHbOnGl2JT)ia9kYl`I{FI%`MHx6;k;s8D znK{=9;to-&3M4O@2eZDIM;|a!5uz2K?sekt2>nH`j0*Aw!la5yya0uuL(R7XP(MU9Y z5$O#3L{DtNk(2N%UEf)Z_-jf%Z3;fP3ZX*%V(RJCbfuENUIIuD_F@ent!*s=gugqh z0BQP?-kqPWu*)tM0#aD~p1gFWoEwV)m8-6dU!|muz(*?xRGH1$!nEwFza~)S{;bUKU8}WnG}<)V6+$Cbgic420TCO=%!)Qd1iUH}n(- z(p>qcsSZTn(Rq0w4bSYnKG1UNwOnZwZ_2s!N)X*I^*z+N>1Ad^UEMczO8fG3~YtLZHfbt`PWG6WZxVw7L6DV_~K`k zDr?J`%VT<0XAS2v)b&a450=pjPF6=gL9N=CzS}sQb!PLhCu*&ZKkN zM0c0%Q<-Eg8b6if7EG+4<4C9ZQz2vVZu=*JslfKlBuTAWas##P!YxB`{E!_V5^eYe zcp*S-*xBmK*Qg9-YC7IvC52yLXy5uEy+JvF69A@gEO7$Z+DU5Kp>D#YknHbsgejyqey24(x z`=WURUGDr*K*y@eTMdFaYoxPxjFqjq+8+RUB*Ij8D2?!W2*>1L zVTvT!j9i%Llz1iCNe^#$WasskS~h4d%YxgqWwi{JL&O~K=UXK!|Flk>Dl(4z90k@B`Z4DwB8;gV$E2k7LkN7{A|xu=(z9Yd^K68SkwRoWQCtlk zK=53&^W|_uBs?&1T#+(bDs&*WOWMR(?zIquB>pPnX|hgFoOdIELI_w(#3L-c9QQjaaqXixbR*&(23N`v*VdhA}P@8|uCVm4b@)A0jfen}(0!M8k zDv{6$1`^k)jVQRL;WSn`BoL8R3{9L4Pn@*)CAHgRJm&+ z=@gQjr=fIDTgzaTpGU;;@o9-P-I~lNW*+Z9p9j*(Rcn2bz#N8c|J5-4^we zUN7u-X+q=J{yqzikI_UMx)4Zp-2^SusaGCGdGD9z{Wwukgx2H6#UZSko(%Wd6kr%$!;@3(!b zpJ8@)MpP78g%bXgWhK}Bvf6x6e)Dci_PlvSMUg>@?fW9v-7+vhAbYvmZ)NdYYrvYn zm0CC3FJJewPG`*4_Onw1pO-Mtiw3@BT^Bm7W*rlAnL<+HZr*u50XaEYc|w7~$_)v& zD#L|#x6luIy%9zPFhjT?KiO~?Az~r{f&dy2FF_B-U8xw!mQ!cQ$1NHsx|U?ZlrGr` z$#jED2P97*k0Yd+7s9@9jZ3T*2{sYI^E=M~qV zQ4WU%eZC~wq+CX%P34OxO*lL#{zt=^_=pgOX_1~5ZUN;5GS=Ua2`cO$_Z$|-ppDQm zaOj9ZBAw!>PX|Psb_Im=42a)EP*-d9A?;eAwoW z*@^yKJc6B@fhi|Zv6rT**HE$Nq|hs<*drq+FAe_gT$ey^`TeNaB`t0d?FE?zIXGe; zG)6&ivwP~Vz+;abQq+&IE+2PgBvW&KF*u=kV-REWpI6)L&%cKB{G2;HW`Gxae{wIEnUp?NpE?;F2h7vio~Sr}Ec z!a}!_R$185(&B^OfYJI^$?c7fuH>Rq`hGz0xi_GreA~!}G~J%^AtM*~K-k8Kpx!%Q zgB6XSG9#5Qrp(AlKQpjt@4_85eHWa(5RZBna@_ock34dL4-@x=qFX-xJfESeb#1y0 z*QQ(LgZm&(jTKxn!>H%zQP@|Z(k=SgqyDp&OC!mJ?1$V?i_zaP+Q_#>m!HeEXjM5Y z6>56m-*AsFDHh9#t)U{Qp*2*5+%u_=i}JxfR&tf*^o@OTM>7Qq@%sGpUNT$o2o7*6 zbcZ2wQ_4c3(7l-Wjj%*uwb|QiTDMf{-b+l|QoA8TsNK0qQ@IvOdKAoblp1%O5`yw7 zUIo_i;E4P#LvUwtB!G#sH%hh*5@2~(I)i%g8o^zgyUe4mF>Vr*5_XS@#HZ$3MnB3= z4g4U(^^@}^Yv;|kn7&0KVnT4BFAR6zs07nJC66f+EDb7l37+mV!)2)pS>NRes2?%X z4l+^RP{_>NY(DS2>o3VBxMt)?c`NiAIg(D*$br8*jU35@2N*e`iFdmGqV;{Yjp&Eg z^_K^_m4zrtARo^4SNJXZhaQZ-;`%H6f4cr&&ZtpjRdlQ(t6mMO$m-bj_jrRw;i2eP zg@<14D)Vs8b@pP$jNd?pf4C{Bs)A)MyA`m)DAu#E?>^_3)4BkYQ;cW|q#(;3} zWvk7n&bON8&bw2ht(4;&iN{<|_Eq*%{OiKD8p$mcb|g-3LCkLM8Eg!KX%x;Jd)59=z!SpBfeZr{J>; z^ny=4ME4QFXXUqoPwmVF@LBo)1fMSkKC7%M_{_5E1fNw_j{=|OJov0URPdR3=mejI zhjZYQiDpDraA!tjmvN_`us;Tb{d!YoBMcROdtqqh_jO??eb|QvhSK2>rkD*t;j(YBBu$Jn7^)GYFo&TlQyXkR{~j9{s+AvFl2NE*0z>(R^DtDSZc2+K`3Wry z)kvP5!_bwf-)KVrp~uon!!-sTvHe-yKRJ_yjtgBC{J&(BtM~rp-ku;hOSIK z4?~S?g=;X>X5nvy|hlYb;Z_^ zZbWJZeHc6OE+J{C3^=DzA!5tGs%VX_ePoK-0=c#io^yUUXXc zcw^h>%LaOlAFB#(%Yt>o+qz({jBia;Ext7&HeeC?#0|d14afM_L_Np1oVDBHTRI+= z_;xw91sxKSGQqdV{%uG`%it-##SIt1{dPVdII`0W|K#nx)@E$_7nzQyJ|#n&*NJcuO~9lia@4PN!R%wU0j*qq0Bl|alKuX4xl7O!I4F7WDd z>U^uIIbOx)YVa!Wwh3OvYIWdMOrPOZJYj}cLFfXnE~lQyt09H!cr_00B3_NU<|Omq zop?2(HP7966$PR0!>g!l)rD748LGjnd7vAw2C1?C;qYqVx8hZV30=Ueh5t{y`f_-+ z$g1MiEUR9;T4Z$!uQH_hRZR=}`F4Tz?ZpghpPa%?g`1h1UbvaL>9D{qA_9J77z2b~e^aazzBacs^(=W=R`1R^&inSjn{TAUnllubb=Zs-7=(V98v#1m$qGoqW` z9CR+H66lPBx(9SdZY+KUbfWI$6m;h6UeFn(o%nsAlWSnMpc7lG0iC?pCZH3W^B8nS zlyz@GC$`WGbYj~sK<9Gme5=Jd=)~q~Kqv3E3FyRXb%0JxpMg$1VFo%u=mK;ur=A9# z1|9CNf=)BY$E_c9nt{+-2A%wOALumnWqbhWOpZ&U-zw&$J=pO+CVWbI5NDFp+Mq)S zpAd2_B%FT@lav5Lm(Q(g#_tku7IqCjhX%nwo!yly=R4h%Kau90NV7;OcY-c*>gxnu zCAHHD`W0|y;e~r87fyP5B^N&SdL_?F2R^LWNBvynUdfsM&R)rtgPmTUZoho4%L(W=A^oRq3nC! zT-rADBWOKVQZxDUndfn^HrERR7;P>V1Tfmwf&lz?Cl1#B0R;gJG^AXwO@J^e^Y<8E z4K`N~6gDbJ=58r`QwDm=#u*SC_N&IdM=)IYtp(?dkvgWG<>m_id)4MXA@O~XxXP;3 zx+}8kbQDxs?Klcv9u!w@irK$#(`ojv-0YbBUkVym9*Q}<@X%=vuRQFS!|j75vVu$s zH^m%Yxal;97jE{<;cf-$-&y^ue#?vHJComQ`L5*eSiaw&q2}pNd37Wf{yXdHRsMI% z>V?lw`9nVCwR&KYRcGzMDyyB+fn&wSrtOxxsGOqhR->H4B;z&uG~Eo!scSE-wUj0> znt}|#AdQ4X7_T>UQ;mE@zD<wzjCc7AxR+B~g#lSsjdqG=Suv!M zX8Hkc7*=VRVZ`Q(emj9n!VN!N!5&mn{LghaC1H;==Z0UOS0zu$F!~Vmp}WehZ6C$ ztK+S(7*<$JZSfE~D4OCSI5?WPA->@-Zit>cuK+?5=fy*4XjwdDWoio)Y-)>#7&kP< zL+H9K9>O=Aj~k-f?JW3*pU}n)5gE(kAuCe}lp4hck#`a8q@Qi-IsMRkR_`IgFK%%F z(ncdB%7o)j{P6kBYG9TR?u6&=#l9j;G#8ArBRaETY`L>eYy;?lmmex4}c@@mcem> z${J|Sh4;vy16?wN;H(=#>~iMp)rv$hZSyI`Xi7%!yF~@cfDZynhWq%8^i1r3W9TJD zU2;4WYR9362yKfUy}FnH*AnQbheZzHDow==?mU_LqlHVemLsAs;Lj$BxS z9rZW9>Kc5UZkwYVlC5aPO-K6WfXeV&dojHN{7R-4+A)K?UWpD{Pai1468M1eJpcn} z9*IvT4UnRnq%S)|g{0!svm@vgW57Y~ZZ?ExtWBa%t#OFQf#Jj8Ni~t+_bcjh3m5{kJ3O7**$5@%mj`1V@yx!@_tM|OAar+k?)dE z9FK->w}w8UC}9KbiM~+-`$nvjN`1t(#pi%O*7&e{gAe-?;YEVZu&5f^VuT+9y{US< zKk_2|Ac{M}nNUt#JN$x|?9b%l&4ni#Ai(CmeNH$uPw0piCSBa_xup=eK&fxVp9?yR zjC}m8W+qcIY-N_u-(oJle~~|X*=TvecVXE!p$zQV8{*w^UN|M$-X@v?;mSy_6Vyq= zs9iFSJs41g66wjL#IhTSH3W%N3$S8aY#(GFEB_qnP{V4|2{JS?w~ovCJdw}|N2G)u zhrARBJ@EE|iJP7uSm@Yzo5lC&be`%gsbK4O&H7D^WUA`s_=;N_QpHOX%SZy zy~G_KVBcBT-uPU1S_19!RaZuh@wrU+PDahUgqVfdlBE)*!gybnO67hhOXbr)b*F!- zNJ?^WvYdKyaEg@na&Wrph4us*mRGFg;0XPlIXIProgAE*H|j!6-Z`5{m=$}cPi0{H zt{S2wj06~u14m*b$e*t1A5=nBd%khw)C^9s0R^|gOY>c30%{?sM)LtlLlTjJyU;6; zPn+e`_RI{kYVU;Z2F76{&Gh02GohJo&`}-GJRX+8i}|~dh2J2}0II{3c%=BpROuAr z7gGtMc&FHm;J_8D41kwihXMV(-}l?tl>@=D4VoaVoCtCWDtb1nmRUM(zHjz@o(Y*< zj^W~$)w8ZE0~c1nZChX5=ecn2xsavhhelSu$3#>m6}BxzuNyP`feijt0@2Rim)K_- zDpFwE(uNem%bWWPKYmD4Zg6>l7t%wvc2s;YFDuGSrniphx$ zo7oNP@yV59Q8g>QU9kg|+MW1;Sxfepg-eyI5=~I~>I^5Sob7}Zyn!vd^JvXMA!QN5 z(5Gw45(IrvzCnMUt@#M}ulTDyTU~p$#=WyO7}f4t8Mq)ad!QlD)R(bc)-P7yLVNf% z>^UvBEJAe|oNpGv^=Y4Z3BtDe$xHCAF>#2)Y$wEC6*ezJ+SXxt89ssWgI?Y^Gy=nA zzqq2_E}_BV@~?+wxQbW95)WKp%KH61I0Ks;4Esw7(Cfhj#?wo^VrNd`eRG6e|lNOVUlp%@{W}g$(&V#Q7BijSbH(`>V1QrQTI+_RFbD zD+=OFrgZz^W)Zhh>E_HIHKCg=E%u1+sU^j7lu9A3SZnBEQwCfZ?;={WC1pPK8x3-{ z#~p6Xz^(Hxxiy0{NSnAd>qxI#Gf2C%JKdU*o&tLpo0pPkIX-Zfo5v3*WF!VDE#mPH zadI7VOj90sA}FdQY%~UXoHCqzW+CO>blIQfe-^*6W&a{&p%7C2ktP)sR%)MR_Ds z(``mp1I*8R`82N^Ugby)9Z=%W?f-1JLh~}6M+=q$z{IiHgl76QQMI7Da`6h2wfg@jL%)+a-a=|dBJ-I*BAoqbE!V-CczdIvO5|Mg;C)rUvPiGor9w659*wy@~Ca^}WRQcWH<&XGKYc&-{0% z!WaIJd$N6gD)0PM*7_$!R=q~ABCDN(W)IAwUP;JGD8w@jc1zxIGO{9sk`zcpohbsq zP%=1y1hgV7KSqYr8&Ey@D0QIG#?~8owB@vBfG<%bXh_w&tjW5?a%zjyQ*dptTjJQ3 zG@&`58O4NVv=l~#=Utjdd=9O~=KJx#`8SYBG9@1Mit=5?=SaQf)NfC`J5bqIBlkLZ z-Y`&{Q2Ciw0A+z`fa}TzNqH=n(G#)x;z=jR1(fKTR0OLz;M0=gY7r{W=IMdX>dmxv zny2ZX@ogkLs*P-1eN)Py3OVvPi3u8tY=t&M$rS&`rx z+p}qQx*cmNOPdE%8fvSza@nV=*dZN-=WklE&*^Yhh3nY^R>h0i16B_;dw~D$ToH5e+QC&s&Mz= zk}9i;p|h+yF?5mD9)=zh3La6s({iJP2@s)A3}Gpt05x!88NNA4Wmhq9*f(8AHa%+M zIc`Ro^?(?vy{W^W)mP7XHv>WBe}b%B}E!@q`8`Aqx|Mhv$b!U z_?~G<-Bgs)m(og&_w|s=fP#>`)#g)|TMgxwrc`TbA5p2sUZZU=p*rO5YI{^qH=ANG zSqS?sk3dfAlzh~$$eq+cY2Iz~si!T{_MXa}_HyM;JE`1h`zv?ahg9yg#<0UXTSJZZ z-K9I}5e!4RAdPW$qPpU$*B)z)*B`EEr*K-Wn}`R|7jPW2{#mc{Z7D^+N5k)Tmu6HM%mDP&5h#-GQQQxQe1t zq-=_!^K~zZ=9*>qqGj?6t8)F>lVp7R3Novp&PTh1wRyylv+#idUx2 zw_2LDDCW&IZBZ<{ZER7@t98CbF;8#%4D%D(7R5~HyhZWK)bkiRiW}h?hK_2uh@qny zDu%}2oftZz4(r_*8i{aRk1j$za$*_mdL?}{{DdwH?coOiXy zCD*kXx#_EHGxD=j+QvMXpOtTD<%g@kjNJ6pf2q9e6@VG>CfB!Tfcf6lgtVb0Y)6)C zY6-5@5`0wwLe&z~s3oY$o42JV)Ds|AzNxb7tbH>|Z>RXp8$@iJKLw<`*2sTPC+m^> zomSRw(A4gyc>aVsm=m0&nZD{Lnij=6;o@eDPR zA#5!J(wxncj=I&eif(h9TBo>Xr94@&4x^&WEuU@FG2i4_xnQimnAs{Ckqx60oi-vH zG5V2WOY`B&sua@=(vfYC;!)3tHr{N$e^B)|pvp{Xw<_PoWD4nvnWWRk!QZ3PMrAMR zw9%MGr_I;BIxQHzTc^dgG6?dvH_aupq0>mbP0+lbWT%mM9IOS#$=*ck1onn(nomg4 zVOI_A$}ULkAmycBH=9cM*+YI*RK9Gq`ONuFvo}QQOlXGZmKI>7*-E|ek!D&fwD{Yl zdAil4oO_|`yF3Az4^!eJyU+@qd8^H5p4Mm`!i}zKv~EZjHCm@s)oA(eK8=>9JV2v$ zgF}@c!$x?O0W|n%ru$849M{InsfOfbk zF*k*q&UBH=%}%;VYPsRhJOAhBUqkxxpXeotrMIQ#d@mKP8`fJ@DpIw&Kl_z-dfX?ss^@fnxcU6^QnP>` zVa=3oG_}Zd#~gCHGV$A!8;rO@y>tZ4Ey8+(5_#+Gm*%cT5trN6OG~<7%h_B;GEp5n zHz=8C4zw}zF7aex+g3ei&{Ei`v-9P+5IdbO-=IR{$7vHb3L{j7tq7yD1?MP?qnG2+ zZGcz4rIoE@=XRdD`w0Gb?+?R6a&=^4sr=^x7S{>TSMT7~Ac=t0yYqyTaAuGH~nNaS?ht?~Y5b z^WD;Kq*}a7Q|;CInxnXKf8J4GeeHQik?nNn)e|M?5rvU-XZYG$VWe>dLTdOA9bH>S z?$dVH7Cq5A-sd~32Gec=8R%aI0KVN#@ELOUp!Zhk*a%E_1jvu#vfBajdPV!X=bd$r zd}o!@vkmLI0_4XP@Y@0My2Yoz%wB4LwNBKQX%0DAq|TwXKJpx3ngg50J_nTejSd4+ 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

f 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 H "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 0000000000000000000000000000000000000000..86a3d8908ac4da0901e4d84ad2aedc06158fe021 GIT binary patch literal 31216 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 literal 0 HcmV?d00001 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)" +}