1 cananian 1.1.2.10 // CheckAdder.java, created Tue Jan 23 16:09:50 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.5  import java.io.PrintWriter;
  7 wbeebee  1.5      import java.util.Iterator;
  8 wbeebee  1.1.2.5  
  9 wbeebee  1.1.2.1  import harpoon.Analysis.Transformation.MethodMutator;
 10 wbeebee  1.1.2.1  
 11 wbeebee  1.1.2.1  import harpoon.ClassFile.HClass;
 12 wbeebee  1.1.2.1  import harpoon.ClassFile.HCode;
 13 wbeebee  1.1.2.1  import harpoon.ClassFile.HCodeAndMaps;
 14 wbeebee  1.1.2.1  import harpoon.ClassFile.HCodeFactory;
 15 wbeebee  1.1.2.1  import harpoon.ClassFile.HMethod;
 16 wbeebee  1.1.2.1  import harpoon.ClassFile.Linker;
 17 wbeebee  1.1.2.1  
 18 wbeebee  1.1.2.1  import harpoon.IR.Quads.ANEW;
 19 wbeebee  1.1.2.1  import harpoon.IR.Quads.ARRAYINIT;
 20 wbeebee  1.1.2.1  import harpoon.IR.Quads.ASET;
 21 wbeebee  1.1.2.1  import harpoon.IR.Quads.CALL;
 22 wbeebee  1.1.2.1  import harpoon.IR.Quads.CONST;
 23 wbeebee  1.1.2.5  import harpoon.IR.Quads.METHOD;
 24 wbeebee  1.1.2.1  import harpoon.IR.Quads.MOVE;
 25 wbeebee  1.1.2.1  import harpoon.IR.Quads.NEW;
 26 wbeebee  1.1.2.1  import harpoon.IR.Quads.SET;
 27 wbeebee  1.1.2.1  
 28 wbeebee  1.1.2.1  import harpoon.IR.Quads.Edge;
 29 wbeebee  1.1.2.1  import harpoon.IR.Quads.Quad;
 30 wbeebee  1.1.2.1  import harpoon.IR.Quads.QuadFactory;
 31 wbeebee  1.1.2.1  import harpoon.IR.Quads.QuadVisitor;
 32 wbeebee  1.1.2.9  import harpoon.IR.Quads.QuadNoSSA;
 33 wbeebee  1.1.2.1  import harpoon.IR.Quads.QuadWithTry;
 34 wbeebee  1.1.2.1  
 35 wbeebee  1.1.2.1  import harpoon.Temp.Temp;
 36 wbeebee  1.1.2.1  import harpoon.Temp.TempFactory;
 37 wbeebee  1.1.2.1  
 38 cananian 1.7      import net.cscott.jutil.SnapshotIterator;
 39 cananian 1.6      
 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.2   * <code>CheckAdder</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   *
 49 cananian 1.1.2.10  * @author Wes Beebee <wbeebee@mit.edu>
 50 cananian 1.7       * @version $Id: CheckAdder.java,v 1.7 2004/02/08 01:53:47 cananian Exp $
 51 wbeebee  1.1.2.1   */
 52 wbeebee  1.1.2.1  
 53 wbeebee  1.1.2.8  // Fix to be non-static...
 54 wbeebee  1.1.2.6  
 55 wbeebee  1.1.2.8  abstract class CheckAdder extends MethodMutator {
 56 wbeebee  1.1.2.8      protected CheckRemoval checkRemoval;
 57 wbeebee  1.1.2.8      protected NoHeapCheckRemoval noHeapCheckRemoval;
 58 wbeebee  1.1.2.8  
 59 wbeebee  1.1.2.9      public boolean fastNew = true;
 60 wbeebee  1.1.2.9      public boolean smartMemAreaLoads = false;
 61 wbeebee  1.1.2.9      public boolean debugOutput = false;
 62 wbeebee  1.1.2.1  
 63 wbeebee  1.1.2.1      /** Creates a new <code>CheckAdder</code>, adding only the checks that
 64 wbeebee  1.1.2.5       *  can't be removed as specified by <code>CheckRemoval</code> and 
 65 wbeebee  1.1.2.5       *  <code>NoHeapCheckRemoval</code>.
 66 wbeebee  1.1.2.5       *  Use <code>hcf = (new CheckAdder(cr, nhcr, hcf)).codeFactory(); to link
 67 wbeebee  1.1.2.1       *  this <code>CheckAdder</code> into the <code>HCodeFactory</code> chain.
 68 wbeebee  1.1.2.1       */
 69 wbeebee  1.1.2.1  
 70 wbeebee  1.1.2.5      CheckAdder(CheckRemoval cr, NoHeapCheckRemoval nhcr, HCodeFactory parent) {
 71 wbeebee  1.1.2.1          super(parent);
 72 wbeebee  1.1.2.1          checkRemoval = cr;
 73 salcianu 1.1.2.7  
 74 wbeebee  1.1.2.5          noHeapCheckRemoval = nhcr;
 75 wbeebee  1.1.2.1      }
 76 wbeebee  1.1.2.1  
 77 wbeebee  1.1.2.1      /** Adds the checks to the code <code>input</code>. */
 78 wbeebee  1.1.2.1  
 79 wbeebee  1.1.2.8      abstract protected HCode mutateHCode(HCodeAndMaps input);
 80 wbeebee  1.1.2.8  
 81 wbeebee  1.1.2.8      protected HCode mutateHCode(HCodeAndMaps input, QuadVisitor visitor) {
 82 wbeebee  1.1.2.1          Stats.realtimeBegin();
 83 wbeebee  1.1.2.1          HCode hc = input.hcode();
 84 wbeebee  1.1.2.1          if (hc == null) {
 85 wbeebee  1.1.2.1              Stats.realtimeEnd();
 86 wbeebee  1.1.2.1              return hc;
 87 wbeebee  1.1.2.1          }
 88 wbeebee  1.1.2.1          HClass hclass = hc.getMethod().getDeclaringClass();
 89 wbeebee  1.1.2.2          if (hclass.getName().startsWith("javax.realtime.")) {
 90 wbeebee  1.1.2.1              Stats.realtimeEnd();
 91 wbeebee  1.1.2.1              return hc;
 92 wbeebee  1.1.2.1          }
 93 wbeebee  1.1.2.1          final Linker linker = hclass.getLinker();
 94 wbeebee  1.1.2.1          
 95 wbeebee  1.1.2.8          if (debugOutput) {
 96 wbeebee  1.1.2.8              System.out.println("Before:");
 97 wbeebee  1.1.2.8              hc.print(new PrintWriter(System.out));
 98 wbeebee  1.1.2.8          }
 99 wbeebee  1.1.2.8  
100 cananian 1.6              // note that we use a SnapshotIterator so that qi is 'static';
101 cananian 1.6              // i.e. the underlying list of elements to iterate over does not
102 cananian 1.6              // change as the visitor mutates the hcode.
103 cananian 1.6              Iterator qi = new SnapshotIterator(hc.getElementsI());
104 wbeebee  1.5              while (qi.hasNext()) ((Quad)(qi.next())).accept(visitor);
105 wbeebee  1.1.2.1  
106 wbeebee  1.1.2.8          if (debugOutput) {
107 wbeebee  1.1.2.8              System.out.println("After:");
108 wbeebee  1.1.2.8              hc.print(new PrintWriter(System.out));
109 wbeebee  1.1.2.1          }
110 wbeebee  1.1.2.5  
111 wbeebee  1.1.2.8          Stats.realtimeEnd();
112 wbeebee  1.1.2.8          return hc;
113 wbeebee  1.1.2.5      }
114 wbeebee  1.1.2.1  
115 wbeebee  1.1.2.1      /** Indicates if the given instruction needs an access check wrapped 
116 wbeebee  1.1.2.9       *  around it. 
117 wbeebee  1.1.2.9       */
118 wbeebee  1.1.2.1      
119 wbeebee  1.1.2.8      protected boolean needsCheck(Quad inst) {
120 wbeebee  1.1.2.1          Stats.analysisBegin();
121 wbeebee  1.1.2.4          boolean removeCheck = checkRemoval.shouldRemoveCheck(inst);
122 wbeebee  1.1.2.1          Stats.analysisEnd();
123 wbeebee  1.1.2.4          if (removeCheck) {
124 wbeebee  1.1.2.1              Stats.addRemovedMemCheck();
125 wbeebee  1.1.2.4          } else {
126 wbeebee  1.1.2.4              Stats.addActualMemCheck();
127 wbeebee  1.1.2.1          }
128 wbeebee  1.1.2.4          return !removeCheck;
129 wbeebee  1.1.2.9      }
130 wbeebee  1.1.2.9  
131 wbeebee  1.1.2.9      /** Looks up the type of the parent <code>HCodeFactory</code> and constructs
132 wbeebee  1.1.2.9       *  the appropriate <code>HCodeFactory</code> from the correct 
133 wbeebee  1.1.2.9       *  <code>CheckAdder</code>.  A <code>QuadWithTry</code> is created for an input 
134 wbeebee  1.1.2.9       *  <code>QuadWithTry</code>, a <code>QuadNoSSA</code> is created for an input
135 wbeebee  1.1.2.9       *  <code>QuadNoSSA</code>.  Currently, no other quadforms are supported.
136 wbeebee  1.1.2.9       */
137 wbeebee  1.1.2.9  
138 wbeebee  1.1.2.9      public static HCodeFactory codeFactory(CheckRemoval cr, 
139 wbeebee  1.1.2.9                                             NoHeapCheckRemoval nhcr,
140 wbeebee  1.1.2.9                                             HCodeFactory parent) {
141 wbeebee  1.1.2.9          String codeName = parent.getCodeName();
142 wbeebee  1.1.2.9          if (codeName.equals(QuadNoSSA.codename)) {
143 wbeebee  1.1.2.9              return (new CheckAdderNoSSA(cr, nhcr, parent)).codeFactory();
144 wbeebee  1.1.2.9          } else if (codeName.equals(QuadWithTry.codename)) {
145 wbeebee  1.1.2.9              return (new CheckAdderWithTry(cr, nhcr, parent)).codeFactory();
146 wbeebee  1.1.2.9          } else {
147 cananian 1.3.2.1              assert false : ("Quads type: " + codeName + " not a supported CheckAdder");
148 wbeebee  1.1.2.9              return null;
149 wbeebee  1.1.2.9          }
150 wbeebee  1.1.2.9      }
151 wbeebee  1.1.2.1  }
152 cananian 1.2