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