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 ()
 |