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      }