Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 528, Sun Feb 13 03:05:35 2011 UTC revision 529, Mon Feb 14 15:03:54 2011 UTC
# Line 33  Line 33 
33              | Ty.ImageTy =>  raise Fail "FIXME: ImageTy"              | Ty.ImageTy =>  raise Fail "FIXME: ImageTy"
34            (* end case *))            (* end case *))
35    
36      (* a flag to mark global IL variables, since they need to be treated differently *)
37        local
38          val {getFn, setFn} = V.newFlag ()
39        in
40        val isGlobal = getFn
41        fun markGlobal x = setFn(x, true)
42        end
43    
44    (* a mapping from LowIL variables to target expressions.  Variables get    (* a mapping from LowIL variables to target expressions.  Variables get
45     * removed when the expressions are used as arguments.     * removed when the expressions are used as arguments.
46     *)     *)
47      structure VDefTbl : sig      structure VDefTbl : sig
48          type tbl          type tbl
49    
50          val newTbl : unit -> tbl          val newTbl : T.program -> tbl
51          val getDefOf : tbl -> IL.var -> T.exp          val getDefOf : tbl -> IL.var -> T.exp
52          val useDefOf : tbl -> IL.var -> T.exp          val useDefOf : tbl -> IL.var -> T.exp
53          val setDefOf : tbl -> (IL.var * T.exp) -> unit          val setDefOf : tbl -> (IL.var * T.exp) -> unit
# Line 59  Line 67 
67              bind : T.exp              bind : T.exp
68            }            }
69    
70          type tbl = info V.Tbl.hash_table          datatype tbl = VT of
71                prog : T.program,
72                defs : info V.Tbl.hash_table
73              }
74    
75          fun newTbl () = V.Tbl.mkTable (512, Fail "vtbl")          fun newTbl prog = VT{
76                    prog = prog,
77                    defs = V.Tbl.mkTable (512, Fail "vtbl")
78                  }
79    
80          fun getDefOf tbl x = (case V.Tbl.find tbl x          fun getDefOf (VT{defs, ...}) x = (case V.Tbl.find defs x
81                 of NONE => raise Fail(concat["getDefOf(", V.toString x, ")"])                 of NONE => raise Fail(concat["getDefOf(", V.toString x, ")"])
82                  | SOME{bind, cnt} => bind                  | SOME{bind, cnt} => bind
83                (* end case *))                (* end case *))
84    
85          fun useDefOf tbl x = (case V.Tbl.find tbl x          fun useDefOf (VT{defs, ...}) x = (case V.Tbl.find defs x
86                 of NONE => raise Fail(concat["useDefOf(", V.toString x, ")"])                 of NONE => raise Fail(concat["useDefOf(", V.toString x, ")"])
87                  | SOME{cnt=ref 1, bind} => (                  | SOME{cnt=ref 1, bind} => (
88                      ignore (V.Tbl.remove tbl x);                      ignore (V.Tbl.remove defs x);
89                      bind)                      bind)
90                  | SOME{cnt, bind} => (                  | SOME{cnt, bind} => (
91                      cnt := !cnt - 1;                      cnt := !cnt - 1;
92                      bind)                      bind)
93                (* end case *))                (* end case *))
94    
95            fun defineGlobal ((VT{prog, defs}), x, rhs) = let
96                  val x' = T.Var.global (prog, cvtTy(V.ty x), V.name x)
97                  in
98    
99          fun setDefOf tbl (x, exp) =          fun setDefOf tbl (x, exp) =
100                V.Tbl.insert tbl (x, {cnt = ref(V.useCount x), bind = exp})                V.Tbl.insert tbl (x, {cnt = ref(V.useCount x), bind = exp})
101    
# Line 89  Line 107 
107                        [T.Stmt.assign(lhs, exp)]                        [T.Stmt.assign(lhs, exp)]
108                      end                      end
109    
110          fun bind tbl (x, exp) = (case V.useCount x          fun bind tbl (x, exp) = if isGlobal x
111                  then
112                  else (case V.useCount x
113                 of 1 => (V.Tbl.insert tbl (x, {cnt = ref 1, bind = exp}); [])                 of 1 => (V.Tbl.insert tbl (x, {cnt = ref 1, bind = exp}); [])
114                  | n => let (* bind exp to a new target variable *)                  | n => let (* bind exp to a new target variable *)
115                      val lhs = T.Var.tmp(cvtTy(V.ty x))                      val lhs = T.Var.tmp(cvtTy(V.ty x))
# Line 228  Line 248 
248      fun genGlobals (vtbl, prog, globals, globalInit) = let      fun genGlobals (vtbl, prog, globals, globalInit) = let
249  (* FIXME: we should put the initialization code in a function! *)  (* FIXME: we should put the initialization code in a function! *)
250            in            in
251                List.app markGlobal globals;
252              gen (vtbl, globalInit)              gen (vtbl, globalInit)
253            end            end
254    
255      fun generate (fileStem, IL.Program{globals, globalInit, strands}) = let      fun generate (fileStem, IL.Program{globals, globalInit, strands}) = let
256            val prog = T.newProgram ()            val prog = T.newProgram ()
257            val vtbl = VDefTbl.newTbl()            val vtbl = VDefTbl.newTbl prog
258            in            in
259              genGlobals (vtbl, prog, globals, globalInit);              genGlobals (vtbl, prog, globals, globalInit);
260            (* output the program *)            (* output the program *)

Legend:
Removed from v.528  
changed lines
  Added in v.529

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0