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