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