val _ = Flag.guard Flags.verbose say "Optimizing whole-program IR..."
val ir = Optimizer.optimize_ir (!enabledopts) ir
val _ = Flag.guard Flags.ir (fn () => say (TreeUtils.Print.pp_program ir)) ()
-
- val output = foldr (fn (func, code) => (processir ("calloc" (* lololololol *) :: (Symbol.elems externs)) func) ^ code)
- (".file\t\"" ^ source ^ "\"\n.ident\t\"15-411 ASS compiler by czl@ and jwise@\"\n" ^
- ".ident \"Optimizations enabled: " ^ String.concat (map (fn x => (#shortname x) ^ " ") (!enabledopts)) ^ "\"\n") ir
+
+ val code = map (fn func => processir ("calloc" (* lololololol *) :: (Symbol.elems externs)) func) ir
+ val strings = map (fn (sn, s) => String.concat (
+ [Stringref.name sn, ": .word "] @
+ (map (fn c => (Int.toString (ord c)) ^ ", ") (String.explode s)) @
+ ["0\n"]
+ ) ) (Stringref.all ())
+
+ val output =
+ String.concat (
+ ".file\t\"" :: source :: "\"\n" ::
+ ".ident\t\"15-411 ASS compiler by czl@ and jwise@\"\n" ::
+ ".ident \"Optimizations enabled: " :: (map (fn x => (#shortname x) ^ " ") (!enabledopts)) @ [ "\"\n" ] @
+ code @
+ [ ".section .rodata\n" ] @
+ strings )
val afname = stem source ^ ".s"
val _ = Flag.guard Flags.verbose say ("Writing assembly to " ^ afname ^ " ...")
val new : string -> stringref (* returns a unique new stringref *)
val name : stringref -> string (* returns the name of a stringref *)
val compare : stringref * stringref -> order (* comparison function *)
+ val all : unit -> (stringref * string) list
end
structure Stringref :> STRINGREF =
(* warning: calling reset() may jeopardize uniqueness of stringrefs! *)
fun reset () = ( counter := 1 ; strings := [] )
fun new (s : string) = !counter before ( strings := (!counter, s) :: !strings ; counter := !counter + 1 )
+ fun all () = !strings
end
fun name t = "S" ^ Int.toString t