Class: Crokus::IRDumper

Inherits:
Visitor show all
Defined in:
lib/crokus/ir_dumper.rb

Constant Summary

Constants included from Indent

Indent::INDENT

Instance Method Summary collapse

Methods inherited from Visitor

#initialize, #visit, #visitAddressOf, #visitArrayOf, #visitArrayOrStructInit, #visitArrow, #visitAssign, #visitBinary, #visitBody, #visitBreak, #visitCase, #visitCastedExpr, #visitCasting, #visitCharLit, #visitCommaStmt, #visitCondExpr, #visitContinue, #visitDecl, #visitDefine, #visitDeref, #visitDesignUnit, #visitDoWhile, #visitFloatLit, #visitFor, #visitFormalArg, #visitFunCall, #visitFunctionProto, #visitGoto, #visitIdent, #visitIf, #visitInclude, #visitIndexed, #visitIntLit, #visitLabelledStmt, #visitParenth, #visitPointed, #visitPointerTo, #visitPostFixAccu, #visitPreFixAccu, #visitReturn, #visitSizeof, #visitStrLit, #visitStruct, #visitSwitch, #visitToken, #visitType, #visitTypedef, #visitUnary, #visitWhile

Methods included from Indent

#dedent, #indent, #say

Constructor Details

This class inherits a constructor from Crokus::Visitor

Instance Method Details

#dump(cfg) ⇒ Object



13
14
15
16
17
18
# File 'lib/crokus/ir_dumper.rb', line 13

def dump cfg
  @visited=[]
  @code=Code.new
  visit_rec cfg.starter
  return @code
end

#visit_rec(bb) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 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

#visitFunction(func, args = nil) ⇒ Object



5
6
7
8
9
10
11
# 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) ⇒ Object



45
46
47
48
49
50
# 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