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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7712eb73a1d5f62f9b9b7a63eae496dbd67a346b5a17b56b4e31d60fd9deee3d
4
- data.tar.gz: fed83c851d88bc36a18bd060883644be97ffe4c6cddf7765aedd4a1c37da3add
3
+ metadata.gz: b690523ea19dfb9b7eaa5f0569ab5b4d9cba857ca8e4a451907af3b28c7749c7
4
+ data.tar.gz: 2313aac03fc005f09dbee2925a64738e0c85fe0a343f1de0a426ce73a9307eab
5
5
  SHA512:
6
- metadata.gz: c2d3dd5f960229807f20310e10554c69dd65e030c1f36460a78d49662d7abfa91e2f4aa9ac6fc6f6690276372b191c13c475042c2aeaaca23f898f4aaf841676
7
- data.tar.gz: fb152f1af14c00705fc59940b99a8cf506898a37cfbadfee28eb9b61c3db6bd4b62b43b3622c3c0b77452561d415a82a0c88851ef66b45f79bd2ec776f51d3c4
6
+ metadata.gz: 3b8be391422d91f28ffc75c0d86f00098f9ba17f2d64a277a28dee774348bb725b558a1a469d11831d07ac58f9dbab3a08a37779f3c4a3672aa06f6f94374041
7
+ data.tar.gz: 89aeab45274244cadd1758cd17a2ca2364db45ec3b3f1ed748caf2c6a6840cf9c9a9a99cf0e4f6a90844a2c623f0315bb26c7195650dd55c2675367f805b164e
@@ -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 !
@@ -3,7 +3,7 @@ module Crokus
3
3
  class CFGCleaner
4
4
 
5
5
  def clean cfg
6
- puts " "*5+"|--[+] cleaning '#{cfg.name}'" unless $options[:mute]
6
+ puts " "*5+"|--[+] cleaning cfg '#{cfg.name}'" unless $options[:mute]
7
7
  @cfg=cfg
8
8
  @visited=[]
9
9
  @new_succs={}
@@ -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
@@ -47,6 +47,7 @@ module Crokus
47
47
  while !@visited.include?(bb)
48
48
  @visited << bb
49
49
  c_code=bb.code4dot
50
+ #puts c_code
50
51
  c_code=clean4dot(c_code)
51
52
  code << "#{id(bb)} [label=\"#{c_code}\",shape=rectangle, xlabel=#{bb.label}]"
52
53
  bb.succs.each_with_index do |succ,idx|
@@ -1,3 +1,3 @@
1
1
  module Crokus
2
- VERSION="0.1.5"
2
+ VERSION="0.1.7"
3
3
  end
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.5
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-05-19 00:00:00.000000000 Z
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