class Crokus::IRDumper

Public Instance Methods

dump(cfg) click to toggle source
# File lib/crokus/ir_dumper.rb, line 13
def dump cfg
  @visited=[]
  @code=Code.new
  visit_rec cfg.starter
  return @code
end
visitFunction(func,args=nil) click to toggle source
# File lib/crokus/ir_dumper.rb, line 5
def visitFunction func,args=nil
  puts " "*1+"|--[+] IR for '#{func.name}'"
  ir_code=dump(func.cfg)
  filename=func.name.to_s+".ir"
  ir_code.save_as filename
  puts " "*5+"|--[+] generated #{filename}"
end
visitITE(ite,args=nil) click to toggle source
# File lib/crokus/ir_dumper.rb, line 45
def visitITE ite,args=nil
  cond=ite.cond.accept(self)
  label1=ite.trueBranch.label
  label2=ite.falseBranch.label
  @code << "\t"+"ite #{cond},#{label1},#{label2}"
end
visit_rec(bb) click to toggle source
# File lib/crokus/ir_dumper.rb, line 20
def visit_rec bb
  @code << bb.label+":"
  @visited << bb
  @current=bb
  bb.stmts.each do |stmt|
    unless stmt.is_a? Break or stmt.is_a? Continue
      @code << "\t"+stmt.str.gsub(/;/,'')
    end
  end
  unless bb.stmts.last.is_a? Crokus::ITE
    if bb.succs.any?
      @code << "\tgoto #{bb.succs.first.label}"
    end
  end
  if bb.succs.empty?
    @code << "\tstop"
  else
    bb.succs.each do |bb|
      unless @visited.include? bb
        visit_rec(bb)
      end
    end
  end
end