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

SCM Repository

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

Diff of /trunk/src/compiler/IL/check-il-fn.sml

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

revision 404, Thu Oct 14 22:11:38 2010 UTC revision 405, Fri Oct 15 04:42:42 2010 UTC
# Line 6  Line 6 
6   * Correctness checker for SSA-based ILs.   * Correctness checker for SSA-based ILs.
7   *)   *)
8    
9  functor CheckILFn () : sig  signature OPERATOR_TY =
10      sig
11        type rator
12        type ty
13    
14        val sigOf : rator -> ty * ty list
15    
16      end
17    
18    functor CheckILFn (
19    
20        structure IL : SSA
21        structure OpTy : OPERATOR_TY
22            where type rator = IL.Op.rator
23            where type ty = IL.Ty.ty
24    
25      ) : sig
26    
27    end = struct    end = struct
28    
29        structure IL = IL
30        structure Ty = IL.Ty
31        structure V = IL.Var
32        structure VSet = V.Set
33    
34        fun checkVar bvs x = if VSet.member(x, bvs)
35              then ()
36              else (* error *)
37    
38        fun chkAssign (bvs, y, rhs) = (
39              (* check that y is not bound twice *)
40                if VSet.member(y, bvs)
41                  then (* error *)
42                  else ();
43                case rhs
44                 of IL.VAR x => (
45                      checkVar bvs x;
46                      if Ty.same(V.ty y, V.ty x)
47                        then ()
48                        else (* error *))
49                  | IL.LIT lit => let
50                      val ty = (case lit
51                             of IL.Int _ => Ty.IntTy
52                              | IL.Float _ => Ty.realTy
53                              | IL.String _ => Ty.StringTy
54                              | IL.Bool _ => Ty.BoolTy
55                            (* end case *))
56                      in
57                        if Ty.same(V.ty y, ty)
58                          then ()
59                          else (* error *)
60                      end
61                  | IL.OP(rator, xs) => let
62                      val (resTy, argTys) = OpTy.sigOf rator
63                      in
64                        List.app (checkVar bvs) xs;
65                        if Ty.same(V.ty y, resTy)
66                          then ()
67                          else (* error *);
68                        if ListPair.allEq (fn (x, ty) => Ty.same(V.ty x, ty)) (xs, argsTys)
69                          then ()
70                          else (* error *)
71                      end
72                  | IL.CONS xs => (
73                      List.app (checkVar bvs) xs;
74    (* FIXME: check type of y *)())
75                (* end case *);
76                VSet.add(bvs, y))
77    
78        fun checkPhi (bvs, y, xs) = let
79              val ty = V.ty y
80              in
81              (* check that y is not bound twice *)
82                if VSet.member(y, bvs)
83                  then (* error *)
84                  else ();
85              (* check that rhs vars have the correct type *)
86                if List.all (fn x => Ty.same(V.ty x, ty)) xs
87                  then ()
88                  else (* error *)
89              end
90    
91    end    end

Legend:
Removed from v.404  
changed lines
  Added in v.405

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