crokus 0.1.5 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/crokus/cfg_builder.rb +10 -0
- data/lib/crokus/cfg_cleaner.rb +1 -1
- data/lib/crokus/cfg_optim.rb +31 -0
- data/lib/crokus/cfg_printer.rb +1 -0
- data/lib/crokus/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b690523ea19dfb9b7eaa5f0569ab5b4d9cba857ca8e4a451907af3b28c7749c7
|
4
|
+
data.tar.gz: 2313aac03fc005f09dbee2925a64738e0c85fe0a343f1de0a426ce73a9307eab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b8be391422d91f28ffc75c0d86f00098f9ba17f2d64a277a28dee774348bb725b558a1a469d11831d07ac58f9dbab3a08a37779f3c4a3672aa06f6f94374041
|
7
|
+
data.tar.gz: 89aeab45274244cadd1758cd17a2ca2364db45ec3b3f1ed748caf2c6a6840cf9c9a9a99cf0e4f6a90844a2c623f0315bb26c7195650dd55c2675367f805b164e
|
data/lib/crokus/cfg_builder.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'cfg'
|
2
2
|
require_relative 'cfg_cleaner'
|
3
|
+
require_relative 'cfg_optim'
|
3
4
|
|
4
5
|
require_relative 'visitor'
|
5
6
|
require_relative 'cleaner'
|
@@ -24,6 +25,7 @@ module Crokus
|
|
24
25
|
func.body.accept(self)
|
25
26
|
@cfg.print
|
26
27
|
@cfg=CFGCleaner.new.clean(@cfg)
|
28
|
+
@cfg=CFGOptimizer.new.clean(@cfg)
|
27
29
|
@cfg.name=Ident.new(Token.create "#{@cfg.name}_clean")
|
28
30
|
func.cfg=@cfg
|
29
31
|
puts " "*5+"|--[+] cfg size for '#{func.name}' : #{@cfg.size}" unless $options[:mute]
|
@@ -126,6 +128,10 @@ module Crokus
|
|
126
128
|
@current=falseBranch
|
127
129
|
end
|
128
130
|
|
131
|
+
def visitFunCall fcall,args=nil
|
132
|
+
@current << fcall
|
133
|
+
end
|
134
|
+
|
129
135
|
def visitFor for_,args=nil
|
130
136
|
for_.init.each{|stmt| stmt.accept(self)}
|
131
137
|
cond=for_.cond.accept(self)
|
@@ -148,6 +154,10 @@ module Crokus
|
|
148
154
|
@current=falseBranch
|
149
155
|
end
|
150
156
|
|
157
|
+
def visitReturn ret,args=nil
|
158
|
+
@current << ret
|
159
|
+
end
|
160
|
+
|
151
161
|
def visitDoWhile dowhile,args=nil
|
152
162
|
@cfg << cond_bb = BasicBlock.new
|
153
163
|
@current_continue_dest = cond_bb # for continue stmt !
|
data/lib/crokus/cfg_cleaner.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Crokus
|
2
|
+
|
3
|
+
class CFGOptimizer
|
4
|
+
|
5
|
+
def clean cfg
|
6
|
+
puts " "*5+"|--[+] optimizing cfg '#{cfg.name}'" unless $options[:mute]
|
7
|
+
@cfg=cfg
|
8
|
+
@visited=[]
|
9
|
+
@new_succs={}
|
10
|
+
optim_rec cfg.starter
|
11
|
+
cfg
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def optim_rec bb
|
17
|
+
@visited << bb
|
18
|
+
@new_succs[bb]=[]
|
19
|
+
bb.succs.each_with_index do |succ,idx|
|
20
|
+
if bb.succs.size==1 and succ.succs.size==1
|
21
|
+
bb.stmts << succ.stmts
|
22
|
+
bb.stmts.flatten!
|
23
|
+
@cfg.bbs.delete(succ)
|
24
|
+
bb.succs[0]=succ.succs.first
|
25
|
+
end
|
26
|
+
optim_rec succ unless @visited.include?(succ)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/lib/crokus/cfg_printer.rb
CHANGED
data/lib/crokus/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crokus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Christophe Le Lann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: distribution
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/crokus/cfg.rb
|
54
54
|
- lib/crokus/cfg_builder.rb
|
55
55
|
- lib/crokus/cfg_cleaner.rb
|
56
|
+
- lib/crokus/cfg_optim.rb
|
56
57
|
- lib/crokus/cfg_printer.rb
|
57
58
|
- lib/crokus/cfg_printer_c.rb
|
58
59
|
- lib/crokus/cfg_random_gen.rb
|