seafoam 0.3 → 0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/workflows.yml +40 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -1
- data/Gemfile.lock +59 -0
- data/README.md +76 -3
- data/bin/bgv2isabelle +16 -45
- data/bin/bgv2json +18 -36
- data/bin/cfg2asm +24 -0
- data/bin/seafoam +1 -1
- data/demos/box-unbox-stats +65 -0
- data/docs/bgv.md +2 -1
- data/docs/getting-graphs.md +8 -0
- data/examples/Fib.java +1 -1
- data/examples/fib-java.bgv.gz +0 -0
- data/examples/fib.js +1 -1
- data/examples/java/JavaExamples.java +1 -1
- data/examples/ruby/clamps.rb +20 -0
- data/examples/ruby/graal.patch +15 -0
- data/examples/ruby/ruby_examples.rb +278 -0
- data/lib/seafoam.rb +5 -1
- data/lib/seafoam/annotators/graal.rb +1 -1
- data/lib/seafoam/bgv/bgv_parser.rb +10 -2
- data/lib/seafoam/cfg/cfg_parser.rb +93 -0
- data/lib/seafoam/cfg/disassembler.rb +70 -0
- data/lib/seafoam/commands.rb +190 -30
- data/lib/seafoam/graal/source.rb +23 -0
- data/lib/seafoam/graph.rb +25 -1
- data/lib/seafoam/graphviz_writer.rb +21 -2
- data/lib/seafoam/isabelle_writer.rb +46 -0
- data/lib/seafoam/json_writer.rb +58 -0
- data/lib/seafoam/version.rb +1 -1
- data/seafoam.gemspec +4 -2
- data/spec/seafoam/annotators/graal_spec.rb +7 -7
- data/spec/seafoam/bgv/bgv_parser_spec.rb +13 -3
- data/spec/seafoam/cfg/cfg_parser_spec.rb +21 -0
- data/spec/seafoam/cfg/disassembler_spec.rb +32 -0
- data/spec/seafoam/command_spec.rb +86 -40
- data/spec/seafoam/json_writer_spec.rb +14 -0
- data/spec/seafoam/spec_helpers.rb +4 -0
- data/spec/seafoam/spotlight_spec.rb +1 -1
- data/tools/render-all +2 -2
- metadata +33 -96
- data/.github/workflows/rubocop.yml +0 -10
- data/.github/workflows/specs.yml +0 -19
- data/examples/fib-java.bgv +0 -0
- data/examples/fib-js.bgv +0 -0
- data/examples/fib-ruby.bgv +0 -0
- data/examples/identity.bgv +0 -0
- data/examples/java/exampleArithOperator.bgv +0 -0
- data/examples/java/exampleArithOperator.cfg +0 -925
- data/examples/java/exampleArrayAllocation.bgv +0 -0
- data/examples/java/exampleArrayAllocation.cfg +0 -5268
- data/examples/java/exampleArrayRead.bgv +0 -0
- data/examples/java/exampleArrayRead.cfg +0 -2263
- data/examples/java/exampleArrayWrite.bgv +0 -0
- data/examples/java/exampleArrayWrite.cfg +0 -2315
- data/examples/java/exampleCatch.bgv +0 -0
- data/examples/java/exampleCatch.cfg +0 -4150
- data/examples/java/exampleCompareOperator.bgv +0 -0
- data/examples/java/exampleCompareOperator.cfg +0 -1109
- data/examples/java/exampleDoubleSynchronized.bgv +0 -0
- data/examples/java/exampleDoubleSynchronized.cfg +0 -26497
- data/examples/java/exampleExactArith.bgv +0 -0
- data/examples/java/exampleExactArith.cfg +0 -1888
- data/examples/java/exampleFieldRead.bgv +0 -0
- data/examples/java/exampleFieldRead.cfg +0 -1228
- data/examples/java/exampleFieldWrite.bgv +0 -0
- data/examples/java/exampleFieldWrite.cfg +0 -1102
- data/examples/java/exampleFor.bgv +0 -0
- data/examples/java/exampleFor.cfg +0 -3936
- data/examples/java/exampleFullEscape.bgv +0 -0
- data/examples/java/exampleFullEscape.cfg +0 -5893
- data/examples/java/exampleIf.bgv +0 -0
- data/examples/java/exampleIf.cfg +0 -2462
- data/examples/java/exampleIfNeverTaken.bgv +0 -0
- data/examples/java/exampleIfNeverTaken.cfg +0 -2476
- data/examples/java/exampleInstanceOfManyImpls.bgv +0 -0
- data/examples/java/exampleInstanceOfManyImpls.cfg +0 -6391
- data/examples/java/exampleInstanceOfOneImpl.bgv +0 -0
- data/examples/java/exampleInstanceOfOneImpl.cfg +0 -2604
- data/examples/java/exampleIntSwitch.bgv +0 -0
- data/examples/java/exampleIntSwitch.cfg +0 -3121
- data/examples/java/exampleInterfaceCallManyImpls.bgv +0 -0
- data/examples/java/exampleInterfaceCallManyImpls.cfg +0 -1358
- data/examples/java/exampleInterfaceCallOneImpl.bgv +0 -0
- data/examples/java/exampleInterfaceCallOneImpl.cfg +0 -3859
- data/examples/java/exampleLocalInstanceOf.bgv +0 -0
- data/examples/java/exampleLocalInstanceOf.cfg +0 -5276
- data/examples/java/exampleLocalSynchronized.bgv +0 -0
- data/examples/java/exampleLocalSynchronized.cfg +0 -1364
- data/examples/java/exampleLocalVariables.bgv +0 -0
- data/examples/java/exampleLocalVariables.cfg +0 -1195
- data/examples/java/exampleLocalVariablesState.bgv +0 -0
- data/examples/java/exampleLocalVariablesState.cfg +0 -1673
- data/examples/java/exampleNestedWhile.bgv +0 -0
- data/examples/java/exampleNestedWhile.cfg +0 -15499
- data/examples/java/exampleNestedWhileBreak.bgv +0 -0
- data/examples/java/exampleNestedWhileBreak.cfg +0 -11162
- data/examples/java/exampleNoEscape.bgv +0 -0
- data/examples/java/exampleNoEscape.cfg +0 -974
- data/examples/java/exampleObjectAllocation.bgv +0 -0
- data/examples/java/exampleObjectAllocation.cfg +0 -5287
- data/examples/java/examplePartialEscape.bgv +0 -0
- data/examples/java/examplePartialEscape.cfg +0 -7042
- data/examples/java/examplePhi.bgv +0 -0
- data/examples/java/examplePhi.cfg +0 -3227
- data/examples/java/exampleReducible.bgv +0 -0
- data/examples/java/exampleReducible.cfg +0 -5578
- data/examples/java/exampleSimpleCall.bgv +0 -0
- data/examples/java/exampleSimpleCall.cfg +0 -1435
- data/examples/java/exampleStamp.bgv +0 -0
- data/examples/java/exampleStamp.cfg +0 -913
- data/examples/java/exampleStaticCall.bgv +0 -0
- data/examples/java/exampleStaticCall.cfg +0 -1154
- data/examples/java/exampleStringSwitch.bgv +0 -0
- data/examples/java/exampleStringSwitch.cfg +0 -15377
- data/examples/java/exampleSynchronized.bgv +0 -0
- data/examples/java/exampleSynchronized.cfg +0 -26027
- data/examples/java/exampleThrow.bgv +0 -0
- data/examples/java/exampleThrow.cfg +0 -780
- data/examples/java/exampleThrowCatch.bgv +0 -0
- data/examples/java/exampleThrowCatch.cfg +0 -744
- data/examples/java/exampleUnsafeRead.bgv +0 -0
- data/examples/java/exampleUnsafeRead.cfg +0 -912
- data/examples/java/exampleUnsafeWrite.bgv +0 -0
- data/examples/java/exampleUnsafeWrite.cfg +0 -962
- data/examples/java/exampleWhile.bgv +0 -0
- data/examples/java/exampleWhile.cfg +0 -3936
- data/examples/java/exampleWhileBreak.bgv +0 -0
- data/examples/java/exampleWhileBreak.cfg +0 -5963
- data/examples/matmult-java.bgv +0 -0
- data/examples/matmult-ruby.bgv +0 -0
- data/examples/overflow.bgv +0 -0
- data/spec/seafoam/bgv/fixtures/not.bgv +0 -1
- data/spec/seafoam/bgv/fixtures/unsupported.bgv +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f5cdd6b29d9c25bc7db525b2f49d6937fb996bc108a7bf18ddf0364575e6999
|
4
|
+
data.tar.gz: 510608b5d784ef4c58768aafb42372bdd33aad226a6123e9ad72ea77845a8050
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 125d9c14699c1a9a72bc1311b2673cf24d725af3c4da38eac1c2c89ebce4d6157c3e08ad7cc7b8769f8c755227cd04da4b9a6f53ae30f0f3ce38e7a1cf12d4b2
|
7
|
+
data.tar.gz: 2430c0b5f04378767c5bbbb51274900deae22291fd905831f4a5d5847edd5e7497e3df94a434ab803689ee4f9b3f6cd5d6740bdc28dbf96d7da329c8610ac6e5
|
@@ -0,0 +1,40 @@
|
|
1
|
+
name: Workflows
|
2
|
+
on: [push]
|
3
|
+
jobs:
|
4
|
+
rubocop:
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
steps:
|
7
|
+
- uses: actions/checkout@v2
|
8
|
+
- uses: ruby/setup-ruby@v1
|
9
|
+
- run: gem install bundler:1.17.2
|
10
|
+
- run: bundle install
|
11
|
+
- run: bundle exec rubocop
|
12
|
+
specs:
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
os: [ubuntu, macos]
|
16
|
+
ruby: [2.5, 2.6, 2.7, 3.0]
|
17
|
+
runs-on: ${{ matrix.os }}-latest
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v2
|
20
|
+
- uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
bundler-cache: true
|
24
|
+
- run: bundle install
|
25
|
+
- run: if [[ $(uname) == "Darwin" ]]; then brew install graphviz capstone; else sudo apt-get install graphviz libcapstone3; fi
|
26
|
+
- run: bundle exec rspec
|
27
|
+
specs-no-dependencies:
|
28
|
+
strategy:
|
29
|
+
matrix:
|
30
|
+
os: [ubuntu, macos]
|
31
|
+
ruby: [2.5, 2.6, 2.7, 3.0]
|
32
|
+
runs-on: ${{ matrix.os }}-latest
|
33
|
+
steps:
|
34
|
+
- uses: actions/checkout@v2
|
35
|
+
- uses: ruby/setup-ruby@v1
|
36
|
+
with:
|
37
|
+
ruby-version: ${{ matrix.ruby }}
|
38
|
+
bundler-cache: true
|
39
|
+
- run: bundle install
|
40
|
+
- run: NO_DEPENDENCIES_INSTALLED=true bundle exec rspec
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.5.
|
1
|
+
2.5.9
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
seafoam (0.7)
|
5
|
+
crabstone (~> 4.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
ast (2.4.2)
|
11
|
+
benchmark-ips (2.8.4)
|
12
|
+
crabstone (4.0.3)
|
13
|
+
ffi
|
14
|
+
diff-lcs (1.4.4)
|
15
|
+
ffi (1.15.0)
|
16
|
+
parallel (1.20.1)
|
17
|
+
parser (3.0.1.1)
|
18
|
+
ast (~> 2.4.1)
|
19
|
+
rainbow (3.0.0)
|
20
|
+
regexp_parser (2.1.1)
|
21
|
+
rexml (3.2.5)
|
22
|
+
rspec (3.10.0)
|
23
|
+
rspec-core (~> 3.10.0)
|
24
|
+
rspec-expectations (~> 3.10.0)
|
25
|
+
rspec-mocks (~> 3.10.0)
|
26
|
+
rspec-core (3.10.1)
|
27
|
+
rspec-support (~> 3.10.0)
|
28
|
+
rspec-expectations (3.10.1)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (~> 3.10.0)
|
31
|
+
rspec-mocks (3.10.2)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.10.0)
|
34
|
+
rspec-support (3.10.2)
|
35
|
+
rubocop (0.93.1)
|
36
|
+
parallel (~> 1.10)
|
37
|
+
parser (>= 2.7.1.5)
|
38
|
+
rainbow (>= 2.2.2, < 4.0)
|
39
|
+
regexp_parser (>= 1.8)
|
40
|
+
rexml
|
41
|
+
rubocop-ast (>= 0.6.0)
|
42
|
+
ruby-progressbar (~> 1.7)
|
43
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
44
|
+
rubocop-ast (1.5.0)
|
45
|
+
parser (>= 3.0.1.1)
|
46
|
+
ruby-progressbar (1.11.0)
|
47
|
+
unicode-display_width (1.7.0)
|
48
|
+
|
49
|
+
PLATFORMS
|
50
|
+
ruby
|
51
|
+
|
52
|
+
DEPENDENCIES
|
53
|
+
benchmark-ips (~> 2.7)
|
54
|
+
rspec (~> 3.8)
|
55
|
+
rubocop (~> 0.74)
|
56
|
+
seafoam!
|
57
|
+
|
58
|
+
BUNDLED WITH
|
59
|
+
1.17.2
|
data/README.md
CHANGED
@@ -14,15 +14,18 @@ IGV, Seafoam:
|
|
14
14
|
* is able to some extent seek BGV files to load specific graphs without loading the rest of the file
|
15
15
|
* has a command-line interface
|
16
16
|
* can be used as a library
|
17
|
-
* has easy PDF, SVG and
|
17
|
+
* has easy PDF, SVG, PNG and JSON output
|
18
18
|
* is designed for accessibility
|
19
19
|
* looks prettier, in our opinion
|
20
20
|
|
21
|
+
Additionally, Seafoam adds:
|
22
|
+
|
23
|
+
* support for disassembling CFG files
|
24
|
+
|
21
25
|
Admittedly, Seafoam does not yet have:
|
22
26
|
|
23
27
|
* an interactive user interface
|
24
28
|
* diffing of graphs
|
25
|
-
* visualization of basic blocks
|
26
29
|
* breaking of edges for very congested graphs
|
27
30
|
* the same speed in rendering big graphs - Seafoam is best suited for looking at graphs before lowering, which is what language developers are usually doing, or use spotlight
|
28
31
|
|
@@ -53,7 +56,7 @@ seafoam 0.1
|
|
53
56
|
seafoam 0.1
|
54
57
|
```
|
55
58
|
|
56
|
-
|
59
|
+
### RedHat
|
57
60
|
|
58
61
|
```
|
59
62
|
% sudo yum install ruby graphviz
|
@@ -62,6 +65,15 @@ seafoam 0.1
|
|
62
65
|
seafoam 0.1
|
63
66
|
```
|
64
67
|
|
68
|
+
### Capstone
|
69
|
+
|
70
|
+
To use the `cfg2asm` disassembler, you'll then need to install Capstone.
|
71
|
+
|
72
|
+
```
|
73
|
+
% brew install capstone # macOS
|
74
|
+
% sudo apt-get install libcapstone3 # Ubuntu
|
75
|
+
```
|
76
|
+
|
65
77
|
## Quick-start demo
|
66
78
|
|
67
79
|
```
|
@@ -183,6 +195,26 @@ Output:
|
|
183
195
|
}
|
184
196
|
```
|
185
197
|
|
198
|
+
#### Print node source information
|
199
|
+
|
200
|
+
```
|
201
|
+
% seafoam examples/fib-ruby.bgv:8:2443 source
|
202
|
+
java.lang.Math#addExact
|
203
|
+
org.truffleruby.core.numeric.IntegerNodes$AddNode#add
|
204
|
+
org.truffleruby.core.numeric.IntegerNodesFactory$AddNodeFactory$AddNodeGen#executeAdd
|
205
|
+
org.truffleruby.core.inlined.InlinedAddNode#intAdd
|
206
|
+
org.truffleruby.core.inlined.InlinedAddNodeGen#execute
|
207
|
+
org.truffleruby.language.control.IfElseNode#execute
|
208
|
+
org.truffleruby.language.control.SequenceNode#execute
|
209
|
+
org.truffleruby.language.arguments.CheckArityNode#execute
|
210
|
+
org.truffleruby.language.control.SequenceNode#execute
|
211
|
+
org.truffleruby.language.methods.CatchForMethodNode#execute
|
212
|
+
org.truffleruby.language.methods.ExceptionTranslatingNode#execute
|
213
|
+
org.truffleruby.language.RubyRootNode#execute
|
214
|
+
org.graalvm.compiler.truffle.runtime.OptimizedCallTarget#executeRootNode
|
215
|
+
org.graalvm.compiler.truffle.runtime.OptimizedCallTarget#profiledPERoot
|
216
|
+
```
|
217
|
+
|
186
218
|
#### Render a graph
|
187
219
|
|
188
220
|
Render a graph as a PDF image and have it opened automatically.
|
@@ -227,11 +259,52 @@ graph0 = # 2:Fib.fib(int)/After phase org.graalvm.compiler.java.GraphBuilderPhas
|
|
227
259
|
...
|
228
260
|
```
|
229
261
|
|
262
|
+
Convert a BGV file to JSON.
|
263
|
+
|
264
|
+
```
|
265
|
+
% bgv2json examples/fib-java.bgv
|
266
|
+
graph0 = # 2:Fib.fib(int)/After phase org.graalvm.compiler.java.GraphBuilderPhase
|
267
|
+
(add_node 0 StartNode [2] [8]
|
268
|
+
(add_node 1 (ParameterNode 0) [] [2, 5, 9, 11, 14, 16]
|
269
|
+
(add_node 2 FrameState [1] [0]
|
270
|
+
(add_node 3 (ConstantNode 1) [] []
|
271
|
+
(add_node 4 (ConstantNode 2) [] [5]
|
272
|
+
(add_node 5 IntegerLessThanNode [1, 4] [8]
|
273
|
+
(add_node 6 BeginNode [8] [13]
|
274
|
+
(add_node 7 BeginNode [8] [9]
|
275
|
+
(add_node 8 IfNode [0, 5] [7, 6]
|
276
|
+
...
|
277
|
+
```
|
278
|
+
|
279
|
+
#### Disassembling
|
280
|
+
|
281
|
+
```
|
282
|
+
% cfg2asm examples/java/exampleArithOperator.cfg
|
283
|
+
[examples/java/exampleArithOperator.cfg]
|
284
|
+
;Comment 0: 3
|
285
|
+
;Comment 0: 1
|
286
|
+
0x112e2f660: nop dword ptr [rax + rax]
|
287
|
+
;Comment 5: block B0 null
|
288
|
+
;Comment 5: 0 [rsi|DWORD, rdx|DWORD, rbp|QWORD] = LABEL numbPhis: 0 align: false label: ?
|
289
|
+
;Comment 5: 4 [] = HOTSPOTLOCKSTACK frameMapBuilder: org.graalvm.compiler.lir.amd64.AMD64FrameMapBuilder@143082de0 slotKind: QWORD
|
290
|
+
;Comment 5: 10 rsi|DWORD = ADD (x: rsi|DWORD, y: rdx|DWORD) size: DWORD
|
291
|
+
0x112e2f665: add esi, edx
|
292
|
+
;Comment 7: 12 rax|DWORD = MOVE rsi|DWORD moveKind: DWORD
|
293
|
+
0x112e2f667: mov eax, esi
|
294
|
+
;Comment 9: 14 RETURN (savedRbp: rbp|QWORD, value: rax|DWORD) isStub: false requiresReservedStackAccessCheck: false thread: r15 scratchForSafepointOnReturn: rcx config: org.graalvm.compiler.hotspot.GraalHotSpotVMConfig@137f187d8
|
295
|
+
;Comment 9: 12
|
296
|
+
0x112e2f669: test dword ptr [rip - 0x46c4669], eax
|
297
|
+
0x112e2f66f: vzeroupper
|
298
|
+
0x112e2f672: ret
|
299
|
+
...
|
300
|
+
```
|
301
|
+
|
230
302
|
## Options for GraalVM graphs
|
231
303
|
|
232
304
|
* `--show-frame-state` shows frame state nodes, which are hidden by default
|
233
305
|
* `--hide-floating` hides nodes that aren't fixed by control flow
|
234
306
|
* `--no-reduce-edges` turns off the option to reduce the number of edges by inlining simple nodes above their users
|
307
|
+
* `--draw-blocks` to draw basic block information if available
|
235
308
|
|
236
309
|
## Configuration
|
237
310
|
|
data/bin/bgv2isabelle
CHANGED
@@ -2,52 +2,23 @@
|
|
2
2
|
|
3
3
|
require 'seafoam'
|
4
4
|
|
5
|
-
#
|
6
|
-
# "eg_short_cut_or1 =
|
7
|
-
# (add_node 14 ReturnNode [13] []
|
8
|
-
# (add_node 13 PhiNode [10, 11, 12] []
|
9
|
-
# (add_node 12 (ConstantNode 0) [] []
|
10
|
-
# (add_node 11 (ConstantNode 42) [] []
|
11
|
-
# (add_node 10 MergeNode [7, 9] [14]
|
12
|
-
# (add_node 9 EndNode [] []
|
13
|
-
# (add_node 8 BeginNode [] [9]
|
14
|
-
# (add_node 7 EndNode [] []
|
15
|
-
# (add_node 6 BeginNode [] [7]
|
16
|
-
# (add_node 5 IfNode [3] [6, 8]
|
17
|
-
# (add_node 3 (ShortCircuitOrNode False False) [1, 2] []
|
18
|
-
# (add_node 2 (ParameterNode 1) [] []
|
19
|
-
# (add_node 1 (ParameterNode 0) [] []
|
20
|
-
# (add_node 0 StartNode [] [5]
|
21
|
-
# empty_graph))))))))))))))"
|
5
|
+
# This is the 'bgv2isabelle' command line entry point.
|
22
6
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
7
|
+
begin
|
8
|
+
# Load configuraiton.
|
9
|
+
config = Seafoam::Config.new
|
10
|
+
config.load_config
|
27
11
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
case node_class
|
40
|
-
when 'org.graalvm.compiler.nodes.ConstantNode'
|
41
|
-
desc = "(ConstantNode #{node.props['rawvalue']})"
|
42
|
-
when 'org.graalvm.compiler.nodes.ParameterNode'
|
43
|
-
desc = "(ParameterNode #{node.props['index']})"
|
44
|
-
else
|
45
|
-
desc = node_class.split('.').last
|
46
|
-
end
|
47
|
-
inputs = node.inputs.map(&:from).map(&:id)
|
48
|
-
outputs = node.outputs.map(&:to).map(&:id)
|
49
|
-
puts " (add_node #{node.id} #{desc} #{inputs.inspect} #{outputs.inspect}"
|
50
|
-
end
|
51
|
-
puts ' empty_graph' + (')' * graph.nodes.size)
|
12
|
+
# Run the command line.
|
13
|
+
commands = Seafoam::Commands.new($stdout, config)
|
14
|
+
commands.bgv2isabelle(*ARGV)
|
15
|
+
rescue StandardError => e
|
16
|
+
if $DEBUG
|
17
|
+
# Re-raise the exception so the user sees it, if debugging is
|
18
|
+
# enabled (ruby -d).
|
19
|
+
raise e
|
20
|
+
else
|
21
|
+
# Otherwise, just print the message.
|
22
|
+
warn "seafoam: #{e.message}"
|
52
23
|
end
|
53
24
|
end
|
data/bin/bgv2json
CHANGED
@@ -1,42 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'seafoam'
|
4
|
-
require 'json'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
graph.nodes.each_value do |node|
|
26
|
-
nodes.push(
|
27
|
-
id: node.id,
|
28
|
-
props: node.props
|
29
|
-
)
|
30
|
-
|
31
|
-
node.outputs.each do |edge|
|
32
|
-
edges.push(
|
33
|
-
from: edge.from.id,
|
34
|
-
to: edge.to.id,
|
35
|
-
props: edge.props
|
36
|
-
)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
puts JSON.generate(name: name, props: graph.props, nodes: nodes, edges: edges)
|
5
|
+
# This is the 'bgv2json' command line entry point.
|
6
|
+
|
7
|
+
begin
|
8
|
+
# Load configuraiton.
|
9
|
+
config = Seafoam::Config.new
|
10
|
+
config.load_config
|
11
|
+
|
12
|
+
# Run the command line.
|
13
|
+
commands = Seafoam::Commands.new($stdout, config)
|
14
|
+
commands.bgv2json(*ARGV)
|
15
|
+
rescue StandardError => e
|
16
|
+
if $DEBUG
|
17
|
+
# Re-raise the exception so the user sees it, if debugging is
|
18
|
+
# enabled (ruby -d).
|
19
|
+
raise e
|
20
|
+
else
|
21
|
+
# Otherwise, just print the message.
|
22
|
+
warn "seafoam: #{e.message}"
|
41
23
|
end
|
42
24
|
end
|
data/bin/cfg2asm
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'seafoam'
|
4
|
+
|
5
|
+
# This is the 'cfg2asm' command line entry point.
|
6
|
+
|
7
|
+
begin
|
8
|
+
# Load configuraiton.
|
9
|
+
config = Seafoam::Config.new
|
10
|
+
config.load_config
|
11
|
+
|
12
|
+
# Run the command line.
|
13
|
+
commands = Seafoam::Commands.new($stdout, config)
|
14
|
+
commands.cfg2asm(*ARGV)
|
15
|
+
rescue StandardError => e
|
16
|
+
if $DEBUG
|
17
|
+
# Re-raise the exception so the user sees it, if debugging is
|
18
|
+
# enabled (ruby -d).
|
19
|
+
raise e
|
20
|
+
else
|
21
|
+
# Otherwise, just print the message.
|
22
|
+
warn "seafoam: #{e.message}"
|
23
|
+
end
|
24
|
+
end
|
data/bin/seafoam
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This demo analyses a directory full of graphs and looks for how many box nodes
|
4
|
+
# take their value directly from an unbox node.
|
5
|
+
|
6
|
+
require 'seafoam'
|
7
|
+
|
8
|
+
box_nodes_count = 0
|
9
|
+
box_nodes_from_unbox_count = 0
|
10
|
+
|
11
|
+
graph_count = 0
|
12
|
+
graph_match_count = 0
|
13
|
+
|
14
|
+
ARGV.each do |dir|
|
15
|
+
Dir.glob(['*.bgv', '*.bgv.gz'], base: dir) do |file|
|
16
|
+
parser = Seafoam::BGV::BGVParser.new(File.join(dir, file))
|
17
|
+
parser.read_file_header
|
18
|
+
parser.skip_document_props
|
19
|
+
|
20
|
+
loop do
|
21
|
+
index, = parser.read_graph_preheader
|
22
|
+
break unless index
|
23
|
+
|
24
|
+
parser.skip_graph_header
|
25
|
+
graph = parser.read_graph
|
26
|
+
|
27
|
+
contains_box_unbox = false
|
28
|
+
|
29
|
+
graph.nodes.each_value do |node|
|
30
|
+
next unless node.props.dig(:node_class, :node_class).start_with?('org.graalvm.compiler.nodes.extended.BoxNode')
|
31
|
+
|
32
|
+
box_node = node
|
33
|
+
box_nodes_count += 1
|
34
|
+
value_edge = node.edges.find { |e| e.props[:name] == 'value' }
|
35
|
+
raise unless value_edge
|
36
|
+
|
37
|
+
value_node = value_edge.from
|
38
|
+
next unless value_node.props.dig(:node_class, :node_class).start_with?('org.graalvm.compiler.nodes.extended.UnboxNode')
|
39
|
+
|
40
|
+
unbox_node = value_node
|
41
|
+
box_nodes_from_unbox_count += 1
|
42
|
+
contains_box_unbox = true
|
43
|
+
puts "seafoam '#{File.join(dir, file)}:#{index}' render --spotlight #{box_node.id},#{unbox_node.id}"
|
44
|
+
end
|
45
|
+
|
46
|
+
graph_count += 1
|
47
|
+
graph_match_count += 1 if contains_box_unbox
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
if box_nodes_count.positive?
|
53
|
+
box_nodes_percent = (box_nodes_from_unbox_count / box_nodes_count.to_f) * 100
|
54
|
+
else
|
55
|
+
box_nodes_percent = 0.0
|
56
|
+
end
|
57
|
+
|
58
|
+
if graph_count.positive?
|
59
|
+
graph_percent = (graph_match_count / graph_count.to_f) * 100
|
60
|
+
else
|
61
|
+
graph_percent = 0.0
|
62
|
+
end
|
63
|
+
|
64
|
+
puts " How many boxes take a value from an unbox? #{box_nodes_percent.round(1)}%"
|
65
|
+
puts "How many graphs contain at least one box-unbox? #{graph_percent.round(1)}%"
|