class Crokus::Compiler

Attributes

ast[RW]
base_name[RW]
options[RW]
parser[RW]

Public Class Methods

new() click to toggle source
# File lib/crokus/compiler.rb, line 21
def initialize
  @options={}
  $options=@options
  @parser=Parser.new
end

Public Instance Methods

build_cfg() click to toggle source
# File lib/crokus/compiler.rb, line 87
def build_cfg
  puts "[+] building CFGs" unless options[:mute]
  builder=CFGBuilder.new
  builder.build(ast)
end
build_tac() click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_ir() click to toggle source
# File lib/crokus/compiler.rb, line 99
def emit_ir
  puts "[+] emit textual IR " unless options[:mute]
  IRDumper.new.visit(ast)
end
execute(params) click to toggle source
# File lib/crokus/compiler.rb, line 104
def execute params
  RandomGen.new.run(params)
end
insert_trojan() click to toggle source
# 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) click to toggle source
# 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_print() click to toggle source
# 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
transform() click to toggle source
# 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
visit() click to toggle source
# File lib/crokus/compiler.rb, line 74
def visit
  puts "[+] dummy visit" unless options[:mute]
  Visitor.new.visit(ast)
end