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