17abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(*===----------------------------------------------------------------------===
27abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * Main driver code.
37abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao *===----------------------------------------------------------------------===*)
47abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
57abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoopen Llvm
67abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoopen Llvm_executionengine
77abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoopen Llvm_target
87abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoopen Llvm_scalar_opts
97abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
107abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaolet main () =
117abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  ignore (initialize_native_target ());
127abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
137abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Install standard binary operators.
147abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao   * 1 is the lowest precedence. *)
157abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '=' 2;
167abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '<' 10;
177abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '+' 20;
187abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '-' 20;
197abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
207abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
217abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Prime the first token. *)
227abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  print_string "ready> "; flush stdout;
237abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let stream = Lexer.lex (Stream.of_channel stdin) in
247abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
257abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Create the JIT. *)
267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let the_execution_engine = ExecutionEngine.create Codegen.the_module in
277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let the_fpm = PassManager.create_function Codegen.the_module in
287abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
297abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Set up the optimizer pipeline.  Start with registering info about how the
307abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao   * target lays out data structures. *)
317abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
327abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
337abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Promote allocas to registers. *)
347abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_memory_to_register_promotion the_fpm;
357abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
367abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
377abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_instruction_combination the_fpm;
387abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
397abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* reassociate expressions. *)
407abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_reassociation the_fpm;
417abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
427abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Eliminate Common SubExpressions. *)
437abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_gvn the_fpm;
447abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
457abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
467abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_cfg_simplification the_fpm;
477abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
487abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  ignore (PassManager.initialize the_fpm);
497abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
507abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Run the main "interpreter loop" now. *)
517abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Toplevel.main_loop the_fpm the_execution_engine stream;
527abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
537abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Print out all the generated code. *)
547abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  dump_module Codegen.the_module
557abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao;;
567abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
577abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaomain ()
58