1 cananian 1.1.2.1 // Run.java, created Mon Dec 28 02:34:11 1998 by cananian 2 cananian 1.1.2.8 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.8 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Main; 5 cananian 1.1.2.1 6 cananian 1.1.2.5 import harpoon.ClassFile.CachingCodeFactory; 7 cananian 1.1.2.4 import harpoon.ClassFile.HClass; 8 cananian 1.1.2.4 import harpoon.ClassFile.HCode; 9 cananian 1.1.2.4 import harpoon.ClassFile.HCodeFactory; 10 cananian 1.1.2.4 import harpoon.ClassFile.HMethod; 11 cananian 1.1.2.11 import harpoon.ClassFile.Linker; 12 cananian 1.1.2.11 import harpoon.ClassFile.Loader; 13 cananian 1.1.2.9 import harpoon.ClassFile.SerializableCodeFactory; 14 cananian 1.1.2.1 import harpoon.Interpret.Quads.Method; 15 cananian 1.1.2.5 import harpoon.IR.Quads.QuadWithTry; 16 cananian 1.1.2.1 17 cananian 1.1.2.3 import java.io.FileOutputStream; 18 cananian 1.1.2.7 import java.io.FileWriter; 19 cananian 1.1.2.3 import java.io.IOException; 20 cananian 1.1.2.3 import java.io.PrintWriter; 21 cananian 1.1.2.3 import java.util.zip.GZIPOutputStream; 22 cananian 1.1.2.4 23 cananian 1.1.2.1 /** 24 cananian 1.1.2.1 * <code>Run</code> invokes the interpreter. 25 cananian 1.1.2.1 * 26 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 27 cananian 1.3 * @version $Id: Run.java,v 1.3 2003/07/10 02:01:38 cananian Exp $ 28 cananian 1.1.2.1 */ 29 cananian 1.1.2.1 public abstract class Run extends harpoon.IR.Registration { 30 cananian 1.1.2.9 public static void main(String args[]) throws IOException { 31 cananian 1.1.2.9 java.io.InputStream startup = null; 32 cananian 1.1.2.9 java.io.OutputStream dump = null; 33 cananian 1.1.2.12 boolean trace=true; 34 cananian 1.1.2.11 Linker linker = Loader.systemLinker; 35 cananian 1.1.2.6 HCodeFactory hf = // default code factory. 36 cananian 1.1.2.10 harpoon.IR.Quads.QuadWithTry.codeFactory(); 37 cananian 1.1.2.3 int i=0; // count # of args/flags processed. 38 cananian 1.1.2.6 // check for "-prof" and "-code" flags in arg[i] 39 cananian 1.1.2.6 for (; i < args.length ; i++) { 40 cananian 1.1.2.10 if (args[i].startsWith("-pass")) { 41 cananian 1.1.2.6 if (++i < args.length) 42 cananian 1.3 hf = Options.cfFromString(args[i], hf, linker); 43 cananian 1.1.2.10 else throw new Error("-pass option needs codename"); 44 cananian 1.1.2.6 } else if (args[i].startsWith("-prof")) { 45 cananian 1.1.2.6 String filename = "./java.prof"; 46 cananian 1.1.2.6 if (args[i].startsWith("-prof:")) 47 cananian 1.1.2.6 filename = args[i].substring(6); 48 cananian 1.1.2.6 try { 49 cananian 1.1.2.6 FileOutputStream fos = new FileOutputStream(filename); 50 cananian 1.1.2.7 Options.profWriter = 51 cananian 1.1.2.7 new PrintWriter(new GZIPOutputStream(fos)); 52 cananian 1.1.2.6 } catch (IOException e) { 53 cananian 1.1.2.6 throw new Error("Could not open " + filename + 54 cananian 1.1.2.6 " for profiling: "+ e.toString()); 55 cananian 1.1.2.6 } 56 cananian 1.1.2.7 } else if (args[i].startsWith("-stat")) { 57 cananian 1.1.2.7 String filename = "./phisig.data"; 58 cananian 1.1.2.7 if (args[i].startsWith("-stat:")) 59 cananian 1.1.2.7 filename = args[i].substring(6); 60 cananian 1.1.2.7 try { 61 cananian 1.1.2.7 Options.statWriter = 62 cananian 1.1.2.7 new PrintWriter(new FileWriter(filename), true); 63 cananian 1.1.2.7 } catch (IOException e) { 64 cananian 1.1.2.7 throw new Error("Could not open " + filename + 65 cananian 1.1.2.7 " for statistics: " + e.toString()); 66 cananian 1.1.2.7 } 67 cananian 1.1.2.9 } else if (args[i].startsWith("-startup")) { 68 cananian 1.1.2.9 String filename = "./startup-dump"; 69 cananian 1.1.2.9 if (args[i].startsWith("-startup:")) 70 cananian 1.1.2.9 filename = args[i].substring(9); 71 cananian 1.1.2.9 try { 72 cananian 1.1.2.9 startup = new java.io.FileInputStream(filename); 73 cananian 1.1.2.9 } catch (IOException e) { 74 cananian 1.1.2.9 throw new Error("Could not open " + filename + 75 cananian 1.1.2.9 " for startup: " + e.toString()); 76 cananian 1.1.2.9 } 77 cananian 1.1.2.9 } else if (args[i].startsWith("-dump")) { 78 cananian 1.1.2.9 String filename = "./startup-dump"; 79 cananian 1.1.2.9 if (args[i].startsWith("-dump:")) 80 cananian 1.1.2.9 filename = args[i].substring(6); 81 cananian 1.1.2.9 try { 82 cananian 1.1.2.9 dump = new java.io.FileOutputStream(filename); 83 cananian 1.1.2.9 } catch (IOException e) { 84 cananian 1.1.2.9 throw new Error("Could not open " + filename + 85 cananian 1.1.2.9 " for dump: " + e.toString()); 86 cananian 1.1.2.9 } 87 cananian 1.1.2.12 } else if (args[i].startsWith("-q")) { // for -quiet 88 cananian 1.1.2.12 trace=false; 89 cananian 1.1.2.6 } else break; // no more command-line options. 90 cananian 1.1.2.3 } 91 cananian 1.1.2.9 if (dump!=null) { // make quick-startup dump. 92 cananian 1.1.2.12 harpoon.Interpret.Quads.Method.makeStartup(linker, hf, dump, 93 cananian 1.1.2.12 trace); 94 cananian 1.1.2.9 return; 95 cananian 1.1.2.9 } 96 cananian 1.1.2.3 // arg[i] is class name. Load its main method. 97 cananian 1.1.2.3 if (args.length < i) throw new Error("No class name."); 98 cananian 1.1.2.11 HClass cls = linker.forName(args[i]); 99 cananian 1.1.2.3 i++; 100 cananian 1.1.2.6 // construct caching code factory. 101 cananian 1.1.2.9 final HCodeFactory hf0 = hf; 102 cananian 1.1.2.9 hf = new CachingCodeFactory(new SerializableCodeFactory() { 103 cananian 1.1.2.9 public String getCodeName() { return hf0.getCodeName(); } 104 cananian 1.1.2.9 public HCode convert(HMethod m) { return hf0.convert(m); } 105 cananian 1.1.2.9 public void clear(HMethod m) { /* don't clear. */ } 106 cananian 1.1.2.9 }); 107 cananian 1.1.2.3 //////////// now call interpreter with truncated args list. 108 cananian 1.1.2.3 String[] params = new String[args.length-i]; 109 cananian 1.1.2.3 System.arraycopy(args, i, params, 0, params.length); 110 cananian 1.1.2.9 if (startup!=null) 111 cananian 1.1.2.9 harpoon.Interpret.Quads.Method.run(Options.profWriter, 112 cananian 1.1.2.12 hf, cls, params, startup, 113 cananian 1.1.2.12 trace); 114 cananian 1.1.2.9 else 115 cananian 1.1.2.9 harpoon.Interpret.Quads.Method.run(Options.profWriter, 116 cananian 1.1.2.12 hf, cls, params, trace); 117 cananian 1.1.2.7 if (Options.profWriter!=null) Options.profWriter.close(); 118 cananian 1.1.2.7 if (Options.statWriter!=null) Options.statWriter.close(); 119 cananian 1.1.2.1 } 120 cananian 1.2 }