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 }