1 bdemsky  1.1.2.1  // EDMain.java, created Mon Aug  2 19:41:06 1999 by pnkfelix
  2 bdemsky  1.1.2.1  // Copyright (C) 1999 Felix S. Klock II <pnkfelix@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.Main;
  5 bdemsky  1.1.2.1  
  6 bdemsky  1.1.2.1  import harpoon.ClassFile.CachingCodeFactory;
  7 bdemsky  1.1.2.1  import harpoon.ClassFile.HClass;
  8 bdemsky  1.1.2.1  import harpoon.ClassFile.HCode;
  9 bdemsky  1.1.2.1  import harpoon.ClassFile.HCodeElement;
 10 bdemsky  1.1.2.1  import harpoon.ClassFile.HCodeFactory;
 11 bdemsky  1.1.2.1  import harpoon.ClassFile.HData;
 12 bdemsky  1.1.2.1  import harpoon.ClassFile.HMethod;
 13 bdemsky  1.1.2.1  import harpoon.ClassFile.Linker;
 14 bdemsky  1.1.2.1  import harpoon.ClassFile.Loader;
 15 bdemsky  1.1.2.1  import harpoon.IR.Properties.CFGrapher;
 16 bdemsky  1.1.2.1  import harpoon.IR.Tree.Data;
 17 bdemsky  1.1.2.1  import harpoon.IR.Assem.Instr;
 18 bdemsky  1.1.2.1  import harpoon.IR.Assem.InstrFactory;
 19 bdemsky  1.1.2.1  import harpoon.Temp.Temp;
 20 bdemsky  1.1.2.1  import harpoon.Temp.TempFactory;
 21 bdemsky  1.1.2.1  import harpoon.Analysis.DataFlow.LiveTemps;
 22 bdemsky  1.1.2.1  import harpoon.Analysis.DataFlow.InstrSolver;
 23 bdemsky  1.1.2.1  import harpoon.Analysis.Instr.RegAlloc;
 24 salcianu 1.7      import harpoon.Backend.Backend;
 25 cananian 1.1.2.7  import harpoon.Backend.Generic.Frame;
 26 bdemsky  1.1.2.1  import harpoon.Analysis.BasicBlock;
 27 bdemsky  1.1.2.1  import harpoon.Analysis.ClassHierarchy;
 28 bdemsky  1.1.2.1  import harpoon.Analysis.Quads.CallGraph;
 29 bdemsky  1.1.2.1  import harpoon.Analysis.Quads.CallGraphImpl;
 30 bdemsky  1.1.2.1  import harpoon.Analysis.Quads.QuadClassHierarchy;
 31 bdemsky  1.1.2.1  import harpoon.Backend.Maps.NameMap;
 32 cananian 1.8      import net.cscott.jutil.CombineIterator;
 33 cananian 1.8      import net.cscott.jutil.Default;
 34 bdemsky  1.1.2.1  import harpoon.Util.Util;
 35 bdemsky  1.1.2.1  
 36 bdemsky  1.1.2.1  import gnu.getopt.Getopt;
 37 bdemsky  1.1.2.1  
 38 bdemsky  1.1.2.1  import java.lang.reflect.Modifier;
 39 bdemsky  1.1.2.1  import java.util.Arrays;
 40 bdemsky  1.1.2.1  import java.util.Collection;
 41 bdemsky  1.1.2.1  import java.util.Collections;
 42 bdemsky  1.1.2.1  import java.util.HashSet;
 43 bdemsky  1.1.2.1  import java.util.Iterator;
 44 bdemsky  1.1.2.1  import java.util.List;
 45 bdemsky  1.1.2.1  import java.util.Set;
 46 bdemsky  1.1.2.1  import java.util.TreeSet;
 47 bdemsky  1.1.2.1  import java.io.BufferedInputStream;
 48 bdemsky  1.1.2.1  import java.io.BufferedReader;
 49 bdemsky  1.1.2.1  import java.io.BufferedWriter;
 50 bdemsky  1.1.2.1  import java.io.File;
 51 bdemsky  1.1.2.1  import java.io.FileInputStream;
 52 bdemsky  1.1.2.1  import java.io.FileOutputStream;
 53 bdemsky  1.1.2.1  import java.io.FileWriter;
 54 bdemsky  1.1.2.1  import java.io.InputStream;
 55 bdemsky  1.1.2.1  import java.io.InputStreamReader;
 56 bdemsky  1.1.2.1  import java.io.IOException;
 57 bdemsky  1.1.2.1  import java.io.ObjectInputStream;
 58 bdemsky  1.1.2.1  import java.io.ObjectOutputStream;
 59 bdemsky  1.1.2.1  import java.io.OptionalDataException;
 60 bdemsky  1.1.2.1  import java.io.PrintStream;
 61 bdemsky  1.1.2.1  import java.io.PrintWriter;
 62 cananian 1.1.2.4  import java.io.Serializable;
 63 bdemsky  1.1.2.1  
 64 bdemsky  1.1.2.1  import harpoon.ClassFile.Linker;
 65 bdemsky  1.1.2.1  import harpoon.ClassFile.Loader;
 66 bdemsky  1.1.2.1  import harpoon.ClassFile.Relinker;
 67 bdemsky  1.1.2.1  import harpoon.Analysis.MetaMethods.MetaAllCallers;
 68 bdemsky  1.1.2.1  import harpoon.Analysis.MetaMethods.MetaCallGraph;
 69 bdemsky  1.1.2.1  import harpoon.Analysis.MetaMethods.MetaCallGraphImpl;
 70 bdemsky  1.1.2.1  import harpoon.Analysis.MetaMethods.MetaMethod;
 71 bdemsky  1.1.2.1  import harpoon.Util.BasicBlocks.CachingBBConverter;
 72 cananian 1.1.2.9  import harpoon.Util.Collections.WorkSet;
 73 bdemsky  1.1.2.1  
 74 bdemsky  1.1.2.1  
 75 bdemsky  1.1.2.1  
 76 bdemsky  1.1.2.1  /**
 77 bdemsky  1.1.2.1   * <code>EDMain</code> is a program to compile java classes to some
 78 bdemsky  1.1.2.1   * approximation of StrongARM assembly.  It is for development testing
 79 bdemsky  1.1.2.1   * purposes, not production use.
 80 bdemsky  1.1.2.1   * 
 81 bdemsky  1.1.2.1   * @author  Felix S. Klock II <pnkfelix@mit.edu>
 82 cananian 1.8       * @version $Id: EDMain.java,v 1.8 2004/02/08 01:58:13 cananian Exp $
 83 bdemsky  1.1.2.1   */
 84 bdemsky  1.1.2.1  public class EDMain extends harpoon.IR.Registration {
 85 bdemsky  1.1.2.1   
 86 bdemsky  1.1.2.1      private static boolean PRINT_ORIG = false;
 87 bdemsky  1.1.2.1      private static boolean PRINT_DATA = false;
 88 bdemsky  1.1.2.1      private static boolean PRE_REG_ALLOC = false;
 89 bdemsky  1.1.2.1      private static boolean REG_ALLOC = false;
 90 bdemsky  1.1.2.1      private static boolean HACKED_REG_ALLOC = false;
 91 bdemsky  1.1.2.1      private static boolean LIVENESS_TEST = false;
 92 bdemsky  1.1.2.1      private static boolean OUTPUT_INFO = false;
 93 bdemsky  1.1.2.1      private static boolean QUIET = false;
 94 bdemsky  1.1.2.1      private static boolean OPTIMIZE = false;
 95 bdemsky  1.1.2.1  
 96 bdemsky  1.1.2.1      private static boolean ONLY_COMPILE_MAIN = false; // for testing small stuff
 97 cananian 1.1.2.5      private static String  singleClass = null; // for testing single classes
 98 cananian 1.1.2.7      private static final int STRONGARM_BACKEND = 0;
 99 cananian 1.1.2.7      private static final int MIPS_BACKEND = 1;
100 cananian 1.1.2.7      private static final int SPARC_BACKEND = 2;
101 cananian 1.1.2.7      private static final int PRECISEC_BACKEND = 3;
102 cananian 1.1.2.7      private static int     BACKEND = STRONGARM_BACKEND;
103 cananian 1.6          private static String BACKEND_NAME = "strongarm";
104 bdemsky  1.1.2.1      
105 bdemsky  1.1.2.1      private static java.io.PrintWriter out = 
106 bdemsky  1.1.2.1          new java.io.PrintWriter(System.out, true);
107 bdemsky  1.1.2.1          
108 bdemsky  1.1.2.1      private static String className;
109 bdemsky  1.1.2.1      private static String classHierarchyFilename;
110 bdemsky  1.1.2.1  
111 bdemsky  1.1.2.1      private static String methodName;
112 bdemsky  1.1.2.1  
113 bdemsky  1.1.2.1      private static ClassHierarchy classHierarchy;
114 bdemsky  1.1.2.1      private static CallGraph callGraph;
115 bdemsky  1.1.2.1      private static Frame frame;
116 bdemsky  1.1.2.1  
117 bdemsky  1.1.2.1      private static File ASSEM_DIR = null;
118 bdemsky  1.1.2.1  
119 bdemsky  1.1.2.1      private static boolean recycle=false, optimistic=false;
120 bdemsky  1.1.2.1  
121 bdemsky  1.1.2.1  
122 cananian 1.1.2.4      static class Stage1 implements Serializable {
123 cananian 1.6              String backendName;
124 cananian 1.1.2.5          HMethod mo;
125 cananian 1.1.2.4          Linker linker;
126 cananian 1.1.2.4          HCodeFactory hco;
127 cananian 1.1.2.4          ClassHierarchy chx;
128 cananian 1.6              Stage1(Linker linker, String backendName) {
129 cananian 1.1.2.5              this.linker = linker; this.mo = mo;
130 cananian 1.6                  this.backendName = backendName;
131 cananian 1.1.2.5  
132 cananian 1.3.2.1              assert className!= null : "must pass a class to be compiled";
133 cananian 1.1.2.5  
134 cananian 1.1.2.5              HClass cls = linker.forName(className);
135 cananian 1.1.2.5              HMethod hm[] = cls.getDeclaredMethods();
136 cananian 1.1.2.5              for (int i=0; i<hm.length; i++) {
137 cananian 1.1.2.5                  if (hm[i].getName().equals("main")) {
138 cananian 1.1.2.5                      mo = hm[i];
139 cananian 1.1.2.5                      break;
140 cananian 1.1.2.5                  }
141 cananian 1.1.2.5              }
142 cananian 1.1.2.5  
143 salcianu 1.7                  Frame frame = Backend.getFrame(backendName, mo);
144 salcianu 1.7      
145 cananian 1.1.2.4              hco = 
146 cananian 1.1.2.4                  new harpoon.ClassFile.CachingCodeFactory(harpoon.IR.Quads.QuadNoSSA.codeFactory(), true);
147 cananian 1.1.2.4              
148 cananian 1.1.2.4              Collection cc = new WorkSet();
149 cananian 1.6                  cc.addAll(frame.getRuntime().runtimeCallableMethods());
150 cananian 1.1.2.4              cc.add(mo);
151 cananian 1.1.2.4              System.out.println("Getting ClassHierarchy");
152 cananian 1.1.2.4              chx = new QuadClassHierarchy(linker, cc, hco);
153 cananian 1.1.2.4          }
154 cananian 1.1.2.4      }
155 cananian 1.1.2.4      static class Stage2 implements Serializable {
156 cananian 1.6              String backendName;
157 cananian 1.1.2.5          HMethod mo;
158 cananian 1.1.2.4          Linker linker;
159 cananian 1.1.2.4          HCodeFactory hco;
160 cananian 1.1.2.4          MetaCallGraph mcg;
161 cananian 1.1.2.6          ClassHierarchy chx;
162 cananian 1.1.2.5          Stage2(Stage1 stage1) {
163 cananian 1.6                  backendName = stage1.backendName;
164 cananian 1.1.2.4              linker = stage1.linker;
165 cananian 1.1.2.4              hco = stage1.hco;
166 cananian 1.1.2.6              chx = stage1.chx;//carry forward
167 cananian 1.1.2.5              mo = stage1.mo;
168 cananian 1.1.2.4              CachingBBConverter bbconv=new CachingBBConverter(stage1.hco);
169 cananian 1.1.2.4  
170 salcianu 1.7                  Frame frame = Backend.getFrame(backendName, mo);
171 salcianu 1.7      
172 cananian 1.1.2.4              // costruct the set of all the methods that might be called by 
173 cananian 1.1.2.4              // the JVM (the "main" method plus the methods which are called by
174 cananian 1.1.2.4              // the JVM before main) and next pass it to the MetaCallGraph
175 cananian 1.1.2.4              // constructor. [AS]
176 cananian 1.6                  Set mroots = extract_method_roots
177 cananian 1.6                      (frame.getRuntime().runtimeCallableMethods());
178 cananian 1.1.2.4              mroots.add(mo);
179 cananian 1.1.2.4  
180 salcianu 1.1.2.10             mcg = new MetaCallGraphImpl
181 salcianu 1.5                      (new CachingCodeFactory(hco), linker, stage1.chx, mroots);
182 cananian 1.1.2.4              //using hcf for now!
183 cananian 1.1.2.4          }
184 cananian 1.1.2.4      }
185 cananian 1.1.2.4      static class Stage3 implements Serializable {
186 cananian 1.6              String backendName;
187 cananian 1.1.2.5          HMethod mo;
188 cananian 1.1.2.4          Linker linker;
189 cananian 1.1.2.6          HCodeFactory hcfe;
190 cananian 1.1.2.6          ClassHierarchy ch;
191 cananian 1.1.2.6          MetaCallGraph mcg;
192 cananian 1.1.2.5          Stage3(Stage2 stage2) {
193 cananian 1.6                  backendName = stage2.backendName;
194 cananian 1.1.2.4              linker = stage2.linker;
195 cananian 1.1.2.6              mcg = stage2.mcg;
196 cananian 1.1.2.5              mo = stage2.mo;
197 cananian 1.1.2.4              HCodeFactory ccf=harpoon.IR.Quads.QuadSSI.codeFactory(stage2.hco);
198 cananian 1.1.2.4              System.out.println("Doing CachingCodeFactory");
199 cananian 1.1.2.6              hcfe = new CachingCodeFactory(ccf, true);
200 cananian 1.1.2.4  
201 salcianu 1.7                  Frame frame = Backend.getFrame(backendName, mo);
202 cananian 1.6      
203 cananian 1.1.2.4              Collection c = new WorkSet();
204 cananian 1.6                  c.addAll(frame.getRuntime().runtimeCallableMethods());
205 cananian 1.1.2.4              c.add(mo);
206 cananian 1.1.2.4              System.out.println("Getting ClassHierarchy");
207 cananian 1.1.2.4  
208 cananian 1.1.2.4  
209 cananian 1.1.2.6              ch = new QuadClassHierarchy(linker, c, hcfe);
210 cananian 1.1.2.6              ch = stage2.chx; // discard new ch, use old ch.
211 cananian 1.1.2.4  
212 cananian 1.1.2.4              //  System.out.println("CALLABLE METHODS");
213 cananian 1.1.2.4              //  Iterator iterator=ch.callableMethods().iterator();
214 cananian 1.1.2.4              //  while (iterator.hasNext())
215 cananian 1.1.2.4              //      System.out.println(iterator.next());
216 cananian 1.1.2.4              //System.out.println("Classes");
217 cananian 1.1.2.4              //iterator=ch.classes().iterator();
218 cananian 1.1.2.4              //while (iterator.hasNext())
219 cananian 1.1.2.4              //    System.out.println(iterator.next());
220 cananian 1.1.2.4              //System.out.println("Instantiated Classes");
221 cananian 1.1.2.4              //iterator=ch.instantiatedClasses().iterator();
222 cananian 1.1.2.4              //while (iterator.hasNext())
223 cananian 1.1.2.4              //    System.out.println(iterator.next());
224 cananian 1.1.2.4              //System.out.println("------------------------------------------");
225 cananian 1.1.2.6          }
226 cananian 1.1.2.6      }
227 cananian 1.1.2.6      static class Stage4 implements Serializable {
228 cananian 1.6              String backendName;
229 cananian 1.1.2.6          HMethod mo;
230 cananian 1.1.2.6          Linker linker;
231 cananian 1.1.2.6          HCodeFactory hcf;
232 cananian 1.1.2.6          HMethod mconverted;
233 cananian 1.1.2.6          Stage4(Stage3 stage3) {
234 cananian 1.6                  backendName = stage3.backendName;
235 cananian 1.1.2.6              linker = stage3.linker;
236 cananian 1.1.2.6              mo = stage3.mo;
237 cananian 1.1.2.6              CachingCodeFactory hcfe = (CachingCodeFactory) stage3.hcfe;
238 cananian 1.1.2.4              HCode hc = hcfe.convert(mo);
239 cananian 1.1.2.4              System.out.println("Starting ED");
240 cananian 1.1.2.4  
241 cananian 1.1.2.4              harpoon.Analysis.EventDriven.EventDriven ed = 
242 cananian 1.1.2.6                  new harpoon.Analysis.EventDriven.EventDriven(hcfe, hc, stage3.ch, linker,optimistic,recycle);
243 cananian 1.1.2.6              this.mconverted=ed.convert(stage3.mcg);
244 cananian 1.1.2.4  
245 cananian 1.1.2.4              this.hcf=hcfe;
246 cananian 1.1.2.4  
247 cananian 1.1.2.4              System.out.println("Finished ED");
248 cananian 1.1.2.4          }
249 cananian 1.1.2.4      }
250 cananian 1.1.2.4  
251 cananian 1.1.2.4      static Object load(File f) throws IOException, ClassNotFoundException {
252 cananian 1.1.2.4          Object o = null;
253 cananian 1.1.2.4          System.out.println("Loading "+f+".");
254 cananian 1.1.2.4          ObjectInputStream ois =
255 cananian 1.1.2.4              new ObjectInputStream(new FileInputStream(f));
256 cananian 1.1.2.4          try {
257 cananian 1.1.2.4              o = ois.readObject();
258 cananian 1.1.2.4          } catch (java.io.WriteAbortedException discard) { /* fail */ }
259 cananian 1.1.2.4          ois.close();
260 cananian 1.1.2.4          return o;
261 cananian 1.1.2.4      }
262 cananian 1.1.2.4      static void save(File f, Object o) throws IOException {
263 cananian 1.1.2.4          System.out.println("Saving "+f+".");
264 cananian 1.1.2.4          ObjectOutputStream oos =
265 cananian 1.1.2.4              new ObjectOutputStream(new FileOutputStream(f));
266 cananian 1.1.2.4          oos.writeObject(o);
267 cananian 1.1.2.4          oos.close();
268 cananian 1.1.2.4      }
269 cananian 1.1.2.4  
270 cananian 1.1.2.4      public static void main(String[] args) throws IOException, ClassNotFoundException {
271 cananian 1.1.2.5          Linker linker;
272 bdemsky  1.1.2.1          parseOpts(args);
273 bdemsky  1.1.2.1  
274 cananian 1.1.2.6          File stage4file = new File("stage-4");
275 cananian 1.1.2.6          Stage4 stage4 = null;
276 cananian 1.1.2.6          if (stage4file.exists()) stage4=(Stage4)load(stage4file);
277 cananian 1.1.2.6          if (stage4==null) {
278 cananian 1.1.2.6              File stage3file = new File("stage-3");
279 cananian 1.1.2.6              Stage3 stage3 = null;
280 cananian 1.1.2.6              if (stage3file.exists()) stage3=(Stage3)load(stage3file);
281 cananian 1.1.2.6              if (stage3==null) {
282 cananian 1.1.2.6                  File stage2file = new File("stage-2");
283 cananian 1.1.2.6                  Stage2 stage2 = null;
284 cananian 1.1.2.6                  if (stage2file.exists()) stage2=(Stage2)load(stage2file);
285 cananian 1.1.2.6                  if (stage2==null) {
286 cananian 1.1.2.6                      File stage1file = new File("stage-1");
287 cananian 1.1.2.6                      Stage1 stage1 = null;
288 cananian 1.1.2.6                      if (stage1file.exists()) stage1=(Stage1)load(stage1file);
289 cananian 1.1.2.6                      if (stage1==null) {
290 cananian 1.1.2.6                          linker = new Relinker(Loader.systemLinker);
291 cananian 1.6                              stage1 = new Stage1(linker, BACKEND_NAME); save(stage1file, stage1);
292 cananian 1.1.2.6                      }
293 cananian 1.1.2.6                      // done with stage 1.
294 cananian 1.1.2.6                      stage2 = new Stage2(stage1); save(stage2file, stage2);
295 cananian 1.1.2.4                  }
296 cananian 1.1.2.6                  // done with stage 2.
297 cananian 1.1.2.6                  stage3 = new Stage3(stage2); save(stage3file, stage3);
298 cananian 1.1.2.4              }
299 cananian 1.1.2.6              // done with stage 3.
300 cananian 1.1.2.6              stage4 = new Stage4(stage3); save(stage4file, stage4);
301 cananian 1.1.2.4          }
302 cananian 1.1.2.6          // done with stage 4.
303 cananian 1.1.2.6          linker = stage4.linker;
304 cananian 1.1.2.6          HCodeFactory hcf = stage4.hcf;
305 cananian 1.6              BACKEND_NAME = stage4.backendName;
306 bdemsky  1.1.2.1  
307 bdemsky  1.1.2.1          if (OPTIMIZE) {
308 bdemsky  1.1.2.1              hcf = harpoon.Analysis.Quads.SCC.SCCOptimize.codeFactory(hcf);
309 bdemsky  1.1.2.1          }
310 cananian 1.1.2.4          hcf = new harpoon.ClassFile.CachingCodeFactory(hcf, true);
311 bdemsky  1.1.2.1  
312 bdemsky  1.1.2.1          HClass hcl = linker.forName(className);
313 cananian 1.1.2.5          HMethod[] hm = hcl.getDeclaredMethods();
314 cananian 1.1.2.6          HMethod mainM = stage4.mconverted;
315 bdemsky  1.1.2.1  
316 cananian 1.3.2.1          assert mainM != null : "Class " + className + 
317 cananian 1.3.2.1                      " has no main method";
318 bdemsky  1.1.2.1  
319 cananian 1.6              // set up BACKEND enumeration
320 cananian 1.6              if (BACKEND_NAME == "strongarm")
321 cananian 1.6                  BACKEND = STRONGARM_BACKEND;
322 cananian 1.6              else if (BACKEND_NAME == "sparc")
323 cananian 1.6                  BACKEND = SPARC_BACKEND;
324 cananian 1.6              else if (BACKEND_NAME == "mips")
325 cananian 1.6                  BACKEND = MIPS_BACKEND;
326 cananian 1.6              else if (BACKEND_NAME == "precisec")
327 cananian 1.6                  BACKEND = PRECISEC_BACKEND;
328 cananian 1.6              else throw new Error("Unknown Backend.");
329 salcianu 1.7      
330 salcianu 1.7              // create the target Frame way up here!
331 salcianu 1.7              // the frame specifies the combination of target architecture,
332 salcianu 1.7              // runtime, and allocation strategy we want to use.
333 salcianu 1.7              frame = Backend.getFrame(BACKEND_NAME, mainM);
334 cananian 1.1.2.8  
335 cananian 1.1.2.8          if (classHierarchy == null) {
336 cananian 1.1.2.8              // ask the runtime which roots it requires.
337 cananian 1.1.2.8              Set roots = new java.util.HashSet
338 cananian 1.1.2.8                  (frame.getRuntime().runtimeCallableMethods());
339 cananian 1.1.2.8              // and our main method is a root, too...
340 cananian 1.1.2.8              roots.add(mainM);
341 cananian 1.1.2.8              classHierarchy = new QuadClassHierarchy(linker, roots, hcf);
342 cananian 1.3.2.1              assert classHierarchy != null : "How the hell...";
343 cananian 1.1.2.8          }
344 cananian 1.1.2.8          callGraph = new CallGraphImpl(classHierarchy, hcf);
345 cananian 1.1.2.8          frame.setClassHierarchy(classHierarchy);
346 cananian 1.1.2.8          frame.setCallGraph(callGraph);
347 cananian 1.1.2.8          callGraph=null;// memory management.
348 cananian 1.1.2.8  
349 bdemsky  1.1.2.1          hcf = harpoon.IR.Tree.TreeCode.codeFactory(hcf, frame);
350 bdemsky  1.1.2.1          hcf = frame.getRuntime().nativeTreeCodeFactory(hcf);
351 bdemsky  1.1.2.1          hcf = harpoon.IR.Tree.CanonicalTreeCode.codeFactory(hcf, frame);
352 bdemsky  1.1.2.1          hcf = harpoon.Analysis.Tree.AlgebraicSimplification.codeFactory(hcf);
353 bdemsky  1.1.2.1          //hcf = harpoon.Analysis.Tree.DeadCodeElimination.codeFactory(hcf);
354 bdemsky  1.1.2.1          hcf = harpoon.Analysis.Tree.JumpOptimization.codeFactory(hcf);
355 bdemsky  1.1.2.1          hcf = new harpoon.ClassFile.CachingCodeFactory(hcf);
356 bdemsky  1.1.2.1      
357 cananian 1.1.2.7          HCodeFactory sahcf = frame.getCodeFactory(hcf);
358 bdemsky  1.1.2.1          sahcf = new harpoon.ClassFile.CachingCodeFactory(sahcf);
359 bdemsky  1.1.2.1  
360 bdemsky  1.1.2.1          if (classHierarchyFilename != null) {
361 bdemsky  1.1.2.1              try {
362 bdemsky  1.1.2.1                  ObjectOutputStream mOS = new
363 bdemsky  1.1.2.1                      ObjectOutputStream(new FileOutputStream
364 bdemsky  1.1.2.1                                         (classHierarchyFilename));
365 bdemsky  1.1.2.1                  mOS.writeObject(classHierarchy);
366 bdemsky  1.1.2.1                  mOS.close();
367 bdemsky  1.1.2.1              } catch (IOException e) {
368 bdemsky  1.1.2.1                  System.err.println("Error outputting class "+
369 bdemsky  1.1.2.1                                     "hierarchy to " + 
370 bdemsky  1.1.2.1                                     classHierarchyFilename);
371 bdemsky  1.1.2.1              }
372 bdemsky  1.1.2.1          }
373 bdemsky  1.1.2.1  
374 bdemsky  1.1.2.1          Set methods = classHierarchy.callableMethods();
375 cananian 1.1.2.3          Iterator classes = new TreeSet(classHierarchy.classes()).iterator();
376 bdemsky  1.1.2.1  
377 bdemsky  1.1.2.1  
378 bdemsky  1.1.2.1          if (singleClass!=null || !ONLY_COMPILE_MAIN) {
379 bdemsky  1.1.2.1              while(classes.hasNext()) {
380 bdemsky  1.1.2.1                  HClass hclass = (HClass) classes.next();
381 cananian 1.1.2.5                  if (singleClass!=null && singleClass.equals(hclass.getName()))
382 cananian 1.1.2.5                      continue;
383 bdemsky  1.1.2.1                  messageln("Compiling: " + hclass.getName());
384 bdemsky  1.1.2.1                  
385 bdemsky  1.1.2.1                  try {
386 cananian 1.1.2.8                      String filename = frame.getRuntime().getNameMap().mangle(hclass);
387 bdemsky  1.1.2.1                      out = new PrintWriter
388 bdemsky  1.1.2.1                          (new BufferedWriter
389 bdemsky  1.1.2.1                           (new FileWriter
390 bdemsky  1.1.2.1                            (new File(ASSEM_DIR, filename + ".s"))));
391 bdemsky  1.1.2.1                      
392 bdemsky  1.1.2.1                      HMethod[] hmarray = hclass.getDeclaredMethods();
393 cananian 1.1.2.3                      Set hmset = new TreeSet(Arrays.asList(hmarray));
394 bdemsky  1.1.2.1                      hmset.retainAll(methods);
395 bdemsky  1.1.2.1                      Iterator hms = hmset.iterator();
396 bdemsky  1.1.2.1                      message("\t");
397 bdemsky  1.1.2.1                      while(!hclass.isInterface() && hms.hasNext()) {
398 bdemsky  1.1.2.1                          HMethod m = (HMethod) hms.next();
399 bdemsky  1.1.2.1                          message(m.getName());
400 bdemsky  1.1.2.1                          if (!Modifier.isAbstract(m.getModifiers()))
401 bdemsky  1.1.2.1                              outputMethod(m, hcf, sahcf, out);
402 bdemsky  1.1.2.1                          if (hms.hasNext()) message(", ");
403 bdemsky  1.1.2.1                      }
404 bdemsky  1.1.2.1                      messageln("");
405 bdemsky  1.1.2.1                      
406 bdemsky  1.1.2.1                      out.println();
407 bdemsky  1.1.2.1                      messageln("Writing data for " + hclass.getName());
408 cananian 1.1.2.5                      outputClassData(linker, hclass, out);
409 bdemsky  1.1.2.1                      
410 bdemsky  1.1.2.1                      out.close();
411 bdemsky  1.1.2.1                  } catch (IOException e) {
412 bdemsky  1.1.2.1                      System.err.println("Error outputting class "+
413 bdemsky  1.1.2.1                                         hclass.getName());
414 bdemsky  1.1.2.1                      System.exit(-1);
415 bdemsky  1.1.2.1                  }
416 bdemsky  1.1.2.1              }
417 bdemsky  1.1.2.1              // put a proper makefile in the directory.
418 bdemsky  1.1.2.1              File makefile = new File(ASSEM_DIR, "Makefile");
419 bdemsky  1.1.2.1              InputStream templateStream;
420 bdemsky  1.1.2.1              if (makefile.exists())
421 bdemsky  1.1.2.1                  System.err.println("WARNING: not overwriting pre-existing "+
422 bdemsky  1.1.2.1                                     "file "+makefile);
423 bdemsky  1.1.2.1              else if ((templateStream=ClassLoader.getSystemResourceAsStream
424 bdemsky  1.1.2.1                        ("harpoon/Support/nativecode-makefile.template"))==null)
425 bdemsky  1.1.2.1                  System.err.println("WARNING: can't find Makefile template.");
426 bdemsky  1.1.2.1              else try {
427 bdemsky  1.1.2.1                  BufferedReader in = new BufferedReader
428 bdemsky  1.1.2.1                      (new InputStreamReader(templateStream));
429 bdemsky  1.1.2.1                  out = new PrintWriter
430 bdemsky  1.1.2.1                      (new BufferedWriter(new FileWriter(makefile)));
431 bdemsky  1.1.2.1                  String line;
432 bdemsky  1.1.2.1                  while ((line=in.readLine()) != null)
433 bdemsky  1.1.2.1                      out.println(line);
434 bdemsky  1.1.2.1                  in.close(); out.close();
435 bdemsky  1.1.2.1              } catch (IOException e) {
436 bdemsky  1.1.2.1                  System.err.println("Error writing "+makefile+".");
437 bdemsky  1.1.2.1                  System.exit(-1);
438 bdemsky  1.1.2.1              }
439 bdemsky  1.1.2.1          } else { // ONLY_COMPILE_MAIN
440 bdemsky  1.1.2.1              // hcl is our class
441 bdemsky  1.1.2.1              // mainM is our method
442 bdemsky  1.1.2.1  
443 bdemsky  1.1.2.1              try {
444 cananian 1.1.2.8                  String filename = frame.getRuntime().getNameMap().mangle(hcl);
445 bdemsky  1.1.2.1                  out = new PrintWriter
446 bdemsky  1.1.2.1                      (new BufferedWriter
447 bdemsky  1.1.2.1                       (new FileWriter
448 bdemsky  1.1.2.1                        (new File(ASSEM_DIR, filename + ".s"))));
449 bdemsky  1.1.2.1                  message("\t");
450 bdemsky  1.1.2.1                  message(mainM.getName());
451 bdemsky  1.1.2.1                  outputMethod(mainM, hcf, sahcf, out);
452 bdemsky  1.1.2.1                  messageln("");
453 bdemsky  1.1.2.1  
454 bdemsky  1.1.2.1                  out.println();
455 bdemsky  1.1.2.1                  out.close();
456 bdemsky  1.1.2.1              } catch (IOException e) {
457 bdemsky  1.1.2.1                  System.err.println("Error outputting class "+
458 bdemsky  1.1.2.1                                     hcl.getName());
459 bdemsky  1.1.2.1                  System.exit(-1);
460 bdemsky  1.1.2.1              }
461 bdemsky  1.1.2.1          }
462 bdemsky  1.1.2.1      }
463 bdemsky  1.1.2.1  
464 bdemsky  1.1.2.1      public static void outputMethod(final HMethod hmethod, 
465 bdemsky  1.1.2.1                                      final HCodeFactory hcf,
466 bdemsky  1.1.2.1                                      final HCodeFactory sahcf,
467 bdemsky  1.1.2.1                                      final PrintWriter out) 
468 bdemsky  1.1.2.1          throws IOException {
469 bdemsky  1.1.2.1          if (PRINT_ORIG) {
470 bdemsky  1.1.2.1              HCode hc = hcf.convert(hmethod);
471 bdemsky  1.1.2.1              
472 bdemsky  1.1.2.1              info("\t--- TREE FORM ---");
473 bdemsky  1.1.2.1              if (hc!=null) hc.print(out); 
474 bdemsky  1.1.2.1              else 
475 bdemsky  1.1.2.1                  info("null returned for " + hmethod);
476 bdemsky  1.1.2.1              info("\t--- end TREE FORM ---");
477 bdemsky  1.1.2.1              out.println();
478 bdemsky  1.1.2.1              out.flush();
479 bdemsky  1.1.2.1          }
480 bdemsky  1.1.2.1              
481 bdemsky  1.1.2.1          if (PRE_REG_ALLOC) {
482 bdemsky  1.1.2.1              HCode hc = sahcf.convert(hmethod);
483 bdemsky  1.1.2.1              
484 bdemsky  1.1.2.1              info("\t--- INSTR FORM (no register allocation)  ---");
485 bdemsky  1.1.2.1              if (hc!=null) {
486 bdemsky  1.1.2.1                  info("Codeview \""+hc.getName()+"\" for "+
487 bdemsky  1.1.2.1                       hc.getMethod()+":");
488 bdemsky  1.1.2.1                  hc.print(out);
489 bdemsky  1.1.2.1              } else {
490 bdemsky  1.1.2.1                  info("null returned for " + hmethod);
491 bdemsky  1.1.2.1              } 
492 bdemsky  1.1.2.1              info("\t--- end INSTR FORM (no register allocation)  ---");
493 bdemsky  1.1.2.1              out.println();
494 bdemsky  1.1.2.1              out.flush();
495 bdemsky  1.1.2.1          }
496 bdemsky  1.1.2.1          
497 bdemsky  1.1.2.1          if (LIVENESS_TEST) {
498 bdemsky  1.1.2.1              HCode hc = sahcf.convert(hmethod);
499 bdemsky  1.1.2.1              
500 bdemsky  1.1.2.1              info("\t--- INSTR FORM (basic block check)  ---");
501 bdemsky  1.1.2.1              if (hc != null) {
502 bdemsky  1.1.2.1                  BasicBlock.Factory bbFact = 
503 bdemsky  1.1.2.1                      new BasicBlock.Factory(hc, CFGrapher.DEFAULT);
504 bdemsky  1.1.2.1                  // wrong but makes it compile for now
505 bdemsky  1.1.2.1                  LiveTemps livevars = 
506 bdemsky  1.1.2.1                      new LiveTemps(bbFact, Collections.EMPTY_SET); 
507 bdemsky  1.1.2.1                  InstrSolver.worklistSolver(bbFact.blockSet().iterator(),
508 bdemsky  1.1.2.1                                             livevars);
509 bdemsky  1.1.2.1                  out.println(livevars.dump());
510 bdemsky  1.1.2.1              } else {
511 bdemsky  1.1.2.1                  info("null returned for " + hmethod);
512 bdemsky  1.1.2.1              }
513 bdemsky  1.1.2.1              info("\t--- end INSTR FORM (basic block check)  ---");
514 bdemsky  1.1.2.1              out.flush();
515 bdemsky  1.1.2.1          }
516 bdemsky  1.1.2.1          
517 bdemsky  1.1.2.1          if (REG_ALLOC) {
518 bdemsky  1.1.2.1              HCode hc = sahcf.convert(hmethod);
519 bdemsky  1.1.2.1              
520 bdemsky  1.1.2.1              info("\t--- INSTR FORM (register allocation)  ---");
521 bdemsky  1.1.2.1              HCodeFactory regAllocCF = RegAlloc.codeFactory(sahcf, frame);
522 bdemsky  1.1.2.1              HCode rhc = regAllocCF.convert(hmethod);
523 bdemsky  1.1.2.1              if (rhc != null) {
524 bdemsky  1.1.2.1                  info("Codeview \""+rhc.getName()+"\" for "+
525 bdemsky  1.1.2.1                       rhc.getMethod()+":");
526 bdemsky  1.1.2.1                  rhc.print(out);
527 bdemsky  1.1.2.1              } else {
528 bdemsky  1.1.2.1                  info("null returned for " + hmethod);
529 bdemsky  1.1.2.1              }
530 bdemsky  1.1.2.1              info("\t--- end INSTR FORM (register allocation)  ---");
531 bdemsky  1.1.2.1              out.println();
532 bdemsky  1.1.2.1              out.flush();
533 bdemsky  1.1.2.1          }
534 bdemsky  1.1.2.1  
535 bdemsky  1.1.2.1          if (HACKED_REG_ALLOC) {
536 bdemsky  1.1.2.1              HCode hc = sahcf.convert(hmethod);
537 bdemsky  1.1.2.1              info("\t--- INSTR FORM (hacked register allocation)  ---");
538 bdemsky  1.1.2.1              HCode rhc = (hc==null) ? null :
539 bdemsky  1.1.2.1                  new harpoon.Backend.CSAHack.RegAlloc.Code
540 bdemsky  1.1.2.1                  (hmethod, (Instr) hc.getRootElement(),
541 bdemsky  1.1.2.1                   ((harpoon.IR.Assem.Code)hc).getDerivation(), frame);
542 bdemsky  1.1.2.1              if (rhc != null) {
543 bdemsky  1.1.2.1                  info("Codeview \""+rhc.getName()+"\" for "+
544 bdemsky  1.1.2.1                       rhc.getMethod()+":");
545 bdemsky  1.1.2.1                  rhc.print(out);
546 bdemsky  1.1.2.1              } else {
547 bdemsky  1.1.2.1                  info("null returned for " + hmethod);
548 bdemsky  1.1.2.1              }
549 bdemsky  1.1.2.1              info("\t--- end INSTR FORM (register allocation)  ---");
550 bdemsky  1.1.2.1              out.println();
551 bdemsky  1.1.2.1              out.flush();
552 bdemsky  1.1.2.1          }
553 bdemsky  1.1.2.1  
554 bdemsky  1.1.2.1          // free memory associated with this method's IR:
555 bdemsky  1.1.2.1          hcf.clear(hmethod);
556 bdemsky  1.1.2.1          sahcf.clear(hmethod);
557 bdemsky  1.1.2.1      }
558 bdemsky  1.1.2.1      
559 cananian 1.1.2.5      public static void outputClassData(Linker linker, HClass hclass, PrintWriter out) 
560 bdemsky  1.1.2.1          throws IOException {
561 bdemsky  1.1.2.1        Iterator it=frame.getRuntime().classData(hclass).iterator();
562 bdemsky  1.1.2.1        // output global data with the java.lang.Object class.
563 bdemsky  1.1.2.1        if (hclass==linker.forName("java.lang.Object")) {
564 bdemsky  1.1.2.1            HData data=frame.getLocationFactory().makeLocationData(frame);
565 cananian 1.8                it=new CombineIterator(it, Default.singletonIterator(data));
566 bdemsky  1.1.2.1        }
567 bdemsky  1.1.2.1        while (it.hasNext() ) {
568 bdemsky  1.1.2.1          final Data data = (Data) it.next();
569 bdemsky  1.1.2.1          
570 bdemsky  1.1.2.1          if (PRINT_ORIG) {
571 bdemsky  1.1.2.1              info("\t--- TREE FORM (for DATA)---");
572 bdemsky  1.1.2.1              data.print(out);
573 bdemsky  1.1.2.1              info("\t--- end TREE FORM (for DATA)---");
574 bdemsky  1.1.2.1          }               
575 bdemsky  1.1.2.1          
576 bdemsky  1.1.2.1          if (!PRE_REG_ALLOC && !LIVENESS_TEST && !REG_ALLOC && !HACKED_REG_ALLOC) continue;
577 bdemsky  1.1.2.1  
578 bdemsky  1.1.2.1          if (data.getRootElement()==null) continue; // nothing to do here.
579 bdemsky  1.1.2.1  
580 bdemsky  1.1.2.1          final Instr instr = 
581 bdemsky  1.1.2.1              frame.getCodeGen().genData((harpoon.IR.Tree.Data)data, new InstrFactory() {
582 bdemsky  1.1.2.1                  private int id = 0;
583 bdemsky  1.1.2.1                  public TempFactory tempFactory() { return null; }
584 cananian 1.3.2.2                  public harpoon.IR.Assem.Code getParent() { return null/*data*/; }// FIXME!
585 bdemsky  1.1.2.1                  public harpoon.Backend.Generic.Frame getFrame() { return frame; }
586 bdemsky  1.1.2.1                  public synchronized int getUniqueID() { return id++; }
587 bdemsky  1.1.2.1                  public HMethod getMethod() { return null; }
588 bdemsky  1.1.2.1                  public int hashCode() { return data.hashCode(); }
589 bdemsky  1.1.2.1              });
590 bdemsky  1.1.2.1          
591 cananian 1.3.2.1          assert instr != null : "what the hell...";
592 bdemsky  1.1.2.1          // messageln("First data instruction " + instr);
593 bdemsky  1.1.2.1  
594 bdemsky  1.1.2.1  
595 bdemsky  1.1.2.1          /* trying different method. */
596 bdemsky  1.1.2.1          Instr di = instr; 
597 bdemsky  1.1.2.1          info("\t--- INSTR FORM (for DATA)---");
598 bdemsky  1.1.2.1          while(di!=null) { 
599 bdemsky  1.1.2.1              //messageln("Writing " + di);
600 bdemsky  1.1.2.1              out.println(di); 
601 bdemsky  1.1.2.1              di = di.getNext(); 
602 bdemsky  1.1.2.1          }
603 bdemsky  1.1.2.1          info("\t--- end INSTR FORM (for DATA)---");
604 bdemsky  1.1.2.1        }
605 bdemsky  1.1.2.1      }
606 bdemsky  1.1.2.1  
607 bdemsky  1.1.2.1      private static void message(String msg) {
608 bdemsky  1.1.2.1          if(!QUIET) System.out.print(msg);
609 bdemsky  1.1.2.1      }
610 bdemsky  1.1.2.1  
611 bdemsky  1.1.2.1      private static void messageln(String msg) {
612 bdemsky  1.1.2.1          if(!QUIET) System.out.println(msg);
613 bdemsky  1.1.2.1      }
614 bdemsky  1.1.2.1      
615 bdemsky  1.1.2.1      private static void parseOpts(String[] args) {
616 bdemsky  1.1.2.1  
617 bdemsky  1.1.2.2          Getopt g = new Getopt("EDMain", args, "m:c:o:DOPFHRLArphq1::C:");
618 bdemsky  1.1.2.1          
619 bdemsky  1.1.2.1          int c;
620 bdemsky  1.1.2.1          String arg;
621 bdemsky  1.1.2.1          while((c = g.getopt()) != -1) {
622 bdemsky  1.1.2.1              switch(c) {
623 bdemsky  1.1.2.1              case 'm': // serialized ClassHierarchy
624 bdemsky  1.1.2.1                  arg = g.getOptarg();
625 bdemsky  1.1.2.1                  classHierarchyFilename = arg;
626 bdemsky  1.1.2.1                  try {
627 bdemsky  1.1.2.1                      ObjectInputStream mIS = 
628 bdemsky  1.1.2.1                          new ObjectInputStream
629 bdemsky  1.1.2.1                          (new BufferedInputStream
630 bdemsky  1.1.2.1                           (new FileInputStream(arg)));
631 bdemsky  1.1.2.1                      classHierarchy = (ClassHierarchy) mIS.readObject();
632 bdemsky  1.1.2.1                  } catch (OptionalDataException e) {
633 bdemsky  1.1.2.1                  } catch (ClassNotFoundException e) {
634 bdemsky  1.1.2.1                  } catch (IOException e) {
635 bdemsky  1.1.2.1                      // something went wrong; rebuild the class
636 bdemsky  1.1.2.1                      // hierarchy and write it later.
637 bdemsky  1.1.2.1                      classHierarchy = null;
638 bdemsky  1.1.2.1                      System.err.println("Error reading class "+
639 bdemsky  1.1.2.1                                         "hierarchy from " + 
640 bdemsky  1.1.2.1                                         classHierarchyFilename);
641 bdemsky  1.1.2.1                  }
642 bdemsky  1.1.2.1                  break;
643 bdemsky  1.1.2.1                  
644 bdemsky  1.1.2.1              case 'r':
645 bdemsky  1.1.2.1                  recycle=true;
646 bdemsky  1.1.2.1                  break;
647 bdemsky  1.1.2.1              case 'p':
648 bdemsky  1.1.2.1                  optimistic=true;
649 bdemsky  1.1.2.1                  break;
650 bdemsky  1.1.2.1              case 'D':
651 bdemsky  1.1.2.1                  OUTPUT_INFO = PRINT_DATA = true;
652 bdemsky  1.1.2.1                  break;
653 bdemsky  1.1.2.1              case 'O': 
654 bdemsky  1.1.2.1                  OUTPUT_INFO = PRINT_ORIG = true;
655 bdemsky  1.1.2.1                  break; 
656 bdemsky  1.1.2.1              case 'P':
657 bdemsky  1.1.2.1                  OUTPUT_INFO = PRE_REG_ALLOC = true;
658 bdemsky  1.1.2.1                  break;
659 bdemsky  1.1.2.1              case 'H':
660 bdemsky  1.1.2.1                  HACKED_REG_ALLOC = true;
661 bdemsky  1.1.2.1                  break;
662 bdemsky  1.1.2.1              case 'R':
663 bdemsky  1.1.2.1                  REG_ALLOC = true;
664 bdemsky  1.1.2.1                  break;
665 bdemsky  1.1.2.1              case 'L':
666 bdemsky  1.1.2.1                  OUTPUT_INFO = LIVENESS_TEST = true;
667 bdemsky  1.1.2.1                  break;
668 bdemsky  1.1.2.1              case 'F':
669 bdemsky  1.1.2.1                  OPTIMIZE = true;
670 bdemsky  1.1.2.1                  break;
671 bdemsky  1.1.2.1              case 'A':
672 bdemsky  1.1.2.1                  OUTPUT_INFO = PRE_REG_ALLOC = PRINT_ORIG = 
673 bdemsky  1.1.2.1                      REG_ALLOC = LIVENESS_TEST = true;
674 bdemsky  1.1.2.1                  break;
675 bdemsky  1.1.2.1              case 'o':
676 bdemsky  1.1.2.1                  ASSEM_DIR = new File(g.getOptarg());
677 cananian 1.3.2.1                  assert ASSEM_DIR.isDirectory() : ""+ASSEM_DIR+" must be a directory";
678 bdemsky  1.1.2.1                  break;
679 bdemsky  1.1.2.1              case 'c':
680 bdemsky  1.1.2.1                  className = g.getOptarg();
681 bdemsky  1.1.2.1                  break;
682 bdemsky  1.1.2.1              case 'M':
683 bdemsky  1.1.2.1                  methodName = g.getOptarg();
684 bdemsky  1.1.2.1                  break;
685 bdemsky  1.1.2.1              case 'q':
686 bdemsky  1.1.2.1                  QUIET = true;
687 bdemsky  1.1.2.1                  break;
688 bdemsky  1.1.2.1              case 'C':
689 bdemsky  1.1.2.1              case '1':  
690 bdemsky  1.1.2.1                  String optclassname = g.getOptarg();
691 bdemsky  1.1.2.1                  if (optclassname!=null) {
692 cananian 1.1.2.5                      singleClass = optclassname;
693 bdemsky  1.1.2.1                  } else {
694 bdemsky  1.1.2.1                      ONLY_COMPILE_MAIN = true;
695 bdemsky  1.1.2.1                  }
696 bdemsky  1.1.2.1                  break;
697 bdemsky  1.1.2.1              case '?':
698 bdemsky  1.1.2.1              case 'h':
699 bdemsky  1.1.2.1                  System.out.println(usage);
700 bdemsky  1.1.2.1                  System.out.println();
701 bdemsky  1.1.2.1                  printHelp();
702 bdemsky  1.1.2.1                  System.exit(-1);
703 bdemsky  1.1.2.1              default: 
704 bdemsky  1.1.2.1                  System.out.println("getopt() returned " + c);
705 bdemsky  1.1.2.1                  System.out.println(usage);
706 bdemsky  1.1.2.1                  System.out.println();
707 bdemsky  1.1.2.1                  printHelp();
708 bdemsky  1.1.2.1                  System.exit(-1);
709 bdemsky  1.1.2.1              }
710 bdemsky  1.1.2.1          }
711 bdemsky  1.1.2.1      }
712 bdemsky  1.1.2.1  
713 bdemsky  1.1.2.1      static final String usage = 
714 bdemsky  1.1.2.1          "usage is: [-m <mapfile>] -c <class>"+
715 bdemsky  1.1.2.1          " [-DOPRLAhq] [-o <assembly output directory>]";
716 bdemsky  1.1.2.1  
717 bdemsky  1.1.2.1      private static void printHelp() {
718 bdemsky  1.1.2.1          out.println("-c <class> (required)");
719 bdemsky  1.1.2.1          out.println("\tCompile <class>");
720 bdemsky  1.1.2.1          out.println();
721 bdemsky  1.1.2.1  
722 bdemsky  1.1.2.1          out.println("-m <file> (optional)");
723 bdemsky  1.1.2.1          out.println("\tLoads the ClassHierarchy object from <file>.");
724 bdemsky  1.1.2.1          out.println("\tIn the event of an error loading the object,");
725 bdemsky  1.1.2.1          out.println("\tconstructs a new ClassHierarchy and stores it");
726 bdemsky  1.1.2.1          out.println("\tin <file>");
727 bdemsky  1.1.2.1  
728 bdemsky  1.1.2.1          out.println("-o <dir> (optional)");
729 bdemsky  1.1.2.1          out.println("\tOutputs the program text to files within <dir>.");
730 bdemsky  1.1.2.1          
731 bdemsky  1.1.2.1          out.println("-D");
732 bdemsky  1.1.2.1          out.println("\tOutputs DATA information for <class>");
733 bdemsky  1.1.2.1  
734 bdemsky  1.1.2.1          out.println("-r");
735 bdemsky  1.1.2.1          out.println("\tRecycle continuations");
736 bdemsky  1.1.2.1  
737 bdemsky  1.1.2.1          out.println("-p");
738 bdemsky  1.1.2.1          out.println("\toPtimistic");
739 bdemsky  1.1.2.1  
740 bdemsky  1.1.2.1          out.println("-O");
741 bdemsky  1.1.2.1          out.println("\tOutputs Original Tree IR for <class>");
742 bdemsky  1.1.2.1  
743 bdemsky  1.1.2.1          out.println("-P");
744 bdemsky  1.1.2.1          out.println("\tOutputs Pre-Register Allocated Instr IR for <class>");
745 bdemsky  1.1.2.1  
746 bdemsky  1.1.2.1          out.println("-L");
747 bdemsky  1.1.2.1          out.println("\tOutputs Liveness info for BasicBlocks of Instr IR");
748 bdemsky  1.1.2.1          out.println("\tfor <class>");
749 bdemsky  1.1.2.1  
750 bdemsky  1.1.2.1          out.println("-R");
751 bdemsky  1.1.2.1          out.println("\tOutputs Register Allocated Instr IR for <class>");
752 bdemsky  1.1.2.1  
753 bdemsky  1.1.2.1          out.println("-A");
754 bdemsky  1.1.2.1          out.println("\tSame as -OPLR");
755 bdemsky  1.1.2.1  
756 bdemsky  1.1.2.1          out.println("-q");
757 bdemsky  1.1.2.1          out.println("\tTurns on quiet mode (status messages are not output)");
758 bdemsky  1.1.2.1  
759 bdemsky  1.1.2.1          out.println("-1 <optional class name>"); 
760 bdemsky  1.1.2.1          out.println("\tCompiles only a single method or class.  Without a classname, only compiles main()");
761 bdemsky  1.1.2.1  
762 bdemsky  1.1.2.1          out.println("-h");
763 bdemsky  1.1.2.1          out.println("\tPrints out this help message");
764 bdemsky  1.1.2.1          
765 bdemsky  1.1.2.1      }
766 bdemsky  1.1.2.1      // extract the method roots from the set of all the roots
767 bdemsky  1.1.2.1      // (methods and classes)
768 bdemsky  1.1.2.1      private static Set extract_method_roots(Collection roots){
769 bdemsky  1.1.2.1          Set mroots = new HashSet();
770 bdemsky  1.1.2.1          for(Iterator it = roots.iterator(); it.hasNext(); ){
771 bdemsky  1.1.2.1              Object obj = it.next();
772 bdemsky  1.1.2.1              if(obj instanceof HMethod)
773 bdemsky  1.1.2.1                  mroots.add(obj);
774 bdemsky  1.1.2.1          }
775 bdemsky  1.1.2.1          return mroots;
776 bdemsky  1.1.2.1      }
777 bdemsky  1.1.2.1      private static void info(String str) {
778 bdemsky  1.1.2.1          if(OUTPUT_INFO) out.println(str);
779 bdemsky  1.1.2.1      }
780 cananian 1.2      }