58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			OCaml
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			OCaml
		
	
	
	
(*===----------------------------------------------------------------------===
 | 
						|
 * Main driver code.
 | 
						|
 *===----------------------------------------------------------------------===*)
 | 
						|
 | 
						|
open Llvm
 | 
						|
open Llvm_executionengine
 | 
						|
open Llvm_target
 | 
						|
open Llvm_scalar_opts
 | 
						|
 | 
						|
let main () =
 | 
						|
  ignore (initialize_native_target ());
 | 
						|
 | 
						|
  (* Install standard binary operators.
 | 
						|
   * 1 is the lowest precedence. *)
 | 
						|
  Hashtbl.add Parser.binop_precedence '=' 2;
 | 
						|
  Hashtbl.add Parser.binop_precedence '<' 10;
 | 
						|
  Hashtbl.add Parser.binop_precedence '+' 20;
 | 
						|
  Hashtbl.add Parser.binop_precedence '-' 20;
 | 
						|
  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
 | 
						|
 | 
						|
  (* Prime the first token. *)
 | 
						|
  print_string "ready> "; flush stdout;
 | 
						|
  let stream = Lexer.lex (Stream.of_channel stdin) in
 | 
						|
 | 
						|
  (* Create the JIT. *)
 | 
						|
  let the_execution_engine = ExecutionEngine.create Codegen.the_module in
 | 
						|
  let the_fpm = PassManager.create_function Codegen.the_module in
 | 
						|
 | 
						|
  (* Set up the optimizer pipeline.  Start with registering info about how the
 | 
						|
   * target lays out data structures. *)
 | 
						|
  DataLayout.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
 | 
						|
 | 
						|
  (* Promote allocas to registers. *)
 | 
						|
  add_memory_to_register_promotion the_fpm;
 | 
						|
 | 
						|
  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
 | 
						|
  add_instruction_combination the_fpm;
 | 
						|
 | 
						|
  (* reassociate expressions. *)
 | 
						|
  add_reassociation the_fpm;
 | 
						|
 | 
						|
  (* Eliminate Common SubExpressions. *)
 | 
						|
  add_gvn the_fpm;
 | 
						|
 | 
						|
  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
 | 
						|
  add_cfg_simplification the_fpm;
 | 
						|
 | 
						|
  ignore (PassManager.initialize the_fpm);
 | 
						|
 | 
						|
  (* Run the main "interpreter loop" now. *)
 | 
						|
  Toplevel.main_loop the_fpm the_execution_engine stream;
 | 
						|
 | 
						|
  (* Print out all the generated code. *)
 | 
						|
  dump_module Codegen.the_module
 | 
						|
;;
 | 
						|
 | 
						|
main ()
 |