1 cananian 1.1.2.10 // CheckAdder.java, created Tue Jan 23 16:09:50 2001 by wbeebee 2 wbeebee 1.1.2.1 // Copyright (C) 2001 Wes Beebee <wbeebee@mit.edu> 3 wbeebee 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 wbeebee 1.1.2.1 package harpoon.Analysis.Realtime; 5 wbeebee 1.1.2.1 6 wbeebee 1.1.2.5 import java.io.PrintWriter; 7 wbeebee 1.5 import java.util.Iterator; 8 wbeebee 1.1.2.5 9 wbeebee 1.1.2.1 import harpoon.Analysis.Transformation.MethodMutator; 10 wbeebee 1.1.2.1 11 wbeebee 1.1.2.1 import harpoon.ClassFile.HClass; 12 wbeebee 1.1.2.1 import harpoon.ClassFile.HCode; 13 wbeebee 1.1.2.1 import harpoon.ClassFile.HCodeAndMaps; 14 wbeebee 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 15 wbeebee 1.1.2.1 import harpoon.ClassFile.HMethod; 16 wbeebee 1.1.2.1 import harpoon.ClassFile.Linker; 17 wbeebee 1.1.2.1 18 wbeebee 1.1.2.1 import harpoon.IR.Quads.ANEW; 19 wbeebee 1.1.2.1 import harpoon.IR.Quads.ARRAYINIT; 20 wbeebee 1.1.2.1 import harpoon.IR.Quads.ASET; 21 wbeebee 1.1.2.1 import harpoon.IR.Quads.CALL; 22 wbeebee 1.1.2.1 import harpoon.IR.Quads.CONST; 23 wbeebee 1.1.2.5 import harpoon.IR.Quads.METHOD; 24 wbeebee 1.1.2.1 import harpoon.IR.Quads.MOVE; 25 wbeebee 1.1.2.1 import harpoon.IR.Quads.NEW; 26 wbeebee 1.1.2.1 import harpoon.IR.Quads.SET; 27 wbeebee 1.1.2.1 28 wbeebee 1.1.2.1 import harpoon.IR.Quads.Edge; 29 wbeebee 1.1.2.1 import harpoon.IR.Quads.Quad; 30 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadFactory; 31 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadVisitor; 32 wbeebee 1.1.2.9 import harpoon.IR.Quads.QuadNoSSA; 33 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadWithTry; 34 wbeebee 1.1.2.1 35 wbeebee 1.1.2.1 import harpoon.Temp.Temp; 36 wbeebee 1.1.2.1 import harpoon.Temp.TempFactory; 37 wbeebee 1.1.2.1 38 cananian 1.7 import net.cscott.jutil.SnapshotIterator; 39 cananian 1.6 40 wbeebee 1.1.2.1 import harpoon.Util.HClassUtil; 41 wbeebee 1.1.2.1 import harpoon.Util.Util; 42 wbeebee 1.1.2.1 43 wbeebee 1.1.2.1 /** 44 wbeebee 1.1.2.2 * <code>CheckAdder</code> attaches <code>javax.realtime.MemoryArea</code>s to 45 wbeebee 1.1.2.1 * <code>NEW</code>s and <code>ANEW</code>s. It also adds checks around 46 wbeebee 1.1.2.1 * <code>SET</code>s and <code>ASET</code>s only if the 47 wbeebee 1.1.2.1 * <code>CheckRemoval</code> indicates that the check cannot be removed. 48 wbeebee 1.1.2.1 * 49 cananian 1.1.2.10 * @author Wes Beebee <wbeebee@mit.edu> 50 cananian 1.7 * @version $Id: CheckAdder.java,v 1.7 2004/02/08 01:53:47 cananian Exp $ 51 wbeebee 1.1.2.1 */ 52 wbeebee 1.1.2.1 53 wbeebee 1.1.2.8 // Fix to be non-static... 54 wbeebee 1.1.2.6 55 wbeebee 1.1.2.8 abstract class CheckAdder extends MethodMutator { 56 wbeebee 1.1.2.8 protected CheckRemoval checkRemoval; 57 wbeebee 1.1.2.8 protected NoHeapCheckRemoval noHeapCheckRemoval; 58 wbeebee 1.1.2.8 59 wbeebee 1.1.2.9 public boolean fastNew = true; 60 wbeebee 1.1.2.9 public boolean smartMemAreaLoads = false; 61 wbeebee 1.1.2.9 public boolean debugOutput = false; 62 wbeebee 1.1.2.1 63 wbeebee 1.1.2.1 /** Creates a new <code>CheckAdder</code>, adding only the checks that 64 wbeebee 1.1.2.5 * can't be removed as specified by <code>CheckRemoval</code> and 65 wbeebee 1.1.2.5 * <code>NoHeapCheckRemoval</code>. 66 wbeebee 1.1.2.5 * Use <code>hcf = (new CheckAdder(cr, nhcr, hcf)).codeFactory(); to link 67 wbeebee 1.1.2.1 * this <code>CheckAdder</code> into the <code>HCodeFactory</code> chain. 68 wbeebee 1.1.2.1 */ 69 wbeebee 1.1.2.1 70 wbeebee 1.1.2.5 CheckAdder(CheckRemoval cr, NoHeapCheckRemoval nhcr, HCodeFactory parent) { 71 wbeebee 1.1.2.1 super(parent); 72 wbeebee 1.1.2.1 checkRemoval = cr; 73 salcianu 1.1.2.7 74 wbeebee 1.1.2.5 noHeapCheckRemoval = nhcr; 75 wbeebee 1.1.2.1 } 76 wbeebee 1.1.2.1 77 wbeebee 1.1.2.1 /** Adds the checks to the code <code>input</code>. */ 78 wbeebee 1.1.2.1 79 wbeebee 1.1.2.8 abstract protected HCode mutateHCode(HCodeAndMaps input); 80 wbeebee 1.1.2.8 81 wbeebee 1.1.2.8 protected HCode mutateHCode(HCodeAndMaps input, QuadVisitor visitor) { 82 wbeebee 1.1.2.1 Stats.realtimeBegin(); 83 wbeebee 1.1.2.1 HCode hc = input.hcode(); 84 wbeebee 1.1.2.1 if (hc == null) { 85 wbeebee 1.1.2.1 Stats.realtimeEnd(); 86 wbeebee 1.1.2.1 return hc; 87 wbeebee 1.1.2.1 } 88 wbeebee 1.1.2.1 HClass hclass = hc.getMethod().getDeclaringClass(); 89 wbeebee 1.1.2.2 if (hclass.getName().startsWith("javax.realtime.")) { 90 wbeebee 1.1.2.1 Stats.realtimeEnd(); 91 wbeebee 1.1.2.1 return hc; 92 wbeebee 1.1.2.1 } 93 wbeebee 1.1.2.1 final Linker linker = hclass.getLinker(); 94 wbeebee 1.1.2.1 95 wbeebee 1.1.2.8 if (debugOutput) { 96 wbeebee 1.1.2.8 System.out.println("Before:"); 97 wbeebee 1.1.2.8 hc.print(new PrintWriter(System.out)); 98 wbeebee 1.1.2.8 } 99 wbeebee 1.1.2.8 100 cananian 1.6 // note that we use a SnapshotIterator so that qi is 'static'; 101 cananian 1.6 // i.e. the underlying list of elements to iterate over does not 102 cananian 1.6 // change as the visitor mutates the hcode. 103 cananian 1.6 Iterator qi = new SnapshotIterator(hc.getElementsI()); 104 wbeebee 1.5 while (qi.hasNext()) ((Quad)(qi.next())).accept(visitor); 105 wbeebee 1.1.2.1 106 wbeebee 1.1.2.8 if (debugOutput) { 107 wbeebee 1.1.2.8 System.out.println("After:"); 108 wbeebee 1.1.2.8 hc.print(new PrintWriter(System.out)); 109 wbeebee 1.1.2.1 } 110 wbeebee 1.1.2.5 111 wbeebee 1.1.2.8 Stats.realtimeEnd(); 112 wbeebee 1.1.2.8 return hc; 113 wbeebee 1.1.2.5 } 114 wbeebee 1.1.2.1 115 wbeebee 1.1.2.1 /** Indicates if the given instruction needs an access check wrapped 116 wbeebee 1.1.2.9 * around it. 117 wbeebee 1.1.2.9 */ 118 wbeebee 1.1.2.1 119 wbeebee 1.1.2.8 protected boolean needsCheck(Quad inst) { 120 wbeebee 1.1.2.1 Stats.analysisBegin(); 121 wbeebee 1.1.2.4 boolean removeCheck = checkRemoval.shouldRemoveCheck(inst); 122 wbeebee 1.1.2.1 Stats.analysisEnd(); 123 wbeebee 1.1.2.4 if (removeCheck) { 124 wbeebee 1.1.2.1 Stats.addRemovedMemCheck(); 125 wbeebee 1.1.2.4 } else { 126 wbeebee 1.1.2.4 Stats.addActualMemCheck(); 127 wbeebee 1.1.2.1 } 128 wbeebee 1.1.2.4 return !removeCheck; 129 wbeebee 1.1.2.9 } 130 wbeebee 1.1.2.9 131 wbeebee 1.1.2.9 /** Looks up the type of the parent <code>HCodeFactory</code> and constructs 132 wbeebee 1.1.2.9 * the appropriate <code>HCodeFactory</code> from the correct 133 wbeebee 1.1.2.9 * <code>CheckAdder</code>. A <code>QuadWithTry</code> is created for an input 134 wbeebee 1.1.2.9 * <code>QuadWithTry</code>, a <code>QuadNoSSA</code> is created for an input 135 wbeebee 1.1.2.9 * <code>QuadNoSSA</code>. Currently, no other quadforms are supported. 136 wbeebee 1.1.2.9 */ 137 wbeebee 1.1.2.9 138 wbeebee 1.1.2.9 public static HCodeFactory codeFactory(CheckRemoval cr, 139 wbeebee 1.1.2.9 NoHeapCheckRemoval nhcr, 140 wbeebee 1.1.2.9 HCodeFactory parent) { 141 wbeebee 1.1.2.9 String codeName = parent.getCodeName(); 142 wbeebee 1.1.2.9 if (codeName.equals(QuadNoSSA.codename)) { 143 wbeebee 1.1.2.9 return (new CheckAdderNoSSA(cr, nhcr, parent)).codeFactory(); 144 wbeebee 1.1.2.9 } else if (codeName.equals(QuadWithTry.codename)) { 145 wbeebee 1.1.2.9 return (new CheckAdderWithTry(cr, nhcr, parent)).codeFactory(); 146 wbeebee 1.1.2.9 } else { 147 cananian 1.3.2.1 assert false : ("Quads type: " + codeName + " not a supported CheckAdder"); 148 wbeebee 1.1.2.9 return null; 149 wbeebee 1.1.2.9 } 150 wbeebee 1.1.2.9 } 151 wbeebee 1.1.2.1 } 152 cananian 1.2