From: Joshua Wise Date: Sat, 10 Jul 2010 04:58:57 +0000 (-0400) Subject: Emit strings at the end. X-Git-Url: http://git.joshuawise.com/snipe.git/commitdiff_plain/469e60eb4974bf3fc47cfa5b9a33b14983bec135 Emit strings at the end. --- diff --git a/top/top.sml b/top/top.sml index 006fa46..6c9f0a2 100644 --- a/top/top.sml +++ b/top/top.sml @@ -213,10 +213,22 @@ struct 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 ^ " ...") diff --git a/trans/stringref.sml b/trans/stringref.sml index f78bd95..978d4a3 100644 --- a/trans/stringref.sml +++ b/trans/stringref.sml @@ -12,6 +12,7 @@ sig 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 = @@ -25,6 +26,7 @@ struct (* 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