You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			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 () |