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

SCM Repository

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

Diff of /branches/pure-cfg/src/compiler/translate/translate.sml

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

revision 501, Tue Feb 1 22:02:37 2011 UTC revision 502, Wed Feb 2 19:38:52 2011 UTC
# Line 150  Line 150 
150            (* end case *))            (* end case *))
151    
152      fun cvtBlock (env : env, joinStk, S.Block stms) = let      fun cvtBlock (env : env, joinStk, S.Block stms) = let
153            fun cvt (env : env, cfg, []) = cfg            fun cvt (env : env, cfg, []) = (cfg, env)
154              | cvt (env, cfg, stm::stms) = (case stm              | cvt (env, cfg, stm::stms) = (case stm
155                   of S.S_Assign(lhs, rhs) => let                   of S.S_Assign(lhs, rhs) => let
156                        val lhs' = newVar lhs                        val lhs' = newVar lhs
# Line 162  Line 162 
162                    | S.S_IfThenElse(x, b0, b1) => let                    | S.S_IfThenElse(x, b0, b1) => let
163                        val x' = lookup env x                        val x' = lookup env x
164                        val join = newJoin 2                        val join = newJoin 2
165                        val cfg0 = cvtBlock (env, (0, join)::joinStk, b0)                        val (cfg0, _) = cvtBlock (env, (0, join)::joinStk, b0)
166                        val cfg1 = cvtBlock (env, (1, join)::joinStk, b1)                        val (cfg1, _) = cvtBlock (env, (1, join)::joinStk, b1)
167                        val cond = IL.Node.mkCOND {                        val cond = IL.Node.mkCOND {
168                                cond = x',                                cond = x',
169                                trueBranch = IL.Node.dummy,                                trueBranch = IL.Node.dummy,
# Line 202  Line 202 
202                        end                        end
203                    | S.S_Die => (                    | S.S_Die => (
204                        killPath joinStk;                        killPath joinStk;
205                        IL.CFG.appendNode (cfg, IL.Node.mkDIE ()))                        (IL.CFG.appendNode (cfg, IL.Node.mkDIE ()), env))
206                    | S.S_Stabilize => (                    | S.S_Stabilize => (
207                        killPath joinStk;                        killPath joinStk;
208                        IL.CFG.appendNode (cfg, IL.Node.mkSTABILIZE ()))                        (IL.CFG.appendNode (cfg, IL.Node.mkSTABILIZE ()), env))
209                  (* end case *))                  (* end case *))
210            in            in
211              cvt (env, IL.CFG.empty, stms)              cvt (env, IL.CFG.empty, stms)
212            end            end
213    
 (* FIX THIS CODE!!!! *)  
214      fun cvtTopLevelBlock (env, blk) = let      fun cvtTopLevelBlock (env, blk) = let
215            fun finish (env, firstNd, lastNd) = let            val (cfg, env) = cvtBlock (env, [], blk)
216                  val entry = IL.Node.mkENTRY ()                  val entry = IL.Node.mkENTRY ()
217                  val exit = IL.Node.mkEXIT ()                  val exit = IL.Node.mkEXIT ()
218                  in                  in
219                    IL.Node.addEdge (entry, firstNd);              IL.Node.addEdge (entry, IL.CFG.entry cfg);
220                  (* NOTE: this addEdge could fail if all control paths end in DIE or STABILIZE,                  (* NOTE: this addEdge could fail if all control paths end in DIE or STABILIZE,
221                   * so we wrap it in a handler                   * so we wrap it in a handler
222                   *)                   *)
223                    IL.Node.addEdge (lastNd, exit) handle _ => ();              IL.Node.addEdge (IL.CFG.exit cfg, exit) handle _ => ();
224                    IL.CFG{entry = entry, exit = exit}              (IL.CFG{entry = entry, exit = exit}, env)
                 end  
           in  
             cvtBlock (env, blk, finish)  
225            end            end
226    
227    (* generate fresh SSA variables and add them to the environment *)    (* generate fresh SSA variables and add them to the environment *)

Legend:
Removed from v.501  
changed lines
  Added in v.502

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