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      }