149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar(*===----------------------------------------------------------------------===
249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar * Main driver code.
349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar *===----------------------------------------------------------------------===*)
449457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
549457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaaropen Llvm
649457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaaropen Llvm_executionengine
749457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaaropen Llvm_target
849457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaaropen Llvm_scalar_opts
949457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
1049457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaarlet main () =
1149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  ignore (initialize_native_target ());
1249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
1349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Install standard binary operators.
1449457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar   * 1 is the lowest precedence. *)
1549457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  Hashtbl.add Parser.binop_precedence '<' 10;
1649457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  Hashtbl.add Parser.binop_precedence '+' 20;
1749457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  Hashtbl.add Parser.binop_precedence '-' 20;
1849457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
1949457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
2049457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Prime the first token. *)
2149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  print_string "ready> "; flush stdout;
2249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  let stream = Lexer.lex (Stream.of_channel stdin) in
2349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
2449457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Create the JIT. *)
2549457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  let the_execution_engine = ExecutionEngine.create Codegen.the_module in
2649457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  let the_fpm = PassManager.create_function Codegen.the_module in
2749457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
2849457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Set up the optimizer pipeline.  Start with registering info about how the
2949457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar   * target lays out data structures. *)
302b4b44e0d2e95fc695eafcc4d192fe1ae261e01eMicah Villmow  DataLayout.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
3149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
3249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
3349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  add_instruction_combination the_fpm;
3449457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
3549457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* reassociate expressions. *)
3649457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  add_reassociation the_fpm;
3749457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
3849457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Eliminate Common SubExpressions. *)
3949457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  add_gvn the_fpm;
4049457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
4149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
4249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  add_cfg_simplification the_fpm;
4349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
4449457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  ignore (PassManager.initialize the_fpm);
4549457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
4649457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Run the main "interpreter loop" now. *)
4749457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  Toplevel.main_loop the_fpm the_execution_engine stream;
4849457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
4949457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  (* Print out all the generated code. *)
5049457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar  dump_module Codegen.the_module
5149457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar;;
5249457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaar
5349457b81589c6a3ef384caa8fdf1463ad2ada7c7Erick Tryzelaarmain ()
54