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 '<' 10;
167abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '+' 20;
177abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '-' 20;
187abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
197abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
207abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Prime the first token. *)
217abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  print_string "ready> "; flush stdout;
227abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let stream = Lexer.lex (Stream.of_channel stdin) in
237abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
247abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Create the JIT. *)
257abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let the_execution_engine = ExecutionEngine.create Codegen.the_module in
267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  let the_fpm = PassManager.create_function Codegen.the_module in
277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
287abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Set up the optimizer pipeline.  Start with registering info about how the
297abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao   * target lays out data structures. *)
307abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
317abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
327abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
337abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_instruction_combination the_fpm;
347abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
357abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* reassociate expressions. *)
367abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_reassociation the_fpm;
377abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
387abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Eliminate Common SubExpressions. *)
397abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_gvn the_fpm;
407abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
417abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
427abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  add_cfg_simplification the_fpm;
437abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
447abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  ignore (PassManager.initialize the_fpm);
457abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
467abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Run the main "interpreter loop" now. *)
477abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  Toplevel.main_loop the_fpm the_execution_engine stream;
487abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
497abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Print out all the generated code. *)
507abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  dump_module Codegen.the_module
517abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao;;
527abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
537abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaomain ()
54