X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/0a24e44d4e9f82f8d3d83de8e58c83c8cf2868b6..6ade8b0a3251e44b34c6bdbbd9403e36d6fd6231:/top/top.sml diff --git a/top/top.sml b/top/top.sml index 35e03a6..5e564b1 100644 --- a/top/top.sml +++ b/top/top.sml @@ -1,4 +1,4 @@ -(* L1 Compiler +(* L3 Compiler * Top Level Environment * Author: Kaustuv Chaudhuri * Modified: Alex Vaynberg @@ -34,6 +34,7 @@ struct val flag_ast = Flag.flag "ast" val flag_ir = Flag.flag "ir" val flag_assem = Flag.flag "assem" + val flag_color = Flag.flag "color" fun reset_flags () = List.app Flag.unset [flag_verbose, flag_ast, @@ -53,7 +54,10 @@ struct help="pretty print the liveness results"}, {short = "s", long=["dump-assem"], desc=G.NoArg (fn () => Flag.set flag_assem), - help="pretty print the assembly before register allocaction"} + help="pretty print the assembly before register allocaction"}, + {short = "c", long=["dump-color"], + desc=G.NoArg (fn () => Flag.set flag_color), + help="pretty print the allocated regs"} ] @@ -66,6 +70,73 @@ struct then s (* return whole string *) else Substring.string (Substring.trimr 1 prefix) end + + fun processir externs (Tree.FUNCTION (id, ir)) = + let + val name = "_l3_" ^ (Symbol.name id) + + fun realname s = if (List.exists (fn n => s = n) externs) + then s + else "_l3_" ^ s + + val _ = Flag.guard flag_verbose say ("Processing function: " ^ name) + + val _ = Flag.guard flag_verbose say " Generating proto-x86_64 code..." + val assem = Codegen.codegen ir + val _ = Flag.guard flag_assem + (fn () => List.app (TextIO.print o (x86.prettyprint x86.Long)) assem) () + + val _ = Flag.guard flag_verbose say " Analyzing liveness..." + val (preds, liveness) = Liveness.liveness assem; + val _ = Flag.guard flag_liveness + (fn () => List.app + (fn (asm, liv) => + TextIO.print ( + let + val xpp = x86.prettyprint x86.Long asm + val xpp = String.extract (xpp, 0, SOME (size xpp - 1)) + val spaces = implode (List.tabulate (40 - size xpp, fn _ => #" ")) handle size => "" + val lpp = Liveness.prettyprint liv + val lpp = String.extract (lpp, 0, SOME (size lpp - 1)) + val spaces2 = implode (List.tabulate (40 - size lpp, fn _ => #" ")) handle size => "" + in + xpp ^ spaces ^ lpp ^ spaces2 ^ "\n" + end)) + (ListPair.zip (assem, Liveness.listify liveness))) () + + val _ = Flag.guard flag_verbose say " Graphing..." + val (igraph,temps) = Igraph.gengraph (preds, liveness) + + val _ = Flag.guard flag_verbose say " Ordering..." + val order = ColorOrder.colororder (igraph,temps) + + val _ = Flag.guard flag_verbose say " Coloring..." + val colors = Colorizer.colorize order igraph; + val _ = Flag.guard flag_color + (fn () => List.app (TextIO.print o + (fn (t, i) => + (Temp.name t) ^ " => " ^ ( + if (i <= x86.regtonum x86.R14D) + then (x86.prettyprint_oper x86.Long (x86.REG (x86.numtoreg i))) + else + "spill[" ^ Int.toString (i - x86.regtonum x86.R14D) ^ "]") + ^ "--"^ Int.toString i ^ "\n")) + colors) () + + val _ = Flag.guard flag_verbose say " Solidifying x86_64 code..." + val x86 = Solidify.solidify colors assem; + + val _ = Flag.guard flag_verbose say " Peepholing..." + val x86p = Peephole.peephole x86; + + val _ = Flag.guard flag_verbose say " Stringifying..." + val x86d = [x86.DIRECTIVE(".globl " ^ name), + x86.DIRECTIVE(name ^ ":")] + @ x86p + val code = Stringify.stringify realname x86d + in + code + end fun main (name, args) = let @@ -96,51 +167,25 @@ struct val ast = Parse.parse source val _ = Flag.guard flag_ast (fn () => say (Ast.Print.pp_program ast)) () - + + val externs = List.mapPartial + (fn (Ast.Function _) => NONE + | (Ast.Extern (_, s, _)) => SOME (Symbol.name s)) ast + val _ = Flag.guard flag_verbose say "Checking..." val ast = TypeChecker.typecheck ast - + val _ = Flag.guard flag_verbose say "Translating..." val ir = Trans.translate ast val _ = Flag.guard flag_ir (fn () => say (Tree.Print.pp_program ir)) () - - val _ = Flag.guard flag_verbose say "Generating proto-x86_64 code..." - val assem = Codegen.codegen ir - val _ = Flag.guard flag_assem - (fn () => List.app (TextIO.print o x86.prettyprint) assem) () - - val _ = Flag.guard flag_verbose say "Analyzing liveness..." - val liveness = Liveness.liveness assem; - val _ = Flag.guard flag_liveness - (fn () => List.app (TextIO.print o Liveness.prettyprint) liveness) () - - val _ = Flag.guard flag_verbose say "Graphing..." - val igraph = Igraph.gengraph liveness; - - val _ = Flag.guard flag_verbose say "Ordering..." - val order = ColorOrder.colororder igraph; - val _ = Flag.guard flag_verbose say "Coloring..." - val colors = Colorizer.colorize order igraph; - - val _ = Flag.guard flag_verbose say "Solidifying x86_64 code..." - val x86 = Solidify.solidify colors assem; - - val _ = Flag.guard flag_verbose say "Peepholing..." - val x86p = Peephole.peephole x86; - - val _ = Flag.guard flag_verbose say "Stringifying..." - val x86d = [x86.DIRECTIVE(".file\t\"" ^ source ^ "\""), - x86.DIRECTIVE(".globl _l2_main"), - x86.DIRECTIVE("_l2_main:")] - @ x86p - @ [x86.DIRECTIVE ".ident\t\"15-411 L2 compiler by czl@ and jwise@\""] - val code = Stringify.stringify x86d + val output = foldr (fn (func, code) => (processir externs func) ^ code) + (".file\t\"" ^ source ^ "\"\n.ident\t\"15-411 L3 compiler by czl@ and jwise@\"\n") ir val afname = stem source ^ ".s" val _ = Flag.guard flag_verbose say ("Writing assembly to " ^ afname ^ " ...") val _ = SafeIO.withOpenOut afname (fn afstream => - TextIO.output (afstream, code)) + TextIO.output (afstream, output)) in OS.Process.success end