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 }