1 bdemsky  1.1.2.1 // RoleInference.java, created Thu May 17 13:40:49 2001 by bdemsky
  2 cananian 1.1.2.7 // Copyright (C) 2000 Brian Demsky <bdemsky@mit.edu>
  3 bdemsky  1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 bdemsky  1.1.2.1 package harpoon.Analysis.RoleInference;
  5 bdemsky  1.1.2.1 
  6 bdemsky  1.1.2.1 
  7 bdemsky  1.1.2.4 import harpoon.Analysis.Quads.QuadLiveness;
  8 bdemsky  1.1.2.4 import harpoon.Analysis.ReachingDefs;
  9 bdemsky  1.1.2.4 import harpoon.Analysis.ReachingDefsImpl;
 10 bdemsky  1.1.2.1 import harpoon.ClassFile.HCode;
 11 bdemsky  1.1.2.1 import harpoon.ClassFile.HCodeAndMaps;
 12 bdemsky  1.1.2.1 import harpoon.ClassFile.HCodeFactory;
 13 bdemsky  1.1.2.1 import harpoon.ClassFile.HClass;
 14 bdemsky  1.1.2.1 import harpoon.ClassFile.HField;
 15 bdemsky  1.1.2.1 import harpoon.ClassFile.HMethod;
 16 bdemsky  1.1.2.1 import harpoon.ClassFile.Linker;
 17 bdemsky  1.1.2.1 import harpoon.IR.Quads.ANEW;
 18 bdemsky  1.1.2.1 import harpoon.IR.Quads.ASET;
 19 bdemsky  1.1.2.1 import harpoon.IR.Quads.AGET;
 20 bdemsky  1.1.2.1 import harpoon.IR.Quads.CALL;
 21 bdemsky  1.1.2.1 import harpoon.IR.Quads.CONST;
 22 bdemsky  1.1.2.1 import harpoon.IR.Quads.SET;
 23 bdemsky  1.1.2.1 import harpoon.IR.Quads.GET;
 24 bdemsky  1.1.2.1 import harpoon.IR.Quads.METHOD;
 25 bdemsky  1.1.2.4 import harpoon.IR.Quads.NEW;
 26 bdemsky  1.1.2.1 import harpoon.IR.Quads.MOVE;
 27 bdemsky  1.1.2.1 import harpoon.IR.Quads.PHI;
 28 bdemsky  1.1.2.1 import harpoon.IR.Quads.RETURN;
 29 bdemsky  1.1.2.1 import harpoon.IR.Quads.THROW;
 30 bdemsky  1.1.2.1 import harpoon.IR.Quads.Quad;
 31 bdemsky  1.1.2.4 import harpoon.IR.Quads.QuadKind;
 32 bdemsky  1.1.2.1 import harpoon.IR.Quads.QuadVisitor;
 33 bdemsky  1.1.2.1 import harpoon.Temp.Temp;
 34 bdemsky  1.1.2.4 import harpoon.Util.TypeInference.TypeInference;
 35 bdemsky  1.1.2.4 import harpoon.Util.TypeInference.ExactTemp;
 36 cananian 1.3     import net.cscott.jutil.WorkSet;
 37 bdemsky  1.1.2.4 import java.util.Iterator;
 38 bdemsky  1.1.2.1 import java.util.List;
 39 bdemsky  1.1.2.4 import java.util.Set;
 40 bdemsky  1.1.2.1 
 41 bdemsky  1.1.2.1 
 42 bdemsky  1.1.2.1 /**
 43 bdemsky  1.1.2.1  * <code>RoleInference</code>
 44 bdemsky  1.1.2.1  * 
 45 cananian 1.1.2.7  * @author  Brian Demsky <bdemsky@mit.edu>
 46 cananian 1.4      * @version $Id: RoleInference.java,v 1.4 2004/02/08 03:20:17 cananian Exp $
 47 bdemsky  1.1.2.1  */
 48 bdemsky  1.1.2.1 public class RoleInference extends harpoon.Analysis.Transformation.MethodMutator {
 49 bdemsky  1.1.2.1     final Linker linker;
 50 bdemsky  1.1.2.1     public RoleInference(HCodeFactory parent, Linker linker) {
 51 bdemsky  1.1.2.1         super(parent);
 52 bdemsky  1.1.2.1         this.linker=linker;
 53 bdemsky  1.1.2.1     }
 54 bdemsky  1.1.2.1 
 55 bdemsky  1.1.2.1     protected HCode mutateHCode(HCodeAndMaps input) {
 56 bdemsky  1.1.2.1         HCode hcode=input.hcode();
 57 bdemsky  1.1.2.5         //System.out.println(hcode.getMethod().getName());
 58 bdemsky  1.1.2.4 
 59 bdemsky  1.1.2.5         if ((hcode.getMethod().getModifiers()&java.lang.reflect.Modifier.NATIVE)!=0) 
 60 bdemsky  1.1.2.5             return hcode;
 61 cananian 1.3             RoleVisitor rv=new RoleVisitor(linker, (HCode<Quad>) hcode);
 62 bdemsky  1.1.2.5         
 63 bdemsky  1.1.2.1         if (transform(hcode.getMethod())) {
 64 bdemsky  1.1.2.1             List list=hcode.getElementsL();
 65 bdemsky  1.1.2.4             for (int i=0;i<list.size();i++)
 66 bdemsky  1.1.2.4                 rv.setoftypes((Quad)list.get(i));
 67 bdemsky  1.1.2.4             rv.dotyping();
 68 bdemsky  1.1.2.4             
 69 bdemsky  1.1.2.1             for (int i=0;i<list.size(); i++) {
 70 bdemsky  1.1.2.1                 Quad q=(Quad)list.get(i);
 71 bdemsky  1.1.2.4                 rv.nonlive(q);
 72 bdemsky  1.1.2.1                 q.accept(rv);
 73 bdemsky  1.1.2.1             }
 74 bdemsky  1.1.2.1         }
 75 bdemsky  1.1.2.8         hcode.print(new java.io.PrintWriter(System.out, true));
 76 bdemsky  1.1.2.1         return hcode;
 77 bdemsky  1.1.2.1     }
 78 bdemsky  1.1.2.1 
 79 bdemsky  1.1.2.1     boolean transform(HMethod hc) {
 80 bdemsky  1.1.2.1         if (hc.getDeclaringClass().getName().equals("java.lang.RoleInference"))
 81 bdemsky  1.1.2.1             return false;
 82 bdemsky  1.1.2.1         else
 83 bdemsky  1.1.2.1             return true;
 84 bdemsky  1.1.2.1     }
 85 bdemsky  1.1.2.1 
 86 bdemsky  1.1.2.1     static class RoleVisitor extends QuadVisitor {
 87 bdemsky  1.1.2.1         HMethod arrayinitmethod;
 88 bdemsky  1.1.2.4         HMethod objectinitmethod;
 89 bdemsky  1.1.2.1         HMethod arrayassignmethod;
 90 bdemsky  1.1.2.1         HMethod fieldassignmethod;
 91 bdemsky  1.1.2.8         HMethod fieldloadmethod;
 92 bdemsky  1.1.2.1         HMethod marklocalmethod;
 93 bdemsky  1.1.2.4         HMethod killlocalmethod;
 94 bdemsky  1.1.2.1         HMethod returnmethod;
 95 bdemsky  1.1.2.3         HMethod invokemethod;
 96 bdemsky  1.1.2.1         HClass strclass;
 97 bdemsky  1.1.2.1         HClass fieldclass;
 98 bdemsky  1.1.2.3         HClass methodclass;
 99 bdemsky  1.1.2.4         HClass clsclass;
100 bdemsky  1.1.2.4         QuadLiveness liveness;
101 bdemsky  1.1.2.4         ReachingDefs reachingdef;
102 bdemsky  1.1.2.4         Set exacttemps;
103 bdemsky  1.1.2.4         TypeInference ti;
104 bdemsky  1.1.2.4         HCode hc;
105 bdemsky  1.1.2.5         LocalVariableNamer lvn;
106 bdemsky  1.1.2.4 
107 cananian 1.3             public RoleVisitor(Linker linker, HCode<Quad> hc) {
108 bdemsky  1.1.2.4             liveness=new QuadLiveness(hc);
109 bdemsky  1.1.2.4             reachingdef=new ReachingDefsImpl(hc);
110 bdemsky  1.1.2.4             exacttemps=new WorkSet();
111 bdemsky  1.1.2.5             lvn=new LocalVariableNamer(hc.getMethod());
112 bdemsky  1.1.2.4             this.hc=hc;
113 bdemsky  1.1.2.1             HClass objclass=linker.forName("java.lang.Object");
114 bdemsky  1.1.2.4             clsclass=linker.forName("java.lang.Class");
115 bdemsky  1.1.2.1             strclass=linker.forName("java.lang.String");
116 bdemsky  1.1.2.1             HClass roleclass=linker.forName("java.lang.RoleInference");
117 bdemsky  1.1.2.1             fieldclass=linker.forName("java.lang.reflect.Field");
118 bdemsky  1.1.2.3             methodclass=linker.forName("java.lang.reflect.Method");
119 bdemsky  1.1.2.1             arrayinitmethod=roleclass.getDeclaredMethod("arrayassignUID", 
120 bdemsky  1.1.2.1                                                         new HClass[] {objclass, HClass.Int});
121 bdemsky  1.1.2.4             objectinitmethod=objclass.getDeclaredMethod("assignUID", 
122 bdemsky  1.1.2.4                                                         new HClass[] {clsclass});
123 bdemsky  1.1.2.1             arrayassignmethod=roleclass.getDeclaredMethod("arrayassign",
124 bdemsky  1.1.2.1                                                           new HClass[] {objclass, HClass.Int, objclass});
125 bdemsky  1.1.2.1             fieldassignmethod=roleclass.getDeclaredMethod("fieldassign",
126 bdemsky  1.1.2.1                                                           new HClass[] {objclass, fieldclass, objclass});
127 bdemsky  1.1.2.1             marklocalmethod=roleclass.getDeclaredMethod("marklocal",
128 bdemsky  1.1.2.1                                                         new HClass[] {strclass, objclass});
129 bdemsky  1.1.2.8             fieldloadmethod=roleclass.getDeclaredMethod("fieldload",
130 bdemsky  1.1.2.8                                                         new HClass[] {strclass, objclass, fieldclass, objclass});
131 bdemsky  1.1.2.4             killlocalmethod=roleclass.getDeclaredMethod("killlocal",
132 bdemsky  1.1.2.4                                                         new HClass[] {strclass});
133 bdemsky  1.1.2.6             returnmethod=roleclass.getDeclaredMethod("returnmethod", new HClass[]{objclass});
134 bdemsky  1.1.2.6             invokemethod=roleclass.getDeclaredMethod("invokemethod", new HClass[] {methodclass, HClass.Int});
135 bdemsky  1.1.2.1         }
136 bdemsky  1.1.2.1 
137 bdemsky  1.1.2.1         public void visit(Quad q) {
138 bdemsky  1.1.2.1         }
139 bdemsky  1.1.2.1 
140 bdemsky  1.1.2.4         public void nonlive(Quad q) {
141 bdemsky  1.1.2.4             int kind=q.kind();
142 bdemsky  1.1.2.4             if ((kind!=QuadKind.HEADER)&&(kind!=QuadKind.FOOTER)&&(kind!=QuadKind.RETURN)&&(kind!=QuadKind.THROW)) {
143 bdemsky  1.1.2.5                 Set livein=liveness.getLiveIn(q);
144 bdemsky  1.1.2.5                 livein.addAll(q.defC());//wanna do kills of useless locals
145 bdemsky  1.1.2.5                 livein.removeAll(liveness.getLiveOut(q));
146 cananian 1.4                     for(Object tO : livein) {
147 cananian 1.4                         Temp t = (Temp) tO;
148 bdemsky  1.1.2.5                     Set possibletypes=ti.getType(new ExactTemp(q,t));
149 bdemsky  1.1.2.5                     boolean couldbeobject=false;
150 bdemsky  1.1.2.5                     for(Iterator typeit=possibletypes.iterator();typeit.hasNext();)
151 bdemsky  1.1.2.5                         if (!((HClass)typeit.next()).isPrimitive())
152 bdemsky  1.1.2.5                             couldbeobject=true;
153 bdemsky  1.1.2.5                     if (couldbeobject) {
154 bdemsky  1.1.2.5                         for(int i=0;i<q.nextLength();i++) {
155 bdemsky  1.1.2.5                             //Live In, not Live Out
156 bdemsky  1.1.2.5                             //Needs to be object also
157 bdemsky  1.1.2.5                             Temp tname=new Temp(q.getFactory().tempFactory());
158 bdemsky  1.1.2.5                             String name=buildname(q,t);
159 bdemsky  1.1.2.5                             CONST nameconst=new CONST(q.getFactory(), q, tname, name,
160 bdemsky  1.1.2.5                                                       strclass);
161 bdemsky  1.1.2.5                             Temp texc=new Temp(q.getFactory().tempFactory());
162 bdemsky  1.1.2.5                             CALL nc=new CALL(q.getFactory(),q,killlocalmethod,
163 bdemsky  1.1.2.5                                              new Temp[] {tname}, null,texc,
164 bdemsky  1.1.2.5                                              false,false, new Temp[0]);
165 bdemsky  1.1.2.5                             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
166 bdemsky  1.1.2.5                             
167 bdemsky  1.1.2.5                             Quad.addEdge(phi,0, q.next(i),q.nextEdge(i).which_pred());
168 bdemsky  1.1.2.5                             Quad.addEdge(nc,0,phi,0);
169 bdemsky  1.1.2.5                             Quad.addEdge(nc,1,phi,1);
170 bdemsky  1.1.2.5                             Quad.addEdge(q,i,nameconst,0);
171 bdemsky  1.1.2.5                             Quad.addEdge(nameconst,0, nc,0);
172 bdemsky  1.1.2.5                         }
173 bdemsky  1.1.2.5                     }
174 bdemsky  1.1.2.4                 }
175 bdemsky  1.1.2.4             }
176 bdemsky  1.1.2.4         }
177 bdemsky  1.1.2.4 
178 bdemsky  1.1.2.4         public void setoftypes(Quad q) {
179 bdemsky  1.1.2.4             Set livein=liveness.getLiveIn(q);
180 bdemsky  1.1.2.4             livein.addAll(q.defC());
181 bdemsky  1.1.2.4             livein.removeAll(liveness.getLiveOut(q));
182 bdemsky  1.1.2.4             //live in now contains newly dead local vars
183 cananian 1.4                 for(Object tO : livein) {
184 cananian 1.4                     Temp t = (Temp) tO;
185 bdemsky  1.1.2.4                 exacttemps.add(new ExactTemp(q,t));
186 bdemsky  1.1.2.4             }
187 bdemsky  1.1.2.4             if (q instanceof MOVE) {
188 bdemsky  1.1.2.4                 exacttemps.add(new ExactTemp(q,((MOVE)q).src()));
189 bdemsky  1.1.2.4             }
190 bdemsky  1.1.2.4         }
191 bdemsky  1.1.2.4 
192 bdemsky  1.1.2.4         public void dotyping() {
193 bdemsky  1.1.2.4             ti=new TypeInference(hc.getMethod(),hc,exacttemps);
194 bdemsky  1.1.2.4         }
195 bdemsky  1.1.2.4 
196 bdemsky  1.1.2.5         public String buildname(Quad q, Temp t) { 
197 bdemsky  1.1.2.5             String othername="$$$unk";
198 bdemsky  1.1.2.5             String name=t.name();
199 bdemsky  1.1.2.5             int linenumber=q.getLineNumber();
200 bdemsky  1.1.2.5             if ((name.length()>2)&&(name.charAt(0)=='l')&&(name.charAt(1)=='v')) {
201 bdemsky  1.1.2.5                 int endindex=name.indexOf('_');
202 bdemsky  1.1.2.5                 String number=name.substring(2, endindex);
203 bdemsky  1.1.2.5                 int lvnumber=Integer.parseInt(number);
204 bdemsky  1.1.2.5                 //System.out.println(lvnumber+":"+linenumber+" "+name);
205 bdemsky  1.1.2.5                 String ts=lvn.lv_name(lvnumber,linenumber);
206 bdemsky  1.1.2.5                 if (ts!=null) {
207 bdemsky  1.1.2.5                     othername=ts;
208 bdemsky  1.1.2.5                     //System.out.println("*********"+ts);
209 bdemsky  1.1.2.5                 }
210 bdemsky  1.1.2.5             }
211 bdemsky  1.1.2.5             return t.name()+" "+linenumber+" "+othername;
212 bdemsky  1.1.2.4         }
213 bdemsky  1.1.2.4 
214 bdemsky  1.1.2.1         public void visit(ANEW q) {
215 bdemsky  1.1.2.4             //FIXME::Needs to do Marklocal
216 bdemsky  1.1.2.1             int dims=q.dimsLength();
217 bdemsky  1.1.2.1             Temp dst=q.dst();
218 bdemsky  1.1.2.1             Temp t=new Temp(q.getFactory().tempFactory());
219 bdemsky  1.1.2.1             Temp texc=new Temp(q.getFactory().tempFactory());
220 bdemsky  1.1.2.1             CONST c=new CONST(q.getFactory(), q, t, new Integer(dims), HClass.Int);
221 bdemsky  1.1.2.1             CALL nc=new CALL(q.getFactory(), q, arrayinitmethod,
222 bdemsky  1.1.2.1                      new Temp[] {dst,t}, null, texc, false,
223 bdemsky  1.1.2.1                              false, new Temp[0]);
224 bdemsky  1.1.2.1             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
225 bdemsky  1.1.2.1             
226 bdemsky  1.1.2.1             Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
227 bdemsky  1.1.2.1             Quad.addEdge(nc,0,phi,0);
228 bdemsky  1.1.2.1             Quad.addEdge(nc,1,phi,1);
229 bdemsky  1.1.2.1             Quad.addEdge(q,0,c,0);
230 bdemsky  1.1.2.1             Quad.addEdge(c,0,nc,0);
231 bdemsky  1.1.2.4             
232 bdemsky  1.1.2.4             Quad q2=phi;
233 bdemsky  1.1.2.4             Temp tname=new Temp(q.getFactory().tempFactory());
234 bdemsky  1.1.2.4             String name=buildname(q,dst);
235 bdemsky  1.1.2.4             CONST nameconst=new CONST(q.getFactory(), q, tname, name,
236 bdemsky  1.1.2.4                                       strclass);
237 bdemsky  1.1.2.4             texc=new Temp(q.getFactory().tempFactory());
238 bdemsky  1.1.2.4             nc=new CALL(q.getFactory(),q,marklocalmethod,
239 bdemsky  1.1.2.4                         new Temp[] {tname,dst}, null,texc,
240 bdemsky  1.1.2.4                         false,false, new Temp[0]);
241 bdemsky  1.1.2.4             phi=new PHI(q.getFactory(),q, new Temp[0], 2);
242 bdemsky  1.1.2.4             Quad.addEdge(phi,0, q2.next(0),q2.nextEdge(0).which_pred());
243 bdemsky  1.1.2.4             Quad.addEdge(nc,0,phi,0);
244 bdemsky  1.1.2.4             Quad.addEdge(nc,1,phi,1);
245 bdemsky  1.1.2.4             Quad.addEdge(q2,0,nameconst,0);
246 bdemsky  1.1.2.4             Quad.addEdge(nameconst,0, nc,0);
247 bdemsky  1.1.2.4         }
248 bdemsky  1.1.2.4 
249 bdemsky  1.1.2.4         public void visit(NEW q) {
250 bdemsky  1.1.2.4             Temp t=q.dst();
251 bdemsky  1.1.2.4             Temp texc=new Temp(q.getFactory().tempFactory()), 
252 bdemsky  1.1.2.4                 tcls=new Temp(q.getFactory().tempFactory());
253 bdemsky  1.1.2.4             
254 bdemsky  1.1.2.4             CONST cc=new CONST(q.getFactory(), q, tcls, q.hclass(),
255 bdemsky  1.1.2.4                                clsclass);
256 bdemsky  1.1.2.4             CALL nc=new CALL(q.getFactory(), q, objectinitmethod,
257 bdemsky  1.1.2.4                      new Temp[] {t,tcls}, null, texc, true,
258 bdemsky  1.1.2.4                              false, new Temp[0]);
259 bdemsky  1.1.2.4             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
260 bdemsky  1.1.2.4             
261 bdemsky  1.1.2.4             Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
262 bdemsky  1.1.2.4             Quad.addEdge(nc,0,phi,0);
263 bdemsky  1.1.2.4             Quad.addEdge(nc,1,phi,1);
264 bdemsky  1.1.2.4             Quad.addEdge(q,0,cc,0);
265 bdemsky  1.1.2.4             Quad.addEdge(cc,0,nc,0);
266 bdemsky  1.1.2.4 
267 bdemsky  1.1.2.4             Quad q2=phi;
268 bdemsky  1.1.2.4             Temp tname=new Temp(q.getFactory().tempFactory());
269 bdemsky  1.1.2.4             String name=buildname(q,t);
270 bdemsky  1.1.2.4             CONST nameconst=new CONST(q.getFactory(), q, tname, name,
271 bdemsky  1.1.2.4                                       strclass);
272 bdemsky  1.1.2.4             texc=new Temp(q.getFactory().tempFactory());
273 bdemsky  1.1.2.4             nc=new CALL(q.getFactory(),q,marklocalmethod,
274 bdemsky  1.1.2.4                         new Temp[] {tname,t}, null,texc,
275 bdemsky  1.1.2.4                         false,false, new Temp[0]);
276 bdemsky  1.1.2.4             phi=new PHI(q.getFactory(),q, new Temp[0], 2);
277 bdemsky  1.1.2.4             Quad.addEdge(phi,0, q2.next(0),q2.nextEdge(0).which_pred());
278 bdemsky  1.1.2.4             Quad.addEdge(nc,0,phi,0);
279 bdemsky  1.1.2.4             Quad.addEdge(nc,1,phi,1);
280 bdemsky  1.1.2.4             Quad.addEdge(q2,0,nameconst,0);
281 bdemsky  1.1.2.4             Quad.addEdge(nameconst,0, nc,0);
282 bdemsky  1.1.2.1         }
283 bdemsky  1.1.2.1 
284 bdemsky  1.1.2.1         public void visit(ASET q) {
285 bdemsky  1.1.2.3             if (!q.type().isPrimitive()) {
286 bdemsky  1.1.2.3                 Temp array=q.objectref();
287 bdemsky  1.1.2.3                 Temp index=q.index();
288 bdemsky  1.1.2.3                 Temp component=q.src();
289 bdemsky  1.1.2.3                 Temp texc=new Temp(q.getFactory().tempFactory());
290 bdemsky  1.1.2.3                 CALL nc=new CALL(q.getFactory(), q, arrayassignmethod,
291 bdemsky  1.1.2.3                                  new Temp[] {array, index, component},
292 bdemsky  1.1.2.3                                  null, texc, false, false, new Temp[0]);
293 bdemsky  1.1.2.3                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
294 bdemsky  1.1.2.3                 
295 bdemsky  1.1.2.3                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
296 bdemsky  1.1.2.3                 Quad.addEdge(nc,0,phi,0);
297 bdemsky  1.1.2.3                 Quad.addEdge(nc,1,phi,1);
298 bdemsky  1.1.2.3                 Quad.addEdge(q,0,nc,0);
299 bdemsky  1.1.2.3             }
300 bdemsky  1.1.2.1         }
301 bdemsky  1.1.2.1 
302 bdemsky  1.1.2.1         public void visit(AGET q) {
303 bdemsky  1.1.2.1             //Potential Local Variable Assignment
304 bdemsky  1.1.2.4             if (!q.type().isPrimitive()) {
305 bdemsky  1.1.2.4                 Temp t=q.dst();
306 bdemsky  1.1.2.8                 Temp t2=new Temp(q.getFactory().tempFactory());
307 bdemsky  1.1.2.8 
308 bdemsky  1.1.2.9                 MOVE move=new MOVE(q.getFactory(),q,
309 bdemsky  1.1.2.9                                    t2, q.objectref());
310 bdemsky  1.1.2.9                 Quad.addEdge(q.prev(0), q.prevEdge(0).which_succ(), move,0);
311 bdemsky  1.1.2.9                 Quad.addEdge(move,0,q,0);
312 bdemsky  1.1.2.9                 
313 bdemsky  1.1.2.4                 Temp tname=new Temp(q.getFactory().tempFactory());
314 bdemsky  1.1.2.4                 String name=buildname(q,t);
315 bdemsky  1.1.2.8                 Temp tfield=new Temp(q.getFactory().tempFactory());
316 bdemsky  1.1.2.8 
317 bdemsky  1.1.2.8                 CONST cfield=new CONST(q.getFactory(),q,tfield,
318 bdemsky  1.1.2.8                                        null, HClass.Void);
319 bdemsky  1.1.2.4                 CONST nameconst=new CONST(q.getFactory(), q, tname, name,
320 bdemsky  1.1.2.4                                           strclass);
321 bdemsky  1.1.2.4                 Temp texc=new Temp(q.getFactory().tempFactory());
322 bdemsky  1.1.2.8                 CALL nc=new CALL(q.getFactory(),q,fieldloadmethod,
323 bdemsky  1.1.2.8                                  new Temp[] {tname,t2,tfield,t}, null,texc,
324 bdemsky  1.1.2.4                                  false,false, new Temp[0]);
325 bdemsky  1.1.2.4                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
326 bdemsky  1.1.2.4                 
327 bdemsky  1.1.2.4                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
328 bdemsky  1.1.2.4                 Quad.addEdge(nc,0,phi,0);
329 bdemsky  1.1.2.4                 Quad.addEdge(nc,1,phi,1);
330 bdemsky  1.1.2.4                 Quad.addEdge(q,0,nameconst,0);
331 bdemsky  1.1.2.8                 Quad.addEdge(nameconst,0,cfield,0);
332 bdemsky  1.1.2.8                 Quad.addEdge(cfield,0, nc,0);
333 bdemsky  1.1.2.4             }
334 bdemsky  1.1.2.1         }
335 bdemsky  1.1.2.1 
336 bdemsky  1.1.2.1         public void visit(SET q) {
337 bdemsky  1.1.2.1             //Potential Global Variable Assignment or
338 bdemsky  1.1.2.1             //Heap modification
339 bdemsky  1.1.2.3             if (!q.field().getType().isPrimitive()) {
340 bdemsky  1.1.2.3                 Temp array=q.objectref();
341 bdemsky  1.1.2.3                 HField field=q.field();
342 bdemsky  1.1.2.3                 Temp tfield=new Temp(q.getFactory().tempFactory());
343 bdemsky  1.1.2.3                 Temp component=q.src();
344 bdemsky  1.1.2.3                 
345 bdemsky  1.1.2.3                 CONST nconst=null;
346 bdemsky  1.1.2.3                 if (array==null) {
347 bdemsky  1.1.2.3                     array=new Temp(q.getFactory().tempFactory());
348 bdemsky  1.1.2.3                     nconst=new CONST(q.getFactory(),q,array,null, HClass.Void);
349 bdemsky  1.1.2.3                 }
350 bdemsky  1.1.2.3                 
351 bdemsky  1.1.2.3                 CONST cfield=new CONST(q.getFactory(),q,tfield,
352 bdemsky  1.1.2.3                                        field, fieldclass);
353 bdemsky  1.1.2.3                 Temp texc=new Temp(q.getFactory().tempFactory());
354 bdemsky  1.1.2.3                 CALL nc=new CALL(q.getFactory(), q, fieldassignmethod,
355 bdemsky  1.1.2.3                                  new Temp[] {array, tfield, component},
356 bdemsky  1.1.2.3                                  null, texc, false, false, new Temp[0]);
357 bdemsky  1.1.2.3                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
358 bdemsky  1.1.2.3                 
359 bdemsky  1.1.2.3                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
360 bdemsky  1.1.2.3                 Quad.addEdge(q,0,cfield,0);
361 bdemsky  1.1.2.3                 if (nconst!=null) {
362 bdemsky  1.1.2.3                     Quad.addEdge(cfield,0,nconst,0);
363 bdemsky  1.1.2.3                     Quad.addEdge(nconst,0,nc,0);
364 bdemsky  1.1.2.3                 } else
365 bdemsky  1.1.2.3                     Quad.addEdge(cfield,0,nc,0);
366 bdemsky  1.1.2.3                 Quad.addEdge(nc,0,phi,0);
367 bdemsky  1.1.2.3                 Quad.addEdge(nc,1,phi,1);
368 bdemsky  1.1.2.1             }
369 bdemsky  1.1.2.1         }
370 bdemsky  1.1.2.1 
371 bdemsky  1.1.2.1         public void visit(GET q) {
372 bdemsky  1.1.2.1             //Potential Local Variable Assignment
373 bdemsky  1.1.2.4             if (!q.field().getType().isPrimitive()) {
374 bdemsky  1.1.2.4                 Temp t=q.dst();
375 bdemsky  1.1.2.8                 Temp t2=new Temp(q.getFactory().tempFactory());
376 bdemsky  1.1.2.8 
377 bdemsky  1.1.2.8                 if (q.objectref()!=null) {
378 bdemsky  1.1.2.8                     MOVE move=new MOVE(q.getFactory(),q,
379 bdemsky  1.1.2.8                                    t2, q.objectref());
380 bdemsky  1.1.2.8                     Quad.addEdge(q.prev(0), q.prevEdge(0).which_succ(), move,0);
381 bdemsky  1.1.2.8                     Quad.addEdge(move,0,q,0);
382 bdemsky  1.1.2.8                 } else {
383 bdemsky  1.1.2.8                     CONST qconst=new CONST(q.getFactory(), q, t2, null, HClass.Void);
384 bdemsky  1.1.2.8                     Quad.addEdge(q.prev(0), q.prevEdge(0).which_succ(), qconst,0);
385 bdemsky  1.1.2.8                     Quad.addEdge(qconst,0,q,0);
386 bdemsky  1.1.2.8                 }
387 bdemsky  1.1.2.4                 Temp tname=new Temp(q.getFactory().tempFactory());
388 bdemsky  1.1.2.4                 String name=buildname(q,t);
389 bdemsky  1.1.2.8                 Temp tfield=new Temp(q.getFactory().tempFactory());
390 bdemsky  1.1.2.8 
391 bdemsky  1.1.2.8                 CONST cfield=new CONST(q.getFactory(),q,tfield,
392 bdemsky  1.1.2.8                                        q.field(), fieldclass);
393 bdemsky  1.1.2.4                 CONST nameconst=new CONST(q.getFactory(), q, tname, name,
394 bdemsky  1.1.2.4                                           strclass);
395 bdemsky  1.1.2.4                 Temp texc=new Temp(q.getFactory().tempFactory());
396 bdemsky  1.1.2.8                 CALL nc=new CALL(q.getFactory(),q,fieldloadmethod,
397 bdemsky  1.1.2.8                                  new Temp[] {tname,t2,tfield,t}, null,texc,
398 bdemsky  1.1.2.4                                  false,false, new Temp[0]);
399 bdemsky  1.1.2.4                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
400 bdemsky  1.1.2.4                 
401 bdemsky  1.1.2.4                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
402 bdemsky  1.1.2.4                 Quad.addEdge(nc,0,phi,0);
403 bdemsky  1.1.2.4                 Quad.addEdge(nc,1,phi,1);
404 bdemsky  1.1.2.4                 Quad.addEdge(q,0,nameconst,0);
405 bdemsky  1.1.2.8                 Quad.addEdge(nameconst,0,cfield,0);
406 bdemsky  1.1.2.8                 Quad.addEdge(cfield,0, nc,0);
407 bdemsky  1.1.2.4             }
408 bdemsky  1.1.2.1         }
409 bdemsky  1.1.2.1 
410 bdemsky  1.1.2.1         public void visit(MOVE q) {
411 bdemsky  1.1.2.1             //Potential Local Variable Assignment
412 bdemsky  1.1.2.1             Temp t=q.dst();
413 bdemsky  1.1.2.4             Temp torig=q.src();
414 bdemsky  1.1.2.4 
415 bdemsky  1.1.2.4             Set possibletypes=ti.getType(new ExactTemp(q,torig));
416 bdemsky  1.1.2.4             boolean couldbeobject=false;
417 bdemsky  1.1.2.4             for(Iterator typeit=possibletypes.iterator();typeit.hasNext();)
418 bdemsky  1.1.2.4                 if (!((HClass)typeit.next()).isPrimitive())
419 bdemsky  1.1.2.4                     couldbeobject=true;
420 bdemsky  1.1.2.1             
421 bdemsky  1.1.2.4             if (couldbeobject) {
422 bdemsky  1.1.2.4                 Temp tname=new Temp(q.getFactory().tempFactory());
423 bdemsky  1.1.2.4                 String name=buildname(q,t);
424 bdemsky  1.1.2.4                 CONST nameconst=new CONST(q.getFactory(), q, tname, name,
425 bdemsky  1.1.2.4                                           strclass);
426 bdemsky  1.1.2.4                 Temp texc=new Temp(q.getFactory().tempFactory());
427 bdemsky  1.1.2.4                 CALL nc=new CALL(q.getFactory(),q,marklocalmethod,
428 bdemsky  1.1.2.4                                  new Temp[] {tname,t}, null,texc,
429 bdemsky  1.1.2.4                                  false,false, new Temp[0]);
430 bdemsky  1.1.2.4                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
431 bdemsky  1.1.2.4                 
432 bdemsky  1.1.2.4                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
433 bdemsky  1.1.2.4                 Quad.addEdge(nc,0,phi,0);
434 bdemsky  1.1.2.4                 Quad.addEdge(nc,1,phi,1);
435 bdemsky  1.1.2.4                 Quad.addEdge(q,0,nameconst,0);
436 bdemsky  1.1.2.4                 Quad.addEdge(nameconst,0, nc,0);
437 bdemsky  1.1.2.4             }
438 bdemsky  1.1.2.1         }
439 bdemsky  1.1.2.1 
440 bdemsky  1.1.2.1         public void visit(CALL q) {
441 bdemsky  1.1.2.1             //Potential Local Variable Assignment
442 bdemsky  1.1.2.1             Temp t=q.retval();
443 bdemsky  1.1.2.4             if ((t!=null)&&(!q.method().getReturnType().isPrimitive())) {
444 bdemsky  1.1.2.1                 Temp tname=new Temp(q.getFactory().tempFactory());
445 bdemsky  1.1.2.4                 String name=buildname(q,t);
446 bdemsky  1.1.2.1                 CONST nameconst=new CONST(q.getFactory(), q, tname, name,
447 bdemsky  1.1.2.1                                           strclass);
448 bdemsky  1.1.2.1                 Temp texc=new Temp(q.getFactory().tempFactory());
449 bdemsky  1.1.2.1                 CALL nc=new CALL(q.getFactory(),q,marklocalmethod,
450 bdemsky  1.1.2.1                                  new Temp[] {tname,t}, null,texc,
451 bdemsky  1.1.2.1                                  false,false, new Temp[0]);
452 bdemsky  1.1.2.1                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
453 bdemsky  1.1.2.1                 
454 bdemsky  1.1.2.1                 Quad.addEdge(phi,0, q.next(0),q.nextEdge(0).which_pred());
455 bdemsky  1.1.2.1                 Quad.addEdge(nc,0,phi,0);
456 bdemsky  1.1.2.1                 Quad.addEdge(nc,1,phi,1);
457 bdemsky  1.1.2.1                 Quad.addEdge(q,0,nameconst,0);
458 bdemsky  1.1.2.1                 Quad.addEdge(nameconst,0, nc,0);
459 bdemsky  1.1.2.1             }
460 bdemsky  1.1.2.1 
461 bdemsky  1.1.2.1             //Potential Local Variable Assignment
462 bdemsky  1.1.2.1             t=q.retex();
463 bdemsky  1.1.2.1             Temp tname=new Temp(q.getFactory().tempFactory());
464 bdemsky  1.1.2.4             String name=buildname(q,t);
465 bdemsky  1.1.2.1             CONST nameconst=new CONST(q.getFactory(), q, tname, name,
466 bdemsky  1.1.2.1                                       strclass);
467 bdemsky  1.1.2.1             Temp texc=new Temp(q.getFactory().tempFactory());
468 bdemsky  1.1.2.1             CALL nc=new CALL(q.getFactory(),q,marklocalmethod,
469 bdemsky  1.1.2.1                              new Temp[] {tname,t}, null,texc,
470 bdemsky  1.1.2.1                              false,false, new Temp[0]);
471 bdemsky  1.1.2.1             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
472 bdemsky  1.1.2.1             
473 bdemsky  1.1.2.1             Quad.addEdge(phi,0, q.next(1),q.nextEdge(1).which_pred());
474 bdemsky  1.1.2.1             Quad.addEdge(nc,0,phi,0);
475 bdemsky  1.1.2.1             Quad.addEdge(nc,1,phi,1);
476 bdemsky  1.1.2.1             Quad.addEdge(q,1,nameconst,0);
477 bdemsky  1.1.2.1             Quad.addEdge(nameconst,0, nc,0);
478 bdemsky  1.1.2.1         }
479 bdemsky  1.1.2.1 
480 bdemsky  1.1.2.1         public void visit(METHOD q) {
481 bdemsky  1.1.2.1             //Method invocation
482 bdemsky  1.1.2.1             //Potential Local Variable Assignment
483 bdemsky  1.1.2.3 
484 bdemsky  1.1.2.3 
485 bdemsky  1.1.2.3             Quad old=null;
486 bdemsky  1.1.2.3             {
487 bdemsky  1.1.2.3                 Temp texc=new Temp(q.getFactory().tempFactory());
488 bdemsky  1.1.2.3                 Temp tmethod=new Temp(q.getFactory().tempFactory());
489 bdemsky  1.1.2.6                 Temp tmethod2=new Temp(q.getFactory().tempFactory());
490 bdemsky  1.1.2.3                 HMethod method=q.getFactory().getMethod();
491 bdemsky  1.1.2.3                 CONST mconst=new CONST(q.getFactory(),q, tmethod, method,
492 bdemsky  1.1.2.3                                        methodclass);
493 bdemsky  1.1.2.6                 CONST sconst=new CONST(q.getFactory(),q, tmethod2, method.isStatic()?new Integer(1):new Integer(0), HClass.Int);
494 bdemsky  1.1.2.3                 CALL cn=new CALL(q.getFactory(), q, invokemethod,
495 bdemsky  1.1.2.6                                  new Temp[]{tmethod,tmethod2}, null, texc,
496 bdemsky  1.1.2.3                                  false, false, new Temp[0]);
497 bdemsky  1.1.2.3                 PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
498 bdemsky  1.1.2.6                 Quad.addEdge(mconst, 0, sconst,0);
499 bdemsky  1.1.2.6                 Quad.addEdge(sconst, 0, cn,0);
500 bdemsky  1.1.2.3                 Quad.addEdge(cn,0,phi,0);
501 bdemsky  1.1.2.3                 Quad.addEdge(cn,1,phi,1);
502 bdemsky  1.1.2.3                 Quad.addEdge(phi,0,q.next(0),q.nextEdge(0).which_pred());
503 bdemsky  1.1.2.3                 Quad.addEdge(q,0,mconst,0);
504 bdemsky  1.1.2.3                 old=phi;
505 bdemsky  1.1.2.3             }
506 bdemsky  1.1.2.3 
507 bdemsky  1.1.2.3             for(int i=0;i<q.paramsLength();i++) {
508 bdemsky  1.1.2.4                 if (((i==0)&&(!hc.getMethod().isStatic()))||(!hc.getMethod().getParameterTypes()[i-(hc.getMethod().isStatic()?0:1)].isPrimitive())) {
509 bdemsky  1.1.2.4                     Temp t=q.params(i);
510 bdemsky  1.1.2.4                     Temp tname=new Temp(q.getFactory().tempFactory());
511 bdemsky  1.1.2.4                     String name=buildname(q,t);
512 bdemsky  1.1.2.4                     CONST nameconst=new CONST(q.getFactory(), q, tname, name,
513 bdemsky  1.1.2.4                                               strclass);
514 bdemsky  1.1.2.4                     Temp texc=new Temp(q.getFactory().tempFactory());
515 bdemsky  1.1.2.4                     CALL nc=new CALL(q.getFactory(),q,marklocalmethod,
516 bdemsky  1.1.2.4                                      new Temp[] {tname,t}, null,texc,
517 bdemsky  1.1.2.4                                      false,false, new Temp[0]);
518 bdemsky  1.1.2.4                     PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
519 bdemsky  1.1.2.4                     
520 bdemsky  1.1.2.4                     Quad.addEdge(phi,0, old.next(0),old.nextEdge(0).which_pred());
521 bdemsky  1.1.2.4                     Quad.addEdge(nc,0,phi,0);
522 bdemsky  1.1.2.4                     Quad.addEdge(nc,1,phi,1);
523 bdemsky  1.1.2.4                     Quad.addEdge(old,0,nameconst,0);
524 bdemsky  1.1.2.4                     Quad.addEdge(nameconst,0, nc,0);
525 bdemsky  1.1.2.4                     old=phi;
526 bdemsky  1.1.2.4                 }
527 bdemsky  1.1.2.3             }
528 bdemsky  1.1.2.1         }
529 bdemsky  1.1.2.1        
530 bdemsky  1.1.2.1         public void visit(RETURN q) {
531 bdemsky  1.1.2.1             //Method return
532 bdemsky  1.1.2.1             Temp texc=new Temp(q.getFactory().tempFactory());
533 bdemsky  1.1.2.6             Temp treturn=null;
534 bdemsky  1.1.2.6             CONST nconst=null;
535 bdemsky  1.1.2.6             if (hc.getMethod().getReturnType().isPrimitive()||q.retval()==null) {
536 bdemsky  1.1.2.6                 treturn=new Temp(q.getFactory().tempFactory());
537 bdemsky  1.1.2.6                 nconst=new CONST(q.getFactory(),q, treturn, null, HClass.Void);
538 bdemsky  1.1.2.6             } else treturn=q.retval();
539 bdemsky  1.1.2.1             CALL nc=new CALL(q.getFactory(),q,returnmethod,
540 bdemsky  1.1.2.6                              new Temp[] {treturn},null,texc,
541 bdemsky  1.1.2.1                              false,false, new Temp[0]);
542 bdemsky  1.1.2.1             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
543 bdemsky  1.1.2.1             Quad.addEdge(nc,0,phi,0);
544 bdemsky  1.1.2.1             Quad.addEdge(nc,1,phi,1);
545 bdemsky  1.1.2.6             if (nconst==null)
546 bdemsky  1.1.2.6                 Quad.addEdge(q.prev(0),q.prevEdge(0).which_succ(), nc,0);
547 bdemsky  1.1.2.6             else {
548 bdemsky  1.1.2.6                 Quad.addEdge(q.prev(0),q.prevEdge(0).which_succ(), nconst,0);
549 bdemsky  1.1.2.6                 Quad.addEdge(nconst,0,nc,0);
550 bdemsky  1.1.2.6             }
551 bdemsky  1.1.2.1             Quad.addEdge(phi,0,q,0);
552 bdemsky  1.1.2.1         }
553 bdemsky  1.1.2.1 
554 bdemsky  1.1.2.1         public void visit(THROW q) {
555 bdemsky  1.1.2.1             //Method return
556 bdemsky  1.1.2.1             Temp texc=new Temp(q.getFactory().tempFactory());
557 bdemsky  1.1.2.1 
558 bdemsky  1.1.2.1             CALL nc=new CALL(q.getFactory(),q,returnmethod,
559 bdemsky  1.1.2.6                              new Temp[]{q.throwable()}, null,texc,
560 bdemsky  1.1.2.1                              false,false, new Temp[0]);
561 bdemsky  1.1.2.1             PHI phi=new PHI(q.getFactory(),q, new Temp[0], 2);
562 bdemsky  1.1.2.1             Quad.addEdge(nc,0,phi,0);
563 bdemsky  1.1.2.1             Quad.addEdge(nc,1,phi,1);
564 bdemsky  1.1.2.1             Quad.addEdge(q.prev(0),q.prevEdge(0).which_succ(), nc,0);
565 bdemsky  1.1.2.1             Quad.addEdge(phi,0,q,0);
566 bdemsky  1.1.2.1         }
567 bdemsky  1.1.2.1     }
568 cananian 1.2     }