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