Class: Crokus::Compiler

Inherits:
Object
  • Object
show all
Defined in:
lib/crokus/compiler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCompiler

Returns a new instance of Compiler.



21
22
23
24
25
# File 'lib/crokus/compiler.rb', line 21

def initialize
  @options={}
  $options=@options
  @parser=Parser.new
end

Instance Attribute Details

#astObject

Returns the value of attribute ast.



18
19
20
# File 'lib/crokus/compiler.rb', line 18

def ast
  @ast
end

#base_nameObject

Returns the value of attribute base_name.



19
20
21
# File 'lib/crokus/compiler.rb', line 19

def base_name
  @base_name
end

#optionsObject

Returns the value of attribute options.



16
17
18
# File 'lib/crokus/compiler.rb', line 16

def options
  @options
end

#parserObject

Returns the value of attribute parser.



17
18
19
# File 'lib/crokus/compiler.rb', line 17

def parser
  @parser
end

Instance Method Details

#build_cfgObject



87
88
89
90
91
# File 'lib/crokus/compiler.rb', line 87

def build_cfg
  puts "[+] building CFGs" unless options[:mute]
  builder=CFGBuilder.new
  builder.build(ast)
end

#build_tacObject



93
94
95
96
97
# File 'lib/crokus/compiler.rb', line 93

def build_tac
  puts "[+] building TAC" unless options[:mute]
  builder=TACBuilder.new
  builder.visit(ast)
end

#compile(filename) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/crokus/compiler.rb', line 27

def compile filename
  parse(filename)
  return true if options[:parse_only]

  draw_ast(@ast) if options[:ast]

  build_cfg
  return true if options[:cfg]

  pretty_print

  if options[:trojan]
    return_code=insert_trojan()
    return return_code
  end

  build_tac
  return true if options[:tac]

  emit_ir
  return true
end

#draw_ast(tree = nil, filename = nil) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/crokus/compiler.rb', line 59

def draw_ast tree=nil,filename=nil
  dotname=filename || "#{base_name}_ast.dot"
  puts "   |--[+] drawing AST '#{dotname}'" unless options[:mute]
  ast_ = tree || @ast
  dot=AstPrinter.new.print(ast_)
  dot.save_as dotname
end

#emit_irObject



99
100
101
102
# File 'lib/crokus/compiler.rb', line 99

def emit_ir
  puts "[+] emit textual IR " unless options[:mute]
  IRDumper.new.visit(ast)
end

#execute(params) ⇒ Object



104
105
106
# File 'lib/crokus/compiler.rb', line 104

def execute params
  RandomGen.new.run(params)
end

#insert_trojanObject



108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/crokus/compiler.rb', line 108

def insert_trojan
  puts "[+] inserting trojan" unless options[:mute]
  infected_ast=TrojanInserter.new(@options).insert(ast)
  if infected_ast
    code=PrettyPrinter.new.visit(infected_ast)
    pp_c=@base_name+"_troj.c"
    File.open(pp_c,'w'){|f| f.puts code}
    puts " "*5+"|--> saved as #{pp_c}" unless options[:mute]
    return true
  else
    return false
  end
end

#parse(filename) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/crokus/compiler.rb', line 50

def parse filename
  @base_name=File.basename(filename, ".c")
  code=IO.read(filename)
  puts "[+] parsing #{filename}" unless options[:mute]
  @ast=Parser.new.parse(code)
  draw_ast     if options[:draw_ast]
  pretty_print if options[:pp]
end

#pretty_printObject



79
80
81
82
83
84
85
# File 'lib/crokus/compiler.rb', line 79

def pretty_print
  puts "[+] pretty_print" unless options[:mute]
  code=PrettyPrinter.new.visit(ast)
  pp_c=@base_name+"_pp.c"
  File.open(pp_c,'w'){|f| f.puts code}
  puts " "*1+"|--[+] saved as #{pp_c}" unless options[:mute]
end

#transformObject



67
68
69
70
71
72
# File 'lib/crokus/compiler.rb', line 67

def transform
  puts "[+] dummy transform" unless options[:mute]
  ast_t= Transformer.new.transform(ast)
  dotname="#{base_name}_trans.dot"
  draw_ast ast_t,dotname
end

#visitObject



74
75
76
77
# File 'lib/crokus/compiler.rb', line 74

def visit
  puts "[+] dummy visit" unless options[:mute]
  Visitor.new.visit(ast)
end