1 cananian 1.1.2.3 // CheckAdder.java, created Fri Mar 23 10:31:56 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.1 import java.io.PrintWriter; 7 wbeebee 1.1.2.2 import java.util.Iterator; 8 wbeebee 1.1.2.2 import java.util.Vector; 9 wbeebee 1.1.2.1 10 wbeebee 1.1.2.1 import harpoon.Analysis.Transformation.MethodMutator; 11 wbeebee 1.1.2.1 12 wbeebee 1.1.2.1 import harpoon.ClassFile.HClass; 13 wbeebee 1.1.2.1 import harpoon.ClassFile.HCode; 14 wbeebee 1.1.2.1 import harpoon.ClassFile.HCodeAndMaps; 15 wbeebee 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 16 wbeebee 1.1.2.1 import harpoon.ClassFile.HMethod; 17 wbeebee 1.1.2.1 import harpoon.ClassFile.Linker; 18 wbeebee 1.1.2.1 19 wbeebee 1.1.2.1 import harpoon.IR.Quads.ANEW; 20 wbeebee 1.1.2.1 import harpoon.IR.Quads.ARRAYINIT; 21 wbeebee 1.1.2.1 import harpoon.IR.Quads.ASET; 22 wbeebee 1.1.2.1 import harpoon.IR.Quads.CALL; 23 wbeebee 1.1.2.1 import harpoon.IR.Quads.CONST; 24 wbeebee 1.1.2.2 import harpoon.IR.Quads.FOOTER; 25 wbeebee 1.1.2.1 import harpoon.IR.Quads.METHOD; 26 wbeebee 1.1.2.1 import harpoon.IR.Quads.MOVE; 27 wbeebee 1.1.2.1 import harpoon.IR.Quads.NEW; 28 wbeebee 1.1.2.1 import harpoon.IR.Quads.SET; 29 wbeebee 1.1.2.2 import harpoon.IR.Quads.THROW; 30 wbeebee 1.1.2.1 31 wbeebee 1.1.2.1 import harpoon.IR.Quads.Edge; 32 wbeebee 1.1.2.1 import harpoon.IR.Quads.Quad; 33 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadFactory; 34 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadVisitor; 35 wbeebee 1.1.2.1 import harpoon.IR.Quads.QuadNoSSA; 36 wbeebee 1.1.2.1 37 wbeebee 1.1.2.1 import harpoon.Temp.Temp; 38 wbeebee 1.1.2.1 import harpoon.Temp.TempFactory; 39 wbeebee 1.1.2.1 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.1 * <code>CheckAdderNoSSA</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 * It takes QuadsNoSSA form code as input. 49 wbeebee 1.1.2.1 * 50 cananian 1.1.2.3 * @author Wes Beebee <wbeebee@mit.edu> 51 cananian 1.4 * @version $Id: CheckAdderNoSSA.java,v 1.4 2002/04/10 03:01:16 cananian Exp $ 52 wbeebee 1.1.2.1 */ 53 wbeebee 1.1.2.1 54 wbeebee 1.1.2.1 55 wbeebee 1.1.2.1 class CheckAdderNoSSA extends CheckAdder { 56 wbeebee 1.1.2.2 private METHOD currentMethod; // For smartMemAreaLoads 57 wbeebee 1.1.2.2 private Temp currentMemArea; 58 wbeebee 1.1.2.2 private Vector newExceptions; // THROWs to add to exception throwing list. 59 wbeebee 1.1.2.2 private Temp retex; 60 wbeebee 1.1.2.1 61 wbeebee 1.1.2.1 /** Creates a new <code>CheckAdderNoSSA</code>, adding only the checks that 62 wbeebee 1.1.2.1 * can't be removed as specified by <code>CheckRemoval</code> and 63 wbeebee 1.1.2.1 * <code>NoHeapCheckRemoval</code>. 64 wbeebee 1.1.2.2 * Use <code>hcf = (new CheckAdderNoSSA(cr, nhcr, hcf)).codeFactory(); to link 65 wbeebee 1.1.2.1 * this <code>CheckAdder</code> into the <code>HCodeFactory</code> chain. 66 wbeebee 1.1.2.1 */ 67 wbeebee 1.1.2.1 68 wbeebee 1.1.2.1 CheckAdderNoSSA(CheckRemoval cr, 69 wbeebee 1.1.2.1 NoHeapCheckRemoval nhcr, 70 wbeebee 1.1.2.1 HCodeFactory parent) { 71 wbeebee 1.1.2.1 super(cr, nhcr, parent); 72 cananian 1.3.2.1 assert parent.getCodeName().equals(QuadNoSSA.codename) : "CheckAdderWithTry takes a QuadWithTry HCodeFactory not a " + 73 cananian 1.3.2.1 parent.getCodeName() + " HCodeFactory."; 74 wbeebee 1.1.2.1 } 75 wbeebee 1.1.2.1 76 wbeebee 1.1.2.1 /** Adds the checks to the code <code>input</code>. */ 77 wbeebee 1.1.2.1 78 wbeebee 1.1.2.1 protected HCode mutateHCode(HCodeAndMaps input) { 79 wbeebee 1.1.2.1 currentMethod = null; 80 wbeebee 1.1.2.1 currentMemArea = null; 81 wbeebee 1.1.2.1 final Linker linker = input.ancestorHCode().getMethod(). 82 wbeebee 1.1.2.1 getDeclaringClass().getLinker(); 83 wbeebee 1.1.2.2 newExceptions = new Vector(); 84 wbeebee 1.1.2.1 return mutateHCode(input, new QuadVisitor() { 85 wbeebee 1.1.2.1 public void visit(ARRAYINIT q) { 86 cananian 1.3.2.1 assert false : "ArrayInitRemover has not been run."; 87 wbeebee 1.1.2.1 } 88 wbeebee 1.1.2.1 89 wbeebee 1.1.2.1 public void visit(ASET q) { 90 wbeebee 1.1.2.1 if (!q.type().isPrimitive()) { 91 wbeebee 1.1.2.1 CheckAdderNoSSA.this.checkAccess(linker, q, 92 wbeebee 1.1.2.1 q.objectref(), q.src()); 93 wbeebee 1.1.2.1 } 94 wbeebee 1.1.2.1 } 95 wbeebee 1.1.2.1 96 wbeebee 1.1.2.1 public void visit(ANEW q) { 97 wbeebee 1.1.2.1 if (fastNew) { 98 wbeebee 1.1.2.1 CheckAdderNoSSA.this 99 wbeebee 1.1.2.1 .newArrayObjectFast(linker, q, q.dst(), 100 wbeebee 1.1.2.1 q.hclass(), q.dims()); 101 wbeebee 1.1.2.1 } else { 102 wbeebee 1.1.2.1 CheckAdderNoSSA.this.newArrayObject(linker, q, q.dst(), 103 wbeebee 1.1.2.1 q.hclass(), q.dims()); 104 wbeebee 1.1.2.1 } 105 wbeebee 1.1.2.1 } 106 wbeebee 1.1.2.1 107 wbeebee 1.1.2.1 public void visit(SET q) { 108 wbeebee 1.1.2.1 if (!q.field().getType().isPrimitive()) { 109 wbeebee 1.1.2.1 CheckAdderNoSSA.this.checkAccess(linker, q, 110 wbeebee 1.1.2.1 q.objectref(), q.src()); 111 wbeebee 1.1.2.1 } 112 wbeebee 1.1.2.1 } 113 wbeebee 1.1.2.1 114 wbeebee 1.1.2.1 public void visit(METHOD q) { 115 wbeebee 1.1.2.1 currentMethod = q; 116 wbeebee 1.1.2.2 retex = new Temp(q.getFactory().tempFactory(), "retex"); 117 wbeebee 1.1.2.1 } 118 wbeebee 1.1.2.1 119 wbeebee 1.1.2.1 public void visit(NEW q) { 120 wbeebee 1.1.2.1 if (fastNew) { 121 wbeebee 1.1.2.1 CheckAdderNoSSA.this.newObjectFast(linker, q, q.dst(), 122 wbeebee 1.1.2.1 q.hclass()); 123 wbeebee 1.1.2.1 } else { 124 wbeebee 1.1.2.1 CheckAdderNoSSA.this.newObject(linker, q, q.dst(), 125 wbeebee 1.1.2.1 q.hclass()); 126 wbeebee 1.1.2.1 } 127 wbeebee 1.1.2.1 } 128 wbeebee 1.1.2.1 129 wbeebee 1.1.2.2 public void visit(FOOTER q) { 130 wbeebee 1.1.2.2 QuadFactory qf = q.getFactory(); 131 wbeebee 1.1.2.2 Iterator it = newExceptions.iterator(); 132 wbeebee 1.1.2.2 while (it.hasNext()) { 133 wbeebee 1.1.2.2 q = q.attach((THROW)it.next(), 0); 134 wbeebee 1.1.2.2 } 135 wbeebee 1.1.2.2 } 136 wbeebee 1.1.2.2 137 wbeebee 1.1.2.1 public void visit(Quad q) {} 138 wbeebee 1.1.2.1 }); 139 wbeebee 1.1.2.1 } 140 wbeebee 1.1.2.1 141 wbeebee 1.1.2.1 /** Attaches the current memory area to a new instance of an object. 142 wbeebee 1.1.2.1 * <p> 143 wbeebee 1.1.2.1 * <p>obj = new foo() becomes: 144 wbeebee 1.1.2.1 * <p>t = RealtimeThread.currentRealtimeThread().getMemoryArea(); 145 wbeebee 1.1.2.1 * <p>obj = new foo(); 146 wbeebee 1.1.2.1 * <p>obj.memoryArea = t; 147 wbeebee 1.1.2.1 * <p> 148 wbeebee 1.1.2.1 */ 149 wbeebee 1.1.2.1 150 wbeebee 1.1.2.2 private void newObjectFast(Linker linker, Quad inst, 151 wbeebee 1.1.2.2 Temp dst, HClass hclass) { 152 wbeebee 1.1.2.1 Stats.addNewObject(); 153 wbeebee 1.1.2.1 QuadFactory qf = inst.getFactory(); 154 wbeebee 1.1.2.2 TempFactory tf = qf.tempFactory(); 155 wbeebee 1.1.2.1 HMethod hm = qf.getMethod(); 156 wbeebee 1.1.2.1 Temp memArea = addGetCurrentMemArea(linker, qf, hm, inst); 157 wbeebee 1.1.2.1 Quad next = inst.next(0); 158 wbeebee 1.1.2.1 Quad q0 = new SET(qf, inst, 159 wbeebee 1.1.2.1 linker.forName("java.lang.Object") 160 wbeebee 1.1.2.1 .getDeclaredField("memoryArea"), 161 wbeebee 1.1.2.1 dst, memArea); 162 wbeebee 1.1.2.1 Edge splitEdge = next.prevEdge(0); 163 wbeebee 1.1.2.1 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 164 wbeebee 1.1.2.1 if (Realtime.COLLECT_RUNTIME_STATS) { 165 wbeebee 1.1.2.1 Quad q1 = 166 wbeebee 1.1.2.1 new CALL(qf, inst, 167 wbeebee 1.1.2.1 linker.forName("javax.realtime.Stats") 168 wbeebee 1.1.2.1 .getMethod("addNewObject", 169 wbeebee 1.1.2.1 new HClass[] { 170 wbeebee 1.1.2.1 linker 171 wbeebee 1.1.2.1 .forName("javax.realtime.MemoryArea") 172 wbeebee 1.1.2.1 }), 173 wbeebee 1.1.2.1 new Temp[] { memArea }, 174 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 175 wbeebee 1.1.2.1 Quad.addEdge(q0, 0, q1, 0); 176 wbeebee 1.1.2.1 Quad.addEdge(q1, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 177 wbeebee 1.1.2.2 addException(q1); 178 wbeebee 1.1.2.1 } else { 179 wbeebee 1.1.2.1 Quad.addEdge(q0, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 180 wbeebee 1.1.2.1 } 181 wbeebee 1.1.2.1 182 wbeebee 1.1.2.1 } 183 wbeebee 1.1.2.1 184 wbeebee 1.1.2.1 185 wbeebee 1.1.2.1 /** Attaches the current memory area to a new instance of an object. 186 wbeebee 1.1.2.1 * <p> 187 wbeebee 1.1.2.1 * <p>obj = new foo() becomes: 188 wbeebee 1.1.2.1 * <p>t = RealtimeThread.currentRealtimeThread().getMemoryArea(); 189 wbeebee 1.1.2.1 * <p>obj = new foo(); 190 wbeebee 1.1.2.1 * <p>t.bless(obj); 191 wbeebee 1.1.2.1 * <p> 192 wbeebee 1.1.2.1 */ 193 wbeebee 1.1.2.1 194 wbeebee 1.1.2.2 private void newObject(Linker linker, Quad inst, 195 wbeebee 1.1.2.2 Temp dst, HClass hclass) { 196 wbeebee 1.1.2.1 Stats.addNewObject(); 197 wbeebee 1.1.2.1 QuadFactory qf = inst.getFactory(); 198 wbeebee 1.1.2.1 HMethod hm = qf.getMethod(); 199 wbeebee 1.1.2.1 Temp memArea = addGetCurrentMemArea(linker, qf, hm, inst); 200 wbeebee 1.1.2.1 Quad next = inst.next(0); 201 wbeebee 1.1.2.1 Quad q0 = new CALL(qf, inst, 202 wbeebee 1.1.2.1 linker.forName("javax.realtime.MemoryArea") 203 wbeebee 1.1.2.1 .getMethod("bless", 204 wbeebee 1.1.2.1 new HClass[] { 205 wbeebee 1.1.2.1 linker.forName("java.lang.Object") 206 wbeebee 1.1.2.1 }), 207 wbeebee 1.1.2.1 new Temp[] { memArea, dst }, 208 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 209 wbeebee 1.1.2.1 Edge splitEdge = next.prevEdge(0); 210 wbeebee 1.1.2.1 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 211 wbeebee 1.1.2.1 Quad.addEdge(q0, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 212 wbeebee 1.1.2.2 addException(q0); 213 wbeebee 1.1.2.1 } 214 wbeebee 1.1.2.1 215 wbeebee 1.1.2.1 216 wbeebee 1.1.2.1 /** Attaches the current memory area to a new instance of an object. 217 wbeebee 1.1.2.1 * <p> 218 wbeebee 1.1.2.1 * <p>obj = new foo()[1][2][3] becomes: 219 wbeebee 1.1.2.1 * <p>t = RealtimeThread.currentRealtimeThread().getMemoryArea(); 220 wbeebee 1.1.2.1 * <p>obj = new foo()[1][2][3] 221 wbeebee 1.1.2.1 * <p>obj.memoryArea = t; 222 wbeebee 1.1.2.1 * <p> 223 wbeebee 1.1.2.1 */ 224 wbeebee 1.1.2.1 225 wbeebee 1.1.2.2 private void newArrayObjectFast(Linker linker, Quad inst, 226 wbeebee 1.1.2.2 Temp dst, HClass hclass, 227 wbeebee 1.1.2.2 Temp[] dims) { 228 wbeebee 1.1.2.1 Stats.addNewArrayObject(); 229 wbeebee 1.1.2.1 QuadFactory qf = inst.getFactory(); 230 wbeebee 1.1.2.1 HMethod hm = qf.getMethod(); 231 wbeebee 1.1.2.1 Temp memArea = addGetCurrentMemArea(linker, qf, hm, inst); 232 wbeebee 1.1.2.1 Quad next = inst.next(0); 233 wbeebee 1.1.2.1 Quad q0 = new SET(qf, inst, 234 wbeebee 1.1.2.1 linker.forName("java.lang.Object") 235 wbeebee 1.1.2.1 .getDeclaredField("memoryArea"), 236 wbeebee 1.1.2.1 dst, memArea); 237 wbeebee 1.1.2.1 Edge splitEdge = next.prevEdge(0); 238 wbeebee 1.1.2.1 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 239 wbeebee 1.1.2.1 if (Realtime.COLLECT_RUNTIME_STATS) { 240 wbeebee 1.1.2.1 Quad q1 = 241 wbeebee 1.1.2.1 new CALL(qf, inst, 242 wbeebee 1.1.2.1 linker.forName("javax.realtime.Stats") 243 wbeebee 1.1.2.1 .getMethod("addNewArrayObject", 244 wbeebee 1.1.2.1 new HClass[] { 245 wbeebee 1.1.2.1 linker 246 wbeebee 1.1.2.1 .forName("javax.realtime.MemoryArea") 247 wbeebee 1.1.2.1 }), 248 wbeebee 1.1.2.1 new Temp[] { memArea }, 249 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 250 wbeebee 1.1.2.1 Quad.addEdge(q0, 0, q1, 0); 251 wbeebee 1.1.2.1 Quad.addEdge(q1, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 252 wbeebee 1.1.2.2 addException(q1); 253 wbeebee 1.1.2.1 } else { 254 wbeebee 1.1.2.1 Quad.addEdge(q0, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 255 wbeebee 1.1.2.1 } 256 wbeebee 1.1.2.1 } 257 wbeebee 1.1.2.1 258 wbeebee 1.1.2.1 /** Attaches the current memory area to a new instance of an object. 259 wbeebee 1.1.2.1 * <p> 260 wbeebee 1.1.2.1 * <p>obj = new foo()[1][2][3] becomes: 261 wbeebee 1.1.2.1 * <p>t = RealtimeThread.currentRealtimeThread().getMemoryArea(); 262 wbeebee 1.1.2.1 * <p>obj = new foo()[1][2][3] 263 wbeebee 1.1.2.1 * <p>t.bless(obj, {1, 2, 3}); 264 wbeebee 1.1.2.1 * <p> 265 wbeebee 1.1.2.1 */ 266 wbeebee 1.1.2.1 267 wbeebee 1.1.2.2 private void newArrayObject(final Linker linker, Quad inst, 268 wbeebee 1.1.2.2 Temp dst, HClass hclass, Temp[] dims) { 269 wbeebee 1.1.2.1 Stats.addNewArrayObject(); 270 wbeebee 1.1.2.1 QuadFactory qf = inst.getFactory(); 271 wbeebee 1.1.2.1 TempFactory tf = qf.tempFactory(); 272 wbeebee 1.1.2.1 HMethod hm = qf.getMethod(); 273 wbeebee 1.1.2.1 Temp memArea = addGetCurrentMemArea(linker, qf, hm, inst); 274 wbeebee 1.1.2.1 Quad next = inst.next(0); 275 wbeebee 1.1.2.1 Temp dimsArray = new Temp(tf, "dimsArray"); 276 wbeebee 1.1.2.1 Temp numDims = new Temp(tf, "numDims"); 277 wbeebee 1.1.2.1 Temp newDst = new Temp(tf, "newArray"); 278 wbeebee 1.1.2.1 Quad newQuad = new ANEW(qf, inst, newDst, hclass, dims); 279 wbeebee 1.1.2.1 Quad q0 = new CONST(qf, inst, numDims, 280 wbeebee 1.1.2.1 new Integer(dims.length), HClass.Int); 281 wbeebee 1.1.2.1 HClass intArray = 282 wbeebee 1.1.2.1 HClassUtil.arrayClass(linker, HClass.Int, dims.length); 283 wbeebee 1.1.2.1 Quad q1 = new ANEW(qf, inst, dimsArray, intArray, 284 wbeebee 1.1.2.1 new Temp[] { numDims }); 285 wbeebee 1.1.2.1 Quad[] q2 = new Quad[2*dims.length]; 286 wbeebee 1.1.2.1 for (int i=0; i<dims.length; i++) { 287 wbeebee 1.1.2.1 Temp t1 = new Temp(tf, "uniq"); 288 wbeebee 1.1.2.1 q2[2*i] = new CONST(qf, inst, t1, new Integer(i), HClass.Int); 289 wbeebee 1.1.2.1 q2[2*i+1] = new ASET(qf, inst, dimsArray, t1, dims[i], HClass.Int); 290 wbeebee 1.1.2.1 } 291 wbeebee 1.1.2.1 Quad q3 = new CALL(qf, inst, 292 wbeebee 1.1.2.1 linker.forName("javax.realtime.MemoryArea") 293 wbeebee 1.1.2.1 .getMethod("bless", 294 wbeebee 1.1.2.1 new HClass[] { 295 wbeebee 1.1.2.1 linker.forName("java.lang.Object"), 296 wbeebee 1.1.2.1 intArray}), 297 wbeebee 1.1.2.1 new Temp[] { memArea, newDst, dimsArray }, 298 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 299 wbeebee 1.1.2.1 Quad q4 = new MOVE(qf, inst, dst, newDst); 300 wbeebee 1.1.2.1 Edge splitEdge = next.prevEdge(0); 301 wbeebee 1.1.2.1 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 302 wbeebee 1.1.2.1 Quad.addEdges(new Quad[] {q0, q1, q2[0]}); 303 wbeebee 1.1.2.1 Quad.addEdges(q2); 304 wbeebee 1.1.2.1 Quad.addEdges(new Quad[] {q2[q2.length-1], q3, q4}); 305 wbeebee 1.1.2.1 Quad.addEdge(q4, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 306 wbeebee 1.1.2.1 Quad.replace(inst, newQuad); 307 wbeebee 1.1.2.2 addException(q3); 308 wbeebee 1.1.2.1 } 309 wbeebee 1.1.2.1 310 wbeebee 1.1.2.1 /** Adds a check around: a.foo = b; or a[foo]=b; 311 wbeebee 1.1.2.1 * a must be able to access b. 312 wbeebee 1.1.2.1 */ 313 wbeebee 1.1.2.1 314 wbeebee 1.1.2.1 private void checkAccess(Linker linker, Quad inst, 315 wbeebee 1.1.2.2 Temp object, Temp src) { 316 wbeebee 1.1.2.1 if (needsCheck(inst)) { 317 wbeebee 1.1.2.1 QuadFactory qf = inst.getFactory(); 318 wbeebee 1.1.2.1 TempFactory tf = qf.tempFactory(); 319 wbeebee 1.1.2.1 HMethod hm = qf.getMethod(); 320 wbeebee 1.1.2.1 Temp objArea = new Temp(tf, "objMemArea"); 321 wbeebee 1.1.2.1 Quad q0 = null; 322 wbeebee 1.1.2.1 HClass memoryArea = linker.forName("javax.realtime.MemoryArea"); 323 wbeebee 1.1.2.1 if (object != null) { 324 wbeebee 1.1.2.1 q0 = new CALL(qf, inst, memoryArea 325 wbeebee 1.1.2.1 .getMethod("getMemoryArea", new HClass[] { 326 wbeebee 1.1.2.1 linker.forName("java.lang.Object")}), 327 wbeebee 1.1.2.2 new Temp[] { object }, objArea, retex, 328 wbeebee 1.1.2.1 false, false, new Temp[0]); 329 wbeebee 1.1.2.1 } else { 330 wbeebee 1.1.2.1 q0 = new CALL(qf, inst, 331 wbeebee 1.1.2.5 linker.forName("javax.realtime.ImmortalMemory") 332 wbeebee 1.1.2.1 .getMethod("instance", new HClass[0]), 333 wbeebee 1.1.2.2 new Temp[0], objArea, retex, 334 wbeebee 1.1.2.1 false, false, new Temp[0]); 335 wbeebee 1.1.2.1 } 336 wbeebee 1.1.2.2 addException(q0); 337 wbeebee 1.1.2.1 Quad q1 = new CALL(qf, inst, memoryArea 338 wbeebee 1.1.2.1 .getMethod("checkAccess", new HClass[] { 339 wbeebee 1.1.2.1 linker.forName("java.lang.Object")}), 340 wbeebee 1.1.2.1 new Temp[] { objArea, src }, 341 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 342 wbeebee 1.1.2.2 addException(q1); 343 wbeebee 1.1.2.1 Edge splitEdge = inst.prevEdge(0); 344 wbeebee 1.1.2.2 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 345 wbeebee 1.1.2.1 if (Realtime.COLLECT_RUNTIME_STATS) { 346 wbeebee 1.1.2.1 Temp srcArea = new Temp(tf, "srcMemArea"); 347 wbeebee 1.1.2.1 Quad q2 = new CALL(qf, inst, memoryArea 348 wbeebee 1.1.2.1 .getMethod("getMemoryArea", new HClass[] { 349 wbeebee 1.1.2.1 linker.forName("java.lang.Object")}), 350 wbeebee 1.1.2.2 new Temp[] { src }, srcArea, retex, 351 wbeebee 1.1.2.1 false, false, new Temp[0]); 352 wbeebee 1.1.2.2 addException(q2); 353 wbeebee 1.1.2.1 Quad q3 = 354 wbeebee 1.1.2.1 new CALL(qf, inst, 355 wbeebee 1.1.2.1 linker.forName("javax.realtime.Stats") 356 wbeebee 1.1.2.1 .getMethod("addCheck", 357 wbeebee 1.1.2.1 new HClass[] { 358 wbeebee 1.1.2.1 memoryArea, 359 wbeebee 1.1.2.1 memoryArea 360 wbeebee 1.1.2.1 }), 361 wbeebee 1.1.2.1 new Temp[] { objArea, srcArea }, 362 wbeebee 1.1.2.2 null, retex, true, false, new Temp[0]); 363 wbeebee 1.1.2.2 addException(q3); 364 wbeebee 1.1.2.1 Quad.addEdges(new Quad[] {q0, q1, q2, q3}); 365 wbeebee 1.1.2.1 Quad.addEdge(q3, 0, (Quad)splitEdge.to(), 366 wbeebee 1.1.2.1 splitEdge.which_pred()); 367 wbeebee 1.1.2.1 } else { 368 wbeebee 1.1.2.1 Quad.addEdges(new Quad[] {q0, q1}); 369 wbeebee 1.1.2.1 Quad.addEdge(q1, 0, (Quad)splitEdge.to(), 370 wbeebee 1.1.2.1 splitEdge.which_pred()); 371 wbeebee 1.1.2.1 } 372 wbeebee 1.1.2.1 } 373 wbeebee 1.1.2.1 } 374 wbeebee 1.1.2.1 375 wbeebee 1.1.2.1 /** */ 376 wbeebee 1.1.2.1 377 wbeebee 1.1.2.1 // private static void checkNoHeapWrite(Linker linker, Quad inst, 378 wbeebee 1.1.2.1 // Temp object, Temp src) { 379 wbeebee 1.1.2.1 // if (needsNoHeapWriteCheck(inst)) { 380 wbeebee 1.1.2.1 381 wbeebee 1.1.2.1 382 wbeebee 1.1.2.1 // } 383 wbeebee 1.1.2.1 // } 384 wbeebee 1.1.2.1 385 wbeebee 1.1.2.1 /** */ 386 wbeebee 1.1.2.1 387 wbeebee 1.1.2.2 private void addException(Quad q) { 388 wbeebee 1.1.2.2 QuadFactory qf = q.getFactory(); 389 wbeebee 1.1.2.2 THROW ex = new THROW(qf, q, retex); 390 wbeebee 1.1.2.2 Quad.addEdge(q, 1, ex, 0); 391 wbeebee 1.1.2.2 newExceptions.add(ex); 392 wbeebee 1.1.2.2 } 393 wbeebee 1.1.2.2 394 wbeebee 1.1.2.2 private void checkNoHeapRead(Linker linker) { 395 wbeebee 1.1.2.1 396 wbeebee 1.1.2.1 397 wbeebee 1.1.2.1 } 398 wbeebee 1.1.2.1 399 wbeebee 1.1.2.2 private Temp addGetCurrentMemArea(Linker linker, 400 wbeebee 1.1.2.2 QuadFactory qf, HMethod hm, 401 wbeebee 1.1.2.2 Quad inst) { 402 wbeebee 1.1.2.1 if (!smartMemAreaLoads) { 403 wbeebee 1.1.2.1 return realAddGetCurrentMemArea(linker, qf, hm, inst); 404 wbeebee 1.1.2.1 } else if (currentMemArea == null) { 405 wbeebee 1.1.2.1 currentMemArea = 406 wbeebee 1.1.2.1 realAddGetCurrentMemArea(linker, qf, hm, currentMethod.next(0)); 407 wbeebee 1.1.2.1 } 408 wbeebee 1.1.2.1 return currentMemArea; 409 wbeebee 1.1.2.1 } 410 wbeebee 1.1.2.1 411 wbeebee 1.1.2.1 /** Adds t = RealtimeThread.currentRealtimeThread().getMemoryArea() */ 412 wbeebee 1.1.2.1 413 wbeebee 1.1.2.2 private Temp realAddGetCurrentMemArea(Linker linker, 414 wbeebee 1.1.2.2 QuadFactory qf, HMethod hm, 415 wbeebee 1.1.2.2 Quad inst) { 416 wbeebee 1.1.2.1 TempFactory tf = qf.tempFactory(); 417 wbeebee 1.1.2.1 Stats.addMemAreaLoad(); 418 wbeebee 1.1.2.1 Temp t1 = new Temp(tf, "realtimeThread"); 419 wbeebee 1.1.2.1 Temp currentMemArea = new Temp(tf, "memoryArea"); 420 wbeebee 1.1.2.1 HClass realtimeThread = 421 wbeebee 1.1.2.1 linker.forName("javax.realtime.RealtimeThread"); 422 wbeebee 1.1.2.1 Quad q0 = new CALL(qf, inst, realtimeThread 423 wbeebee 1.1.2.1 .getMethod("currentRealtimeThread", new HClass[0]), 424 wbeebee 1.1.2.2 new Temp[0], t1, retex, false, false, new Temp[0]); 425 wbeebee 1.1.2.2 addException(q0); 426 wbeebee 1.1.2.1 Quad q1 = new CALL(qf, inst, realtimeThread 427 wbeebee 1.1.2.6 .getMethod("memoryArea", new HClass[0]), 428 wbeebee 1.1.2.2 new Temp[] { t1 }, currentMemArea, retex, false, 429 wbeebee 1.1.2.1 false, new Temp[0]); 430 wbeebee 1.1.2.2 addException(q1); 431 wbeebee 1.1.2.1 Edge splitEdge = inst.prevEdge(0); 432 wbeebee 1.1.2.1 Quad.addEdge((Quad)splitEdge.from(), splitEdge.which_succ(), q0, 0); 433 wbeebee 1.1.2.1 Quad.addEdges(new Quad[] {q0, q1}); 434 wbeebee 1.1.2.1 Quad.addEdge(q1, 0, (Quad)splitEdge.to(), splitEdge.which_pred()); 435 wbeebee 1.1.2.1 return currentMemArea; 436 wbeebee 1.1.2.1 } 437 wbeebee 1.1.2.1 } 438 cananian 1.2