1 cananian 1.1.2.1 // DerivationChecker.java, created Mon Oct 16 18:01:29 2000 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.Analysis.LowQuad;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import harpoon.Analysis.Maps.Derivation;
 7 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
 8 cananian 1.1.2.1 import harpoon.ClassFile.HCode;
 9 cananian 1.1.2.1 import harpoon.ClassFile.HCodeFactory;
10 cananian 1.1.2.1 import harpoon.ClassFile.HMethod;
11 cananian 1.1.2.1 import harpoon.IR.Quads.Quad;
12 cananian 1.1.2.1 import harpoon.Temp.Temp;
13 cananian 1.1.2.1 
14 cananian 1.1.2.1 import java.util.Iterator;
15 cananian 1.1.2.1 /**
16 cananian 1.1.2.1  * A <code>DerivationChecker</code> checks that all temps
17 cananian 1.1.2.1  * defined in a <code>LowQuad.Code</code> have proper
18 cananian 1.1.2.1  * derivations.
19 cananian 1.1.2.1  * 
20 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
21 cananian 1.4      * @version $Id: DerivationChecker.java,v 1.4 2003/03/11 00:58:14 cananian Exp $
22 cananian 1.1.2.1  */
23 cananian 1.1.2.1 public class DerivationChecker {
24 cananian 1.1.2.1     
25 cananian 1.1.2.1     /** No one can create a <code>DerivationChecker</code> object. */
26 cananian 1.1.2.1     private DerivationChecker() { }
27 cananian 1.1.2.1 
28 cananian 1.1.2.1     /** Create an <code>HCodeFactory</code> that will check the
29 cananian 1.1.2.1      *  derivation of every "converted" <code>HCode</code>. */
30 cananian 1.1.2.1     public static HCodeFactory codeFactory(final HCodeFactory hcf) {
31 cananian 1.1.2.1         return new HCodeFactory() {
32 cananian 1.1.2.1             public String getCodeName() { return hcf.getCodeName(); }
33 cananian 1.1.2.1             public void clear(HMethod m) { hcf.clear(m); }
34 cananian 1.1.2.1             public HCode convert(HMethod m) {
35 cananian 1.1.2.1                 HCode hc = hcf.convert(m);
36 cananian 1.1.2.1                 if (hc!=null) check(hc);
37 cananian 1.1.2.1                 return hc;
38 cananian 1.1.2.1             }
39 cananian 1.1.2.1         };
40 cananian 1.1.2.1     }
41 cananian 1.1.2.1     /** Check the given <code>HCode</code> for <code>Derivation</code>
42 cananian 1.1.2.1      *  errors. */
43 cananian 1.1.2.1     public static void check(HCode hcode) {
44 cananian 1.1.2.1         harpoon.IR.Quads.Code c = (harpoon.IR.Quads.Code) hcode;
45 cananian 1.1.2.1         // look at the derivation for every lowquad.
46 cananian 1.4             Derivation<Quad> d = c.getDerivation();
47 cananian 1.1.2.1         ASSERT(d!=null, "Checker found no derivation!");
48 cananian 1.4             for (Iterator<Quad> it=c.getElementsI(); it.hasNext(); ) {
49 cananian 1.4                 Quad q = it.next();
50 cananian 1.1.2.1             Temp[] defs = q.def();
51 cananian 1.1.2.1             for (int i=0; i<defs.length; i++) {
52 cananian 1.1.2.1                 try {
53 cananian 1.1.2.1                     HClass hc = d.typeMap(q, defs[i]);
54 cananian 1.1.2.1                     Derivation.DList dl = d.derivation(q, defs[i]);
55 cananian 1.1.2.1                     ASSERT(hc!=null ^ dl!=null, "BAD TYPE: "+hc+" / "+dl);
56 cananian 1.1.2.1                 } catch (Derivation.TypeNotKnownException tnke) {
57 cananian 1.1.2.1                     ASSERT(false, tnke);
58 cananian 1.1.2.1                 }
59 cananian 1.1.2.1             }
60 cananian 1.1.2.1         }
61 cananian 1.1.2.1     }
62 cananian 1.1.2.1     /** Simple assertion facility -- this is not intended to be
63 cananian 1.1.2.1      *  "compiled away" or turned off for speed like the standard
64 cananian 1.3          *  harpoon.Util.Util.ASSERTion facility. */
65 cananian 1.1.2.1     private static void ASSERT(boolean cond, Object errmsg) {
66 cananian 1.1.2.1         if (!cond) throw new Error(errmsg.toString());
67 cananian 1.1.2.1     }
68 cananian 1.2     }