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

SCM Repository

[diderot] Diff of /trunk/src/compiler/IL/translate-fn.sml
ViewVC logotype

Diff of /trunk/src/compiler/IL/translate-fn.sml

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

revision 359, Tue Sep 28 22:03:40 2010 UTC revision 360, Wed Sep 29 02:59:34 2010 UTC
# Line 15  Line 15 
15    
16      type env = DstIL.var SrcIL.Var.Tbl.hash_table      type env = DstIL.var SrcIL.Var.Tbl.hash_table
17    
     val fresh : (env * SrcIL.var) -> DstIL.var  
18      val rename : (env * SrcIL.var) -> DstIL.var      val rename : (env * SrcIL.var) -> DstIL.var
19      val expand : (env * SrcIL.assign) -> DstIL.assign list      val expand : (env * SrcIL.assign) -> DstIL.assign list
20    
# Line 39  Line 38 
38          vMap : Params.env          vMap : Params.env
39        }        }
40    
     fun fresh (E{vMap, ...}, x) = let  
           val x' = Params.fresh(vMap, x)  
           in  
             x'  
           end  
   
41      fun rename (E{vMap, ...}, x) = Params.rename(vMap, x)      fun rename (E{vMap, ...}, x) = Params.rename(vMap, x)
42    
43      fun expand (E{vMap, ...}, assign) = Params.expand (vMap, assign)      fun expand (E{vMap, ...}) (assign, assigns') =
44              Params.expand (vMap, assign) @ assigns'
45    
46    (* the first pass creates the nodes of the DstIL CFG and defines    (* the first pass creates the nodes of the DstIL CFG and defines
47     * the environment that maps from SrcIL nodes and variables to     * the environment that maps from SrcIL nodes and variables to
48     * DstIL nodes and variables.     * DstIL nodes and variables.
49     *)     *)
50      fun translateNodes (env, stm) = let      fun translateNodes (env, stm) = let
51            fun trans (SrcIL.ND{kind, ...}) = let            fun trans (SrcIL.ND{id, kind, ...}) = let
52                  val newNd = (case kind                  val newNd = (case kind
53                      of NULL => raise Fail "unexpected NULL node"                       of SrcIL.NULL => raise Fail "unexpected NULL node"
54                       | ENTRY _ => SrcNd.mkEntry()                        | SrcIL.ENTRY _ => DstNd.mkENTRY()
55                       | JOIN{preds, phis, succ} =>                        | SrcIL.JOIN{phis, ...} => let
56                       | COND{pred, cond, trueBranch, falseBranch} =>                            fun cvtPhi (x, xs) =
57                       | BLOCK{pred, body, succ} =>                                  (rename(env, x), List.map (fn x => rename(env, x)) xs)
58                       | NEW{pred, actor, args, succ} =>                            in
59                       | DIE{pred, ...} =>                              DstNd.mkJOIN(List.map cvtPhi phis)
60                       | STABILIZE{pred} =>                            end
61                       | EXIT{pred} =>                        | SrcIL.COND{cond, trueBranch, falseBranch, ...} => DstNd.mkCOND{
62                                cond = rename(env, cond),
63                                trueBranch = DstNd.dummy,
64                                trueBranch = DstNd.dummy
65                              }
66                          | SrcIL.BLOCK{body, ...} => let
67                              val body' = List.foldr (expand env) [] (!body)
68                              in
69                                DstNd.mkBLOCK body'
70                              end
71                          | SrcIL.NEW{actor, args, ...} => DstNd.mkNEW{
72                                actor = actor,
73                                args = List.map (fn x => rename(env, x)) args
74                              }
75                          | SrcIL.DIE _ => DstNd.mkDIE()
76                          | SrcIL.STABILIZE _ => DstNd.mkSTABILIZE()
77                          | SrcIL.EXIT _ => DstNd.mkEXIT()
78                     (* end case *))                     (* end case *))
79            in            in
80                      insertNd (env, id, newNd)
81                    end
82              in
83                SrcIL.applyToNodes trans stm
84            end            end
85    
86      fun translate (env, SrcIL.STM{kind, next, ...}) = (case kind      fun translate (env, stm) = (case kind
87             of SrcIL.S_SIMPLE(SrcIL.ND{kind, ...}) => (case kind             of SrcIL.S_SIMPLE(SrcIL.ND{kind, ...}) => (case kind
88                   of NULL =>                   of NULL =>
89                    | ENTRY{succ} =>                    | ENTRY{succ} =>

Legend:
Removed from v.359  
changed lines
  Added in v.360

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