1 dumi     1.5  // Realtime.java, created Sun Nov 12 14:42:50 2000 by wbeebee

  2 dumi     1.5  // Copyright (C) 2000 Wes Beebee <wbeebee@mit.edu>

  3 dumi     1.5  // Licensed under the terms of the GNU GPL; see COPYING for details.

  4 dumi     1.5  package harpoon.Analysis.Realtime;
  5 dumi     1.5  
  6 wbeebee  1.8  import java.util.ArrayList;
  7 dumi     1.5  import java.util.Collection;
  8 wbeebee  1.8  import java.util.List;
  9 dumi     1.5  import java.util.Set;
 10 dumi     1.5  
 11 dumi     1.5  import harpoon.Analysis.Quads.ArrayInitRemover;
 12 dumi     1.5  import harpoon.Analysis.ClassHierarchy;
 13 wbeebee  1.8  import harpoon.Analysis.Tree.Canonicalize;
 14 salcianu 1.13 import harpoon.Analysis.Quads.QuadClassHierarchy;
 15 dumi     1.5  
 16 dumi     1.5  import harpoon.ClassFile.CachingCodeFactory;
 17 dumi     1.5  import harpoon.ClassFile.Linker;
 18 dumi     1.5  import harpoon.ClassFile.HClass;
 19 dumi     1.5  import harpoon.ClassFile.HCodeFactory;
 20 dumi     1.5  
 21 dumi     1.5  import harpoon.IR.Quads.QuadNoSSA;
 22 dumi     1.5  
 23 dumi     1.5  import harpoon.Util.HClassUtil;
 24 wbeebee  1.8  import harpoon.Util.ParseUtil;
 25 dumi     1.5  import harpoon.Util.Util;
 26 salcianu 1.13 import harpoon.Util.Options.Option;
 27 salcianu 1.13 import harpoon.Main.CompilerStageEZ;
 28 dumi     1.5  
 29 dumi     1.5  import harpoon.Backend.Generic.Frame;
 30 salcianu 1.13 
 31 salcianu 1.13 import java.util.List;
 32 salcianu 1.13 import java.util.LinkedList;
 33 salcianu 1.13 
 34 dumi     1.5  /**
 35 dumi     1.5   * <code>Realtime</code> is the top-level access point for the rest of the 
 36 dumi     1.5   * Harpoon compiler to provide support for the Realtime Java MemoryArea 
 37 dumi     1.5   * extensions described in the 
 38 dumi     1.5   * <a href=
 39 dumi     1.5   *  "http://java.sun.com/aboutJava/communityprocess/first/jsr001/rtj.pdf">
 40 dumi     1.5   * Realtime Java Specification</a> and there's also a
 41 dumi     1.5   * <a href="http://tao.doc.wustl.edu/rtj/api/index.html">JavaDoc version</a>.
 42 dumi     1.5   *
 43 dumi     1.5   * @author Wes Beebee <wbeebee@mit.edu>
 44 cananian 1.16  * @version $Id: Realtime.java,v 1.16 2004/02/08 01:53:47 cananian Exp $
 45 dumi     1.5   */
 46 dumi     1.5  
 47 dumi     1.5  public class Realtime {
 48 wbeebee  1.12     /** Is Realtime JAVA support turned on? */
 49 wbeebee  1.12     public static boolean REALTIME_JAVA = false;
 50 wbeebee  1.12     
 51 wbeebee  1.12     /** Remove tagging when you remove all checks? */
 52 wbeebee  1.12     public static boolean REMOVE_TAGS = true;
 53 wbeebee  1.12     
 54 wbeebee  1.12     /** Add support for realtime threads */
 55 wbeebee  1.12     public static boolean REALTIME_THREADS = false;
 56 wbeebee  1.12     
 57 wbeebee  1.12     /** Add support for CheckQuanta */
 58 wbeebee  1.12     public static boolean REALTIME_THREADS_PREEMPT = false;
 59 dumi     1.5      
 60 wbeebee  1.9          /** Add support for RTJPerf */
 61 wbeebee  1.12     public static boolean RTJ_PERF = false;
 62 wbeebee  1.9      
 63 wbeebee  1.12     /** Determine which analysis method to use. */
 64 wbeebee  1.12     public static int ANALYSIS_METHOD = 0;
 65 wbeebee  1.12     /** Very conservative analysis method - keep all checks */
 66 wbeebee  1.12     public static final int SIMPLE = 0;
 67 wbeebee  1.12     /** Pointer analysis to determine whether checks can be removed */
 68 dumi     1.5          public static final int CHEESY_POINTER_ANALYSIS = 1;
 69 wbeebee  1.12     /** More complicated pointer analysis to determine which checks to 
 70 wbeebee  1.12      *  remove. 
 71 wbeebee  1.12      */
 72 wbeebee  1.12     public static final int REAL_POINTER_ANALYSIS = 2;
 73 wbeebee  1.12     /** Overly aggressive (and wrong!) check removal that removes all checks. 
 74 wbeebee  1.12      */
 75 wbeebee  1.12     public static final int ALL = 3;
 76 wbeebee  1.12     
 77 wbeebee  1.12     /** Add code to the executable to enable gathering of runtime statistics. 
 78 wbeebee  1.12      */
 79 wbeebee  1.12     public static boolean COLLECT_RUNTIME_STATS = false;
 80 wbeebee  1.12     
 81 wbeebee  1.12     /** Add checks to determine if a <code>NoHeapRealtimeThread</code> is
 82 wbeebee  1.12      *  touching the heap.
 83 wbeebee  1.12      */
 84 wbeebee  1.12     public static boolean NOHEAP_CHECKS = false;
 85 wbeebee  1.12     
 86 wbeebee  1.12     /** Add masking support, but no checks */
 87 wbeebee  1.12     public static boolean NOHEAP_MASK = false;
 88 wbeebee  1.12     
 89 wbeebee  1.12     /** Add additional information on calls to RTJ_malloc to store information
 90 wbeebee  1.12      *  about the def. points of all objects which are allocated.
 91 wbeebee  1.12      */
 92 wbeebee  1.12     public static boolean DEBUG_REF = false;
 93 wbeebee  1.12     
 94 wbeebee  1.12     /** Configure Realtime Java based on the following command-line options. 
 95 wbeebee  1.12      */
 96 wbeebee  1.12     public static void configure(String options) {
 97 wbeebee  1.12         String opts = options.toLowerCase();
 98 wbeebee  1.12         System.out.print("RTJ: on, noheap: ");
 99 wbeebee  1.12         REALTIME_JAVA = true;
100 wbeebee  1.12         if (opts.indexOf("noheap_checks")!=-1) {
101 wbeebee  1.12             NOHEAP_CHECKS = true;
102 wbeebee  1.12             System.out.print("checks");
103 wbeebee  1.12         } else if (opts.indexOf("noheap")!=-1) {
104 wbeebee  1.12             NOHEAP_MASK = true;
105 wbeebee  1.12             System.out.print("no checks");
106 wbeebee  1.12         } else {
107 wbeebee  1.12             System.out.print("no support");
108 wbeebee  1.12         }
109 wbeebee  1.12         System.out.print(", DEBUG_REF: ");
110 wbeebee  1.12         if (opts.indexOf("debug_ref")!=-1) {
111 wbeebee  1.12             DEBUG_REF = true;
112 wbeebee  1.12             System.out.print("yes");
113 wbeebee  1.12         } else {
114 wbeebee  1.12             System.out.print("no");
115 wbeebee  1.12         }               
116 wbeebee  1.12         System.out.print(", Collect Statistics: ");
117 wbeebee  1.12         if (opts.indexOf("stats")!=-1) {
118 dumi     1.5              System.out.print("yes");
119 dumi     1.5              COLLECT_RUNTIME_STATS = true;
120 wbeebee  1.12         } else {
121 dumi     1.5              System.out.print("no");
122 wbeebee  1.12         }
123 wbeebee  1.12         System.out.print(", Analysis Method: ");
124 wbeebee  1.12         if (opts.indexOf("simple")!=-1) {
125 dumi     1.5              ANALYSIS_METHOD = SIMPLE;
126 dumi     1.5              System.out.print("simple");
127 wbeebee  1.12         } else if (opts.indexOf("cheesy")!=-1) {
128 dumi     1.5              ANALYSIS_METHOD = CHEESY_POINTER_ANALYSIS;
129 dumi     1.5              System.out.print("cheesy");
130 wbeebee  1.12         } else if (opts.indexOf("realpa")!=-1) {
131 dumi     1.5              ANALYSIS_METHOD = REAL_POINTER_ANALYSIS;
132 dumi     1.5              System.out.print("realpa");
133 wbeebee  1.12         } else if (opts.indexOf("all")!=-1) {
134 dumi     1.5              System.out.print("all, Remove Tags: ");
135 dumi     1.5              if (opts.indexOf("keeptags")!=-1) {
136 wbeebee  1.12                 System.out.print("no");
137 wbeebee  1.12                 REMOVE_TAGS = false;
138 dumi     1.5              } else {
139 wbeebee  1.12                 System.out.print("yes");
140 dumi     1.5              }
141 dumi     1.5              ANALYSIS_METHOD = ALL;
142 wbeebee  1.12         } else {
143 wbeebee  1.12             System.out.println();
144 dumi     1.5              assert false : "Please specify an analysis method.";
145 wbeebee  1.12         }
146 wbeebee  1.12         System.out.print(", Realtime threads: ");
147 wbeebee  1.12         if (opts.indexOf("threads")!=-1) {
148 wbeebee  1.12             REALTIME_THREADS = true;
149 wbeebee  1.12             if (opts.indexOf("preempt")!=-1) {
150 wbeebee  1.12                 REALTIME_THREADS_PREEMPT = true;
151 wbeebee  1.12                 System.out.print("preempt");
152 wbeebee  1.12             } else {
153 wbeebee  1.12                 System.out.print("non-preempt");
154 wbeebee  1.12             }
155 wbeebee  1.12         } else {
156 wbeebee  1.12             System.out.print("no");
157 wbeebee  1.12         }
158 wbeebee  1.12         System.out.print(", RTJ Perf: ");
159 wbeebee  1.12         if (opts.indexOf("rtj_perf")!=-1) {
160 wbeebee  1.12             RTJ_PERF = true;
161 wbeebee  1.12             System.out.println("yes");
162 wbeebee  1.12         } else {
163 wbeebee  1.12             System.out.println("no");
164 wbeebee  1.12         }
165 wbeebee  1.12     }           
166 wbeebee  1.12     
167 wbeebee  1.12     /** Creates a field memoryArea on <code>java.lang.Object</code>.
168 wbeebee  1.12      *  Since primitive arrays inherit from <code>java.lang.Object</code>, 
169 wbeebee  1.12      *  this catches them as well. 
170 wbeebee  1.12      */
171 wbeebee  1.12     
172 wbeebee  1.12     public static void setupObject(Linker linker) {
173 wbeebee  1.12         // special hack to make setupObject idempotent

174 wbeebee  1.12         // find something better

175 wbeebee  1.12         if(setupObject_WAS_CALLED) {
176 dumi     1.5              System.out.println("Warning: setupObject called again -> ignored");
177 dumi     1.5              return;
178 wbeebee  1.12         }
179 wbeebee  1.12         setupObject_WAS_CALLED = true;
180 wbeebee  1.12         Stats.realtimeBegin();
181 wbeebee  1.12         // Adds javax.realtime.MemoryArea java.lang.Object.memoryArea

182 wbeebee  1.12         linker.forName("java.lang.Object").getMutator()
183 dumi     1.5              .addDeclaredField("memoryArea", 
184 wbeebee  1.12                               linker.forName("javax.realtime.MemoryArea"));
185 wbeebee  1.12         Stats.realtimeEnd();
186 wbeebee  1.12     }
187 wbeebee  1.12     private static boolean setupObject_WAS_CALLED = false;
188 wbeebee  1.12     
189 wbeebee  1.12     /** Adds all methods required for RTJ in the rootset, including:
190 wbeebee  1.12      *  <ul>
191 wbeebee  1.12      *  <li>javax.realtime.RealtimeThread(java.lang.ThreadGroup, 
192 wbeebee  1.12      *                                          java.lang.Runnable,
193 wbeebee  1.12      *                                          java.lang.String)</li>
194 wbeebee  1.12      *  <li>javax.realtime.RealtimeThread.getMemoryArea()</li>
195 wbeebee  1.12      *  <li>javax.realtime.RealtimeThread.currentRealtimeThread()</li>
196 wbeebee  1.12      *  <li>java.lang.Thread.setPriority(int)</li>
197 wbeebee  1.12      *  <li>javax.realtime.MemoryArea.checkAccess(java.lang.Object)</li>
198 wbeebee  1.12      *  <li>javax.realtime.MemoryArea.bless(java.lang.Object)</li>
199 wbeebee  1.12      *  <li>javax.realtime.MemoryArea.bless(java.lang.Object, int[])</li>
200 wbeebee  1.12      *  </ul>
201 wbeebee  1.12      */
202 wbeebee  1.12     
203 wbeebee  1.12     private static String resourcePath(String fileName) {
204 wbeebee  1.12         return "harpoon/Analysis/Realtime/"+fileName+".properties";
205 wbeebee  1.12     }
206 dumi     1.5      
207 wbeebee  1.12     public static Collection getRoots(final Linker linker) {
208 wbeebee  1.12         final List roots = new ArrayList();
209 wbeebee  1.12         
210 wbeebee  1.12         try {
211 wbeebee  1.12             // Read in all method roots for RTJ base

212 wbeebee  1.12             ParseUtil.readResource(resourcePath("realtime-method"),
213 wbeebee  1.12                                    new ParseUtil.StringParser() {
214 wbeebee  1.12                 public void parseString(String s) 
215 wbeebee  1.12                     throws ParseUtil.BadLineException {
216 wbeebee  1.8                                          roots.add(ParseUtil.parseMethod(linker, s));
217 wbeebee  1.12                 }
218 wbeebee  1.12             });
219 wbeebee  1.12             
220 wbeebee  1.12             // Read in all class roots for RTJ base

221 wbeebee  1.12             ParseUtil.readResource(resourcePath("realtime-class"),
222 wbeebee  1.12                                    new ParseUtil.StringParser() {
223 wbeebee  1.12                 public void parseString(String s)
224 wbeebee  1.12                     throws ParseUtil.BadLineException {
225 wbeebee  1.12                     roots.add(linker.forDescriptor(s));
226 wbeebee  1.12                 }
227 wbeebee  1.12             });
228 wbeebee  1.12             
229 wbeebee  1.12             
230 wbeebee  1.12             if (COLLECT_RUNTIME_STATS) {
231 wbeebee  1.12                 // Read in all method roots for calculating object memalloc statistics

232 wbeebee  1.12                 ParseUtil.readResource(resourcePath("stats-method"),
233 wbeebee  1.12                                        new ParseUtil.StringParser() {
234 wbeebee  1.12                     public void parseString(String s) 
235 wbeebee  1.8                                          throws ParseUtil.BadLineException {
236 wbeebee  1.12                         roots.add(ParseUtil.parseMethod(linker, s));
237 wbeebee  1.12                     }
238 wbeebee  1.12                 });
239 wbeebee  1.12             }
240 wbeebee  1.12             
241 wbeebee  1.12             if (REALTIME_THREADS) {
242 wbeebee  1.12                 // Read in all method roots for RTJ thread support

243 wbeebee  1.12                 ParseUtil.readResource(resourcePath("thread-method"),
244 wbeebee  1.12                                        new ParseUtil.StringParser() {
245 wbeebee  1.12                     public void parseString(String s) 
246 wbeebee  1.12                         throws ParseUtil.BadLineException {
247 wbeebee  1.12                         roots.add(ParseUtil.parseMethod(linker, s));
248 wbeebee  1.12                     }
249 wbeebee  1.12                 });
250 wbeebee  1.12             }
251 wbeebee  1.12             
252 wbeebee  1.12             if (RTJ_PERF) {
253 wbeebee  1.9                                  // Read in all method roots for RTJPerf support

254 wbeebee  1.12                 ParseUtil.readResource(resourcePath("rtjperf-method"),
255 wbeebee  1.12                                        new ParseUtil.StringParser() {
256 wbeebee  1.12                     public void parseString(String s)
257 wbeebee  1.12                         throws ParseUtil.BadLineException {
258 wbeebee  1.12                         roots.add(ParseUtil.parseMethod(linker, s));
259 wbeebee  1.12                     }
260 wbeebee  1.12                 });
261 wbeebee  1.12             }
262 wbeebee  1.12             
263 wbeebee  1.12         } catch (java.io.IOException e) {
264 wbeebee  1.12             assert false : "Properties file for RTJ error: "+e;
265 wbeebee  1.12         }
266 wbeebee  1.12         
267 wbeebee  1.12         return roots;
268 wbeebee  1.12     }    
269 wbeebee  1.12     
270 wbeebee  1.12     /** Adds realtime support to a block of code using an 
271 wbeebee  1.12      *  <code>harpoon.ClassFile.HCodeFactory</code>.  This includes
272 wbeebee  1.12      *  all of the pre-analysis modifications:
273 wbeebee  1.12      *  <ul>
274 wbeebee  1.12      *  <li> Makes sure that all classes that inherited from 
275 wbeebee  1.12      *       <code>java.lang.Thread</code> now inherit from 
276 wbeebee  1.12      *       <code>javax.realtime.RealtimeThread</code>. </li>
277 wbeebee  1.12      *  <li> Makes every new <code>java.lang.Thread</code> into a new 
278 wbeebee  1.12      *       <code>javax.realtime.RealtimeThread</code>. </li>
279 wbeebee  1.12      *  </ul>
280 wbeebee  1.12      */
281 wbeebee  1.12     
282 wbeebee  1.12     public static HCodeFactory setupCode(final Linker linker, 
283 wbeebee  1.12                                          final ClassHierarchy ch,
284 wbeebee  1.12                                          final HCodeFactory parent) {
285 wbeebee  1.12         Stats.realtimeBegin();
286 wbeebee  1.12         HCodeFactory hcf = Stats.trackQuadsIn(parent);
287 wbeebee  1.12         ThreadToRealtimeThread.updateClassHierarchy(linker, ch);
288 wbeebee  1.12         hcf = (new ThreadToRealtimeThread(hcf, linker)).codeFactory();
289 wbeebee  1.12         if ((!REMOVE_TAGS)||(ANALYSIS_METHOD!=ALL)) {
290 dumi     1.5              hcf = new ArrayInitRemover(hcf).codeFactory();
291 dumi     1.5          }
292 wbeebee  1.12         hcf = new CachingCodeFactory(hcf);
293 wbeebee  1.12         Stats.realtimeEnd();
294 wbeebee  1.12         return hcf;
295 wbeebee  1.12     }
296 wbeebee  1.12     
297 wbeebee  1.12     /** Adds realtime support to a block of code using an 
298 wbeebee  1.12      *  <code>harpoon.ClassFile.HCodeFactory</code>.  This includes the
299 wbeebee  1.12      *  analysis and all of the post-analysis modifications.
300 wbeebee  1.12      *  <ul>
301 wbeebee  1.12      *  <li> Attaches the current memory area to every new array and 
302 wbeebee  1.12      *       new object (sets the field <code>Object.memoryArea</code>).</li>
303 wbeebee  1.12      *  <li> Wraps checks around <code>harpoon.IR.Quads.SET</code>s and 
304 wbeebee  1.12      *       <code>harpoon.IR.Quads.ASET</code>s. </li>
305 wbeebee  1.12      *  </ul>
306 wbeebee  1.12      */
307 wbeebee  1.12     
308 wbeebee  1.12     public static HCodeFactory addChecks(Linker linker, 
309 wbeebee  1.12                                          ClassHierarchy ch, 
310 wbeebee  1.12                                          HCodeFactory parent,
311 wbeebee  1.12                                          Set roots) {
312 wbeebee  1.12         Stats.realtimeBegin();
313 wbeebee  1.12         CheckRemoval cr = null;
314 wbeebee  1.12         Stats.analysisBegin();
315 wbeebee  1.12         switch (ANALYSIS_METHOD) {
316 wbeebee  1.12         case SIMPLE: { 
317 wbeebee  1.12             cr = new SimpleCheckRemoval();
318 wbeebee  1.12             break; 
319 wbeebee  1.12         }
320 wbeebee  1.12         case CHEESY_POINTER_ANALYSIS: {
321 wbeebee  1.12             CachingCodeFactory ccf = 
322 wbeebee  1.12                 new CachingCodeFactory(QuadNoSSA.codeFactory(parent));
323 wbeebee  1.12             cr = new CheesyPACheckRemoval(linker, ch, ccf, roots);
324 wbeebee  1.12             break;
325 wbeebee  1.12         }
326 wbeebee  1.12         case REAL_POINTER_ANALYSIS: {
327 wbeebee  1.12             cr = new PACheckRemoval(linker, ch, parent, roots);
328 wbeebee  1.12             break;
329 wbeebee  1.12         }
330 wbeebee  1.12         case ALL: {
331 wbeebee  1.12             cr = new AllCheckRemoval();
332 wbeebee  1.12             break;
333 wbeebee  1.12         }
334 wbeebee  1.12         default: {      
335 wbeebee  1.12             assert false : "No RTJ analysis method specified.";
336 wbeebee  1.12         }
337 wbeebee  1.12         }
338 wbeebee  1.12         Stats.analysisEnd();
339 wbeebee  1.12         HCodeFactory hcf;
340 wbeebee  1.12         if (REMOVE_TAGS&&(ANALYSIS_METHOD==ALL)) {
341 dumi     1.5              hcf = parent;
342 wbeebee  1.12         } else {
343 dumi     1.5              hcf = CheckAdder.codeFactory(cr, new AllCheckRemoval(), parent);
344 dumi     1.5          }
345 wbeebee  1.12         hcf = Stats.trackQuadsOut(hcf);
346 wbeebee  1.12         Stats.realtimeEnd();
347 wbeebee  1.12         return hcf;
348 wbeebee  1.12     }
349 wbeebee  1.12     
350 wbeebee  1.12     /** Add checks to see if a <code>NoHeapRealtimeThread</code>
351 wbeebee  1.12      *  illegally touches the heap.
352 wbeebee  1.12      */
353 wbeebee  1.12     public static HCodeFactory addNoHeapChecks(HCodeFactory hcf) {
354 wbeebee  1.12         if (NOHEAP_CHECKS) {
355 dumi     1.5              return (new HeapCheckAdder()).codeFactory(hcf);
356 dumi     1.5          }
357 wbeebee  1.12         return hcf;
358 wbeebee  1.12     }
359 wbeebee  1.12     
360 wbeebee  1.12     /** Add code to check to see if a realtime thread quanta 
361 wbeebee  1.12      *  has passed to determine whether to do a user-thread-level 
362 wbeebee  1.12      *  context switch. 
363 wbeebee  1.12      */
364 wbeebee  1.12     
365 wbeebee  1.12     public static HCodeFactory addQuantaChecker(HCodeFactory hcf) {
366 wbeebee  1.12         if (REALTIME_THREADS&&(!REALTIME_THREADS_PREEMPT)) {
367 wbeebee  1.12             return Canonicalize.codeFactory((new QuantaChecker(hcf))
368 wbeebee  1.12                                             .codeFactory());
369 dumi     1.5          }
370 wbeebee  1.12         return hcf;
371 wbeebee  1.12     }
372 wbeebee  1.12     
373 wbeebee  1.12     
374 wbeebee  1.12     /** Print statistics about the static analysis and addition of 
375 wbeebee  1.12      *  Realtime support. */
376 dumi     1.5      
377 wbeebee  1.12     public static void printStats() {
378 wbeebee  1.12         Stats.print();
379 salcianu 1.13     }
380 salcianu 1.13 
381 salcianu 1.13 
382 salcianu 1.13     public static class QuadPass extends CompilerStageEZ {
383 salcianu 1.13         public QuadPass() { super("realtime-quad-pass"); }
384 salcianu 1.13 
385 salcianu 1.13         public List/*<Option>*/ getOptions() {
386 salcianu 1.13             List/*<Option>*/ opts = new LinkedList/*<Option>*/();
387 salcianu 1.13 
388 salcianu 1.15             opts.add(new Option("t", "", "<RTJOptions>",
389 salcianu 1.15                                 "Turns on Realtime Java extensions with the options given in the optional argument <RTJOptions>") {
390 salcianu 1.13                 public void action() {
391 salcianu 1.13                     Realtime.configure(getOptionalArg(0));
392 salcianu 1.13                 }
393 salcianu 1.13             });
394 salcianu 1.13 
395 salcianu 1.13             return opts;
396 salcianu 1.13         }
397 salcianu 1.13 
398 salcianu 1.14         public boolean enabled() { return REALTIME_JAVA; }
399 salcianu 1.13 
400 salcianu 1.13         protected void real_action() {
401 salcianu 1.13             hcf = Realtime.setupCode(linker, classHierarchy, hcf);
402 salcianu 1.13             classHierarchy = new QuadClassHierarchy(linker, roots, hcf);
403 salcianu 1.13             hcf = Realtime.addChecks(linker, classHierarchy, hcf, roots);
404 salcianu 1.13         }
405 salcianu 1.13     }
406 salcianu 1.13 
407 salcianu 1.13     public static class TreePass extends CompilerStageEZ {
408 salcianu 1.13         public TreePass() { super("realtime-tree-pass"); }
409 salcianu 1.14         public boolean enabled() { return REALTIME_JAVA; }
410 salcianu 1.13 
411 salcianu 1.13         protected void real_action() {
412 salcianu 1.13             hcf = Realtime.addNoHeapChecks(hcf);
413 salcianu 1.13             hcf = Realtime.addQuantaChecker(hcf);
414 salcianu 1.13             hcf = harpoon.Analysis.Tree.DerivationChecker.codeFactory(hcf);
415 salcianu 1.13             hcf = new CachingCodeFactory(hcf);
416 salcianu 1.13         }
417 wbeebee  1.12     }
418 cananian 1.16 }