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