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