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