1 kkz 1.1.2.1 // EnvBuilder.java, created Thu Oct 28 22:38:04 1999 by kkz 2 cananian 1.1.2.11 // Copyright (C) 1999 Karen K. Zee <kkz@alum.mit.edu> 3 kkz 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 kkz 1.1.2.1 package harpoon.Analysis.EnvBuilder; 5 kkz 1.1.2.1 6 cananian 1.1.2.3 import harpoon.Analysis.Maps.TypeMap; 7 kkz 1.1.2.1 import harpoon.Analysis.Quads.QuadLiveness; 8 kkz 1.1.2.1 import harpoon.Analysis.Quads.SCC.SCCAnalysis; 9 cananian 1.1.2.7 import harpoon.ClassFile.CachingCodeFactory; 10 kkz 1.1.2.1 import harpoon.ClassFile.HClass; 11 kkz 1.1.2.1 import harpoon.ClassFile.HCode; 12 kkz 1.1.2.1 import harpoon.ClassFile.HCodeElement; 13 kkz 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 14 kkz 1.1.2.1 import harpoon.ClassFile.HConstructor; 15 kkz 1.1.2.1 import harpoon.ClassFile.HField; 16 bdemsky 1.1.2.5 import harpoon.ClassFile.Linker; 17 bdemsky 1.1.2.5 import harpoon.ClassFile.Loader; 18 bdemsky 1.1.2.5 import harpoon.ClassFile.HClassMutator; 19 bdemsky 1.1.2.5 import harpoon.ClassFile.HMethodMutator; 20 bdemsky 1.1.2.9 import harpoon.ClassFile.HMethod; 21 bdemsky 1.1.2.5 22 bdemsky 1.1.2.5 import harpoon.ClassFile.UniqueName; 23 bdemsky 1.1.2.5 24 bdemsky 1.1.2.8 import harpoon.IR.Quads.QuadSSI; 25 kkz 1.1.2.1 import harpoon.Temp.Temp; 26 kkz 1.1.2.1 import harpoon.Util.Util; 27 cananian 1.6 import net.cscott.jutil.WorkSet; 28 kkz 1.1.2.1 29 kkz 1.1.2.1 import java.util.Iterator; 30 kkz 1.1.2.1 import java.util.Set; 31 kkz 1.1.2.1 32 kkz 1.1.2.1 /** 33 kkz 1.1.2.1 * <code>EnvBuilder</code> 34 kkz 1.1.2.1 * 35 cananian 1.1.2.11 * @author Karen K. Zee <kkz@alum.mit.edu> 36 cananian 1.6 * @version $Id: EnvBuilder.java,v 1.6 2004/02/08 01:51:56 cananian Exp $ 37 kkz 1.1.2.1 */ 38 kkz 1.1.2.1 public class EnvBuilder { 39 cananian 1.1.2.7 protected final CachingCodeFactory ucf; 40 kkz 1.1.2.1 protected final HCode hc; 41 kkz 1.1.2.1 protected final HCodeElement hce; 42 kkz 1.1.2.1 protected static int counter = 0; 43 kkz 1.1.2.1 public Temp[] liveout; 44 bdemsky 1.1.2.5 protected final Linker linker; 45 bdemsky 1.1.2.8 protected TypeMap typemap; 46 bdemsky 1.1.2.9 protected boolean recycle; 47 bdemsky 1.1.2.9 48 kkz 1.1.2.1 49 kkz 1.1.2.1 /** Creates a <code>EnvBuilder</code>. Requires that the 50 kkz 1.1.2.1 * <code>HCode</code> and <code>HCodeElement</code> objects 51 kkz 1.1.2.1 * be in quad-no-ssa form because <code>QuadLiveness</code> 52 kkz 1.1.2.1 * works with quad-no-ssa. <code>HCodeFactory</code> must 53 cananian 1.1.2.7 * be an <code>CachingCodeFactory</code>. 54 kkz 1.1.2.1 */ 55 bdemsky 1.1.2.9 public EnvBuilder(CachingCodeFactory ucf, HCode hc, HCodeElement hce, Temp[] lives, Linker linker,TypeMap typemap, boolean recycle) { 56 kkz 1.1.2.1 this.ucf = ucf; 57 kkz 1.1.2.1 this.hc = hc; 58 kkz 1.1.2.1 this.hce = hce; 59 bdemsky 1.1.2.4 this.liveout = lives; 60 bdemsky 1.1.2.5 this.linker=linker; 61 bdemsky 1.1.2.8 this.typemap=typemap; 62 bdemsky 1.1.2.9 this.recycle=recycle; 63 kkz 1.1.2.1 } 64 kkz 1.1.2.1 65 kkz 1.1.2.1 public HClass makeEnv() { 66 kkz 1.1.2.2 System.out.println("Entering EnvBuilder.makeEnv()"); 67 kkz 1.1.2.1 HClass template = null; 68 kkz 1.1.2.1 try { 69 kkz 1.1.2.1 template = 70 bdemsky 1.1.2.5 linker.forName("harpoon.Analysis.EnvBuilder.EnvTemplate"); 71 kkz 1.1.2.1 } catch (NoClassDefFoundError e) { 72 kkz 1.1.2.1 System.err.println("Caught exception " + e.toString() + 73 kkz 1.1.2.1 " in EnvBuilder::makeEnv()"); 74 kkz 1.1.2.1 System.err.println("Cannot find " + 75 kkz 1.1.2.1 "harpoon.Analysis.EnvBuilder.EnvTemplate"); 76 kkz 1.1.2.1 } 77 bdemsky 1.1.2.5 String envName=UniqueName.uniqueClassName("harpoon.Analysis.EnvBuilder.EnvTemplate", linker); 78 bdemsky 1.1.2.5 HClass env = linker.createMutableClass(envName, template); 79 bdemsky 1.1.2.5 HClassMutator envmutator=env.getMutator(); 80 bdemsky 1.1.2.5 81 kkz 1.1.2.1 HConstructor[] c = env.getConstructors(); 82 cananian 1.3.2.1 assert c.length == 1 : "There should be exactly one constructor in " + 83 cananian 1.3.2.1 "synthesized environment class. Found " + c.length; 84 kkz 1.1.2.1 85 bdemsky 1.1.2.5 HConstructor nc = c[0]; 86 bdemsky 1.1.2.5 HMethodMutator ncmutator=nc.getMutator(); 87 kkz 1.1.2.1 88 bdemsky 1.1.2.9 89 bdemsky 1.1.2.9 90 bdemsky 1.1.2.6 int size=0; 91 bdemsky 1.1.2.6 for (int ii=0;ii<liveout.length;ii++) 92 bdemsky 1.1.2.8 if (typemap.typeMap(hce,liveout[ii])!=HClass.Void) 93 bdemsky 1.1.2.6 size++; 94 bdemsky 1.1.2.6 95 bdemsky 1.1.2.6 String[] parameterNames = new String[size]; 96 bdemsky 1.1.2.6 HClass[] parameterTypes = new HClass[size]; 97 bdemsky 1.1.2.6 HField[] fields = new HField[size]; 98 kkz 1.1.2.1 99 kkz 1.1.2.2 System.out.println("Starting SCCAnalysis"); 100 kkz 1.1.2.2 System.out.println("Finished SCCAnalysis"); 101 bdemsky 1.1.2.6 for (int i=0,j=0; i<liveout.length; i++) { 102 bdemsky 1.1.2.8 if (typemap.typeMap(hce,liveout[i])!=HClass.Void) { 103 bdemsky 1.1.2.6 String tempName = liveout[i].name(); 104 bdemsky 1.1.2.8 HClass type = typemap.typeMap(hce, liveout[i]); 105 bdemsky 1.1.2.6 envmutator.addDeclaredField(tempName, type); 106 bdemsky 1.1.2.6 107 bdemsky 1.1.2.6 parameterNames[j] = tempName; 108 bdemsky 1.1.2.6 parameterTypes[j] = type; 109 bdemsky 1.1.2.6 110 bdemsky 1.1.2.6 try { 111 bdemsky 1.1.2.6 fields[j] = env.getField(parameterNames[j]); 112 bdemsky 1.1.2.6 } catch (NoSuchFieldError e) { 113 bdemsky 1.1.2.6 System.err.println("Caught exception " + e.toString() + 114 bdemsky 1.1.2.6 "in harpoon.Analysis.EnvBuilder." + 115 bdemsky 1.1.2.6 "EnvBuilder::makeEnv()"); 116 bdemsky 1.1.2.6 System.err.println("Cannot find synthesized field " + 117 bdemsky 1.1.2.6 parameterNames[i]); 118 bdemsky 1.1.2.6 } 119 bdemsky 1.1.2.6 j++; 120 kkz 1.1.2.1 } 121 kkz 1.1.2.1 } 122 bdemsky 1.1.2.5 ncmutator.setParameterNames(parameterNames); 123 bdemsky 1.1.2.5 ncmutator.setParameterTypes(parameterTypes); 124 bdemsky 1.1.2.9 125 bdemsky 1.1.2.9 HMethod hrecycle=null; 126 bdemsky 1.1.2.9 if (recycle) 127 bdemsky 1.1.2.9 hrecycle=envmutator.addDeclaredMethod("recycle", parameterTypes, 128 bdemsky 1.1.2.9 HClass.Void); 129 bdemsky 1.1.2.9 130 bdemsky 1.1.2.6 131 bdemsky 1.1.2.10 ucf.put(nc, new EnvCode(nc, fields,linker)); 132 bdemsky 1.1.2.9 if (recycle) 133 bdemsky 1.1.2.10 ucf.put(hrecycle,new EnvCode(hrecycle,fields,null)); 134 bdemsky 1.1.2.6 135 kkz 1.1.2.2 System.out.println("Leaving EnvBuilder.makeEnv()"); 136 kkz 1.1.2.1 return env; 137 kkz 1.1.2.1 } 138 kkz 1.1.2.1 139 kkz 1.1.2.1 private String getStringID() { 140 kkz 1.1.2.1 return Integer.toString(counter++); 141 kkz 1.1.2.1 } 142 cananian 1.2 }