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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 405 - (view) (download)

1 : jhr 369 (* check-il-fn.sml
2 :     *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * Correctness checker for SSA-based ILs.
7 :     *)
8 :    
9 : jhr 405 signature OPERATOR_TY =
10 :     sig
11 :     type rator
12 :     type ty
13 : jhr 369
14 : jhr 405 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 : jhr 369 end = struct
28 :    
29 : jhr 405 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 : jhr 369 end

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