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



84
85
86
87
88
# File 'lib/crokus/compiler.rb', line 84

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

#build_tacObject



90
91
92
93
94
# File 'lib/crokus/compiler.rb', line 90

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
# File 'lib/crokus/compiler.rb', line 27

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

  build_cfg
  return true if options[:cfg]

  pretty_print

  if options[:trojan]
    insert_trojan
  end

  build_tac
  return true if options[:tac]

  emit_ir
  return true
end

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



56
57
58
59
60
61
62
# File 'lib/crokus/compiler.rb', line 56

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

#emit_irObject



96
97
98
99
# File 'lib/crokus/compiler.rb', line 96

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

#execute(params) ⇒ Object



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

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

#insert_trojanObject



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/crokus/compiler.rb', line 105

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

#parse(filename) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/crokus/compiler.rb', line 47

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



76
77
78
79
80
81
82
# File 'lib/crokus/compiler.rb', line 76

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



64
65
66
67
68
69
# File 'lib/crokus/compiler.rb', line 64

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



71
72
73
74
# File 'lib/crokus/compiler.rb', line 71

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