Class: Crokus::IRDumper
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
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
|