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