seafoam 0.6 → 0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bgv2isabelle +1 -5
  3. data/bin/bgv2json +1 -5
  4. data/bin/cfg2asm +1 -5
  5. data/bin/seafoam +1 -5
  6. data/lib/seafoam/bgv/bgv_parser.rb +10 -2
  7. data/lib/seafoam/commands.rb +107 -32
  8. data/lib/seafoam/graal/pi.rb +18 -0
  9. data/lib/seafoam/graph.rb +33 -1
  10. data/lib/seafoam/graphviz_writer.rb +24 -2
  11. data/lib/seafoam/json_writer.rb +1 -3
  12. data/lib/seafoam/{annotators → passes}/fallback.rb +4 -4
  13. data/lib/seafoam/{annotators → passes}/graal.rb +43 -15
  14. data/lib/seafoam/passes/truffle.rb +58 -0
  15. data/lib/seafoam/passes.rb +61 -0
  16. data/lib/seafoam/version.rb +1 -1
  17. data/lib/seafoam.rb +5 -4
  18. metadata +26 -62
  19. data/.github/probots.yml +0 -2
  20. data/.github/workflows/workflows.yml +0 -39
  21. data/.gitignore +0 -7
  22. data/.rubocop.yml +0 -37
  23. data/.ruby-version +0 -1
  24. data/.seafoam/config +0 -1
  25. data/CODE_OF_CONDUCT.md +0 -128
  26. data/CONTRIBUTING.md +0 -5
  27. data/Gemfile +0 -2
  28. data/LICENSE.md +0 -7
  29. data/README.md +0 -378
  30. data/demos/box-unbox-stats +0 -65
  31. data/docs/annotators.md +0 -43
  32. data/docs/bgv.md +0 -293
  33. data/docs/getting-graphs.md +0 -59
  34. data/docs/images/igv.png +0 -0
  35. data/docs/images/seafoam.png +0 -0
  36. data/docs/images/spotlight-igv.png +0 -0
  37. data/docs/images/spotlight-seafoam.png +0 -0
  38. data/docs/json.md +0 -35
  39. data/examples/Fib.java +0 -24
  40. data/examples/MatMult.java +0 -39
  41. data/examples/fib-java.bgv.gz +0 -0
  42. data/examples/fib.js +0 -15
  43. data/examples/fib.rb +0 -15
  44. data/examples/identity.rb +0 -13
  45. data/examples/java/Irreducible.class +0 -0
  46. data/examples/java/Irreducible.j +0 -35
  47. data/examples/java/IrreducibleDecompiled.java +0 -21
  48. data/examples/java/JavaExamples.java +0 -418
  49. data/examples/matmult.rb +0 -29
  50. data/examples/overflow.rb +0 -13
  51. data/examples/ruby/clamps.rb +0 -20
  52. data/examples/ruby/graal.patch +0 -15
  53. data/examples/ruby/ruby_examples.rb +0 -278
  54. data/lib/seafoam/annotators.rb +0 -54
  55. data/lib/seafoam/config.rb +0 -34
  56. data/seafoam.gemspec +0 -21
  57. data/spec/seafoam/annotators/fallback_spec.rb +0 -69
  58. data/spec/seafoam/annotators/graal_spec.rb +0 -96
  59. data/spec/seafoam/annotators_spec.rb +0 -61
  60. data/spec/seafoam/bgv/bgv_parser_spec.rb +0 -157
  61. data/spec/seafoam/binary/io_binary_reader_spec.rb +0 -176
  62. data/spec/seafoam/cfg/cfg_parser_spec.rb +0 -21
  63. data/spec/seafoam/cfg/disassembler_spec.rb +0 -32
  64. data/spec/seafoam/command_spec.rb +0 -316
  65. data/spec/seafoam/graph_spec.rb +0 -172
  66. data/spec/seafoam/graphviz_writer_spec.rb +0 -63
  67. data/spec/seafoam/json_writer_spec.rb +0 -14
  68. data/spec/seafoam/spec_helpers.rb +0 -34
  69. data/spec/seafoam/spotlight_spec.rb +0 -38
  70. data/tools/render-all +0 -36
@@ -1,157 +0,0 @@
1
- require 'seafoam'
2
-
3
- require 'rspec'
4
-
5
- require_relative '../spec_helpers'
6
-
7
- describe Seafoam::BGV::BGVParser do
8
- before :all do
9
- @fib_java_bgv = File.expand_path('../../../examples/fib-java.bgv', __dir__)
10
- end
11
-
12
- it 'can read full files' do
13
- Seafoam::SpecHelpers::SAMPLE_BGV.each do |file|
14
- parser = Seafoam::BGV::BGVParser.new(file)
15
- parser.read_file_header
16
- parser.skip_document_props
17
- loop do
18
- index, = parser.read_graph_preheader
19
- break unless index
20
-
21
- parser.read_graph_header
22
- parser.read_graph
23
- end
24
- end
25
- end
26
-
27
- it 'can read full gzipped files' do
28
- parser = Seafoam::BGV::BGVParser.new(File.expand_path('../../../examples/fib-java.bgv.gz', __dir__))
29
- parser.read_file_header
30
- parser.skip_document_props
31
- loop do
32
- index, = parser.read_graph_preheader
33
- break unless index
34
-
35
- parser.read_graph_header
36
- parser.read_graph
37
- end
38
- end
39
-
40
- it 'can skip full files' do
41
- Seafoam::SpecHelpers::SAMPLE_BGV.each do |file|
42
- parser = Seafoam::BGV::BGVParser.new(file)
43
- parser.read_file_header
44
- parser.skip_document_props
45
- loop do
46
- index, = parser.read_graph_preheader
47
- break unless index
48
-
49
- parser.skip_graph_header
50
- parser.skip_graph
51
- end
52
- end
53
- end
54
-
55
- it 'can alternate skipping and reading full files' do
56
- Seafoam::SpecHelpers::SAMPLE_BGV.each do |file|
57
- parser = Seafoam::BGV::BGVParser.new(file)
58
- parser.read_file_header
59
- parser.skip_document_props
60
- skip = false
61
- loop do
62
- index, = parser.read_graph_preheader
63
- break unless index
64
-
65
- if skip
66
- parser.skip_graph_header
67
- parser.skip_graph
68
- else
69
- parser.read_graph_header
70
- parser.read_graph
71
- end
72
- skip = !skip
73
- end
74
- end
75
- end
76
-
77
- describe '#read_file_header' do
78
- it 'produces a version' do
79
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
80
- expect(parser.read_file_header).to eq [7, 0]
81
- end
82
-
83
- it 'raises an error for files which are not BGV' do
84
- parser = Seafoam::BGV::BGVParser.new(File.expand_path('fixtures/not.bgv', __dir__))
85
- expect { parser.read_file_header }.to raise_error(EncodingError)
86
- end
87
-
88
- it 'raises an error for files which are an unsupported version of BGV' do
89
- parser = Seafoam::BGV::BGVParser.new(File.expand_path('fixtures/unsupported.bgv', __dir__))
90
- expect { parser.read_file_header }.to raise_error(NotImplementedError)
91
- end
92
-
93
- it 'does not raise an error for an unsupported version of BGV if version_check is disabled' do
94
- parser = Seafoam::BGV::BGVParser.new(File.expand_path('fixtures/unsupported.bgv', __dir__))
95
- expect(parser.read_file_header(version_check: false)).to eq [7, 2]
96
- end
97
- end
98
-
99
- describe '#read_graph_preheader' do
100
- it 'produces an index and id' do
101
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
102
- parser.read_file_header
103
- parser.skip_document_props
104
- expect(parser.read_graph_preheader).to eq [0, 0]
105
- end
106
-
107
- it 'returns nil for end of file' do
108
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
109
- parser.read_file_header
110
- parser.skip_document_props
111
- 54.times do
112
- expect(parser.read_graph_preheader).to_not be_nil
113
- parser.skip_graph_header
114
- parser.skip_graph
115
- end
116
- expect(parser.read_graph_preheader).to be_nil
117
- end
118
-
119
- it 'returns unique indicies' do
120
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
121
- parser.read_file_header
122
- parser.skip_document_props
123
- indicies = []
124
- 5.times do
125
- index, = parser.read_graph_preheader
126
- expect(indicies).to_not include index
127
- indicies.push index
128
- parser.skip_graph_header
129
- parser.skip_graph
130
- end
131
- end
132
- end
133
-
134
- describe '#read_graph_header' do
135
- it 'produces an expected header' do
136
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
137
- parser.read_file_header
138
- parser.skip_document_props
139
- parser.read_graph_preheader
140
- header = parser.read_graph_header
141
- expect(header[:props]['scope']).to eq 'main.Compiling.GraalCompiler.FrontEnd.PhaseSuite.GraphBuilderPhase'
142
- end
143
- end
144
-
145
- describe '#read_graph' do
146
- it 'produces an expected graph' do
147
- parser = Seafoam::BGV::BGVParser.new(@fib_java_bgv)
148
- parser.read_file_header
149
- parser.skip_document_props
150
- parser.read_graph_preheader
151
- parser.read_graph_header
152
- graph = parser.read_graph
153
- expect(graph.nodes.size).to eq 22
154
- expect(graph.edges.size).to eq 30
155
- end
156
- end
157
- end
@@ -1,176 +0,0 @@
1
- require 'stringio'
2
-
3
- require 'seafoam'
4
-
5
- require 'rspec'
6
-
7
- describe Seafoam::Binary::IOBinaryReader do
8
- describe '#read_utf8' do
9
- it 'reads a UTF-8 string' do
10
- string = 'abc😀'
11
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new(string))
12
- expect(reader.read_utf8(string.bytesize)).to eq string
13
- end
14
- end
15
-
16
- describe '#read_bytes' do
17
- it 'reads bytes' do
18
- string = 'abc😀'
19
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new(string))
20
- expect(reader.read_bytes(string.bytesize)).to eq "abc\xF0\x9F\x98\x80".force_encoding(Encoding::ASCII_8BIT)
21
- end
22
- end
23
-
24
- describe '#read_float64' do
25
- it 'reads a double-precision float' do
26
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[1.5].pack('G')}hello"))
27
- expect(reader.read_float64).to eq 1.5
28
- end
29
- end
30
-
31
- describe '#read_float32' do
32
- it 'reads a single-precision float' do
33
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[1.5].pack('g')}hello"))
34
- expect(reader.read_float32).to eq 1.5
35
- end
36
- end
37
-
38
- describe '#read_sint64' do
39
- it 'reads a signed 64-bit network-endian integer' do
40
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[1234].pack('q>')}hello"))
41
- expect(reader.read_sint64).to eq 1234
42
- end
43
- end
44
-
45
- describe '#read_sint32' do
46
- it 'reads a signed 32-bit network-endian integer' do
47
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[1234].pack('l>')}hello"))
48
- expect(reader.read_sint32).to eq 1234
49
- end
50
- end
51
-
52
- describe '#read_sint16' do
53
- it 'reads a signed 16-bit network-endian integer' do
54
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[1234].pack('s>')}hello"))
55
- expect(reader.read_sint16).to eq 1234
56
- end
57
- end
58
-
59
- describe '#read_sint8' do
60
- it 'reads a signed 8-bit integer' do
61
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[-123].pack('c')}hello"))
62
- expect(reader.read_sint8).to eq(-123)
63
- end
64
- end
65
-
66
- describe '#read_uint8' do
67
- it 'reads an unsigned 8-bit integer' do
68
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new("#{[212].pack('C')}hello"))
69
- expect(reader.read_uint8).to eq 212
70
- end
71
- end
72
-
73
- describe '#skip_float64' do
74
- it 'skips 8 bytes' do
75
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('12345678x'))
76
- reader.skip_float64
77
- expect(reader.read_uint8).to eq 'x'.ord
78
- end
79
-
80
- it 'accepts a count' do
81
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1234567812345678x'))
82
- reader.skip_float64 2
83
- expect(reader.read_uint8).to eq 'x'.ord
84
- end
85
- end
86
-
87
- describe '#skip_float32' do
88
- it 'skips 4 bytes' do
89
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1234x'))
90
- reader.skip_float32
91
- expect(reader.read_uint8).to eq 'x'.ord
92
- end
93
-
94
- it 'accepts a count' do
95
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('12341234x'))
96
- reader.skip_float32 2
97
- expect(reader.read_uint8).to eq 'x'.ord
98
- end
99
-
100
- describe '#skip_int64' do
101
- it 'skips 8 bytes' do
102
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('12345678x'))
103
- reader.skip_int64
104
- expect(reader.read_uint8).to eq 'x'.ord
105
- end
106
-
107
- it 'accepts a count' do
108
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1234567812345678x'))
109
- reader.skip_int64 2
110
- expect(reader.read_uint8).to eq 'x'.ord
111
- end
112
- end
113
-
114
- describe '#skip_int32' do
115
- it 'skips 4 bytes' do
116
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1234x'))
117
- reader.skip_int32
118
- expect(reader.read_uint8).to eq 'x'.ord
119
- end
120
-
121
- it 'accepts a count' do
122
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('12341234x'))
123
- reader.skip_int32 2
124
- expect(reader.read_uint8).to eq 'x'.ord
125
- end
126
- end
127
-
128
- describe '#skip_int16' do
129
- it 'skips 2 bytes' do
130
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('12x'))
131
- reader.skip_int16
132
- expect(reader.read_uint8).to eq 'x'.ord
133
- end
134
-
135
- it 'accepts a count' do
136
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1212x'))
137
- reader.skip_int16 2
138
- expect(reader.read_uint8).to eq 'x'.ord
139
- end
140
- end
141
-
142
- describe '#skip_int8' do
143
- it 'skips 1 byte' do
144
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('1x'))
145
- reader.skip_int8
146
- expect(reader.read_uint8).to eq 'x'.ord
147
- end
148
-
149
- it 'accepts a count' do
150
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('11x'))
151
- reader.skip_int8 2
152
- expect(reader.read_uint8).to eq 'x'.ord
153
- end
154
- end
155
-
156
- describe '#skip' do
157
- it 'skips n bytes' do
158
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('123x'))
159
- reader.skip 3
160
- expect(reader.read_uint8).to eq 'x'.ord
161
- end
162
- end
163
-
164
- describe '#eof?' do
165
- it 'returns false when not at the end of file' do
166
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new('123'))
167
- expect(reader.eof?).to be false
168
- end
169
-
170
- it 'returns true when at the end of file' do
171
- reader = Seafoam::Binary::IOBinaryReader.new(StringIO.new(''))
172
- expect(reader.eof?).to be true
173
- end
174
- end
175
- end
176
- end
@@ -1,21 +0,0 @@
1
- require 'seafoam'
2
-
3
- require 'rspec'
4
-
5
- require_relative '../spec_helpers'
6
-
7
- describe Seafoam::CFG::CFGParser do
8
- before :all do
9
- @example_cfg = File.expand_path('../../../examples/java/exampleIf.cfg', __dir__)
10
- end
11
-
12
- it 'correctly parses information from an nmethod' do
13
- parser = Seafoam::CFG::CFGParser.new($stdout, @example_cfg)
14
- parser.skip_over_cfg 'After code installation'
15
- nmethod = parser.read_nmethod
16
- expect(nmethod.code.arch).to eq 'AMD64'
17
- expect(nmethod.code.arch_width).to eq '64'
18
- expect(nmethod.code.base).to eq 0x1183037a0
19
- expect(nmethod.comments.size).to eq 25
20
- end
21
- end
@@ -1,32 +0,0 @@
1
- require 'seafoam'
2
-
3
- require 'rspec'
4
-
5
- require_relative '../spec_helpers'
6
-
7
- describe Seafoam::CFG::Disassembler do
8
- if Seafoam::SpecHelpers.dependencies_installed?
9
- it 'can start Capstone Disassembler disassemble an nmethod with and without comments' do
10
- @example_cfg = File.expand_path('../../../examples/java/exampleIf.cfg', __dir__)
11
- @file = File.open('tempfile_disassembler_spec.txt', 'w')
12
- parser = Seafoam::CFG::CFGParser.new(@file, @example_cfg)
13
- parser.skip_over_cfg 'After code installation'
14
- @nmethod = parser.read_nmethod
15
-
16
- disassembler = Seafoam::CFG::Disassembler.new(@file)
17
- disassembler.disassemble(@nmethod, 0)
18
- @file.close
19
-
20
- expect(`wc -l 'tempfile_disassembler_spec.txt'`.to_i).to eq 46
21
-
22
- @file = File.open('tempfile_disassembler_spec.txt', 'w')
23
- disassembler = Seafoam::CFG::Disassembler.new(@file)
24
- disassembler.disassemble(@nmethod, 2)
25
- @file.close
26
-
27
- expect(`wc -l 'tempfile_disassembler_spec.txt'`.to_i).to eq 46
28
-
29
- File.delete(@file)
30
- end
31
- end
32
- end