open Ll open Arg open Util.Assert open Oat.Driver module Platform = Util.Platform module Opt = Oat.Opt module Backend = Oat.Backend exception Ran_tests let suite = ref (Gradedtests.graded_tests) let execute_tests () = Platform.configure_os (); let outcome = run_suite !suite in Printf.printf "%s\n" (outcome_to_string outcome); raise Ran_tests let args = [ ("-linux", Set Platform.linux, "force linux-style name mangling [must preceed --test]") ; ("--test", Unit execute_tests, "run the test suite, ignoring other files inputs") ; ("-op", Set_string Platform.output_path, "set the path to the output files directory [default='output']") ; ("-o", Set_string executable_filename, "set the name of the resulting executable [default='a.out']") ; ("-S", Clear assemble, "stop after generating .s files; do generate .o files") ; ("-c", Clear link, "stop after generating .o files; do not generate executables") ; ("--print-ll", Set print_ll_flag, "prints the program's LL code (after lowering to clang code if --clang-malloc is set)") ; ("--print-x86", Set print_x86_flag, "prints the program's assembly code") ; ("--clang", Set clang, "compiles to assembly using clang, not the CS131 backend (implies --clang-malloc)") ; ("--execute-x86", Set execute_x86, "run the resulting executable file") ; ("-v", Set Platform.verbose, "enables more verbose compilation output") ; ("-O1", Set Opt.do_opt, "enable optimization") ; ("--regalloc", Symbol (["none"; "greedy"; "better"], Backend.set_regalloc), " use the specified register allocator") ; ("--liveness", Symbol (["trivial"; "dataflow"], Backend.set_liveness), " use the specified liveness analysis") ; ("--print-regs", Set print_regs_flag, "prints the register usage statistics for x86 code") ] let files = ref [] let _ = Gc.set { (Gc.get()) with Gc.minor_heap_size = (1000448 * 32); Gc.major_heap_increment = (1000448 * 64); }; Platform.configure_os (); Platform.create_output_dir (); try Arg.parse args (fun filename -> files := filename :: !files) "CS131 main test harness\n\ USAGE: ./oatc [options] \n\ see README for details about using the compiler"; Platform.configure_os (); process_files !files with Ran_tests -> ()