1 bdemsky  1.1.2.1 // JMain.java, created Fri Aug  7 10:22:20 1998 by cananian
  2 bdemsky  1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.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 cananian 1.3     import harpoon.Backend.Generic.Frame;
  7 bdemsky  1.1.2.1 import harpoon.ClassFile.CachingCodeFactory;
  8 bdemsky  1.1.2.1 import harpoon.ClassFile.HClass;
  9 bdemsky  1.1.2.1 import harpoon.ClassFile.HCode;
 10 bdemsky  1.1.2.1 import harpoon.ClassFile.HCodeFactory;
 11 bdemsky  1.1.2.1 import harpoon.ClassFile.HMethod;
 12 cananian 1.1.2.8 import harpoon.ClassFile.Linker;
 13 cananian 1.1.2.8 import harpoon.ClassFile.Loader;
 14 bdemsky  1.1.2.1 import harpoon.IR.Jasmin.Jasmin;
 15 bdemsky  1.1.2.1 
 16 bdemsky  1.1.2.1 import harpoon.Analysis.ClassHierarchy;
 17 bdemsky  1.1.2.1 import harpoon.Analysis.Quads.QuadClassHierarchy;
 18 bdemsky  1.1.2.1 
 19 salcianu 1.4     import harpoon.Backend.Backend;
 20 salcianu 1.4     
 21 bdemsky  1.1.2.1 import java.io.FileWriter;
 22 bdemsky  1.1.2.1 import java.io.IOException;
 23 bdemsky  1.1.2.1 import java.io.PrintWriter;
 24 bdemsky  1.1.2.1 import java.io.PrintStream;
 25 bdemsky  1.1.2.1 import java.io.FileOutputStream;
 26 bdemsky  1.1.2.1 
 27 bdemsky  1.1.2.1 import java.util.Set;
 28 bdemsky  1.1.2.1 import java.util.Iterator;
 29 cananian 1.6     import net.cscott.jutil.WorkSet;
 30 bdemsky  1.1.2.1 
 31 bdemsky  1.1.2.1 /**
 32 bdemsky  1.1.2.1  * <code>JMain</code> is the command-line interface to the compiler.
 33 bdemsky  1.1.2.1  * 
 34 bdemsky  1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 35 cananian 1.6      * @version $Id: JMain.java,v 1.6 2004/02/08 01:58:13 cananian Exp $
 36 bdemsky  1.1.2.1  */
 37 bdemsky  1.1.2.1 public abstract class JMain extends harpoon.IR.Registration {
 38 bdemsky  1.1.2.1 
 39 bdemsky  1.1.2.1     /** The compiler should be invoked with the names of classes to view.
 40 bdemsky  1.1.2.1      *  An optional "-code codename" option allows you to specify which
 41 bdemsky  1.1.2.1      *  codeview to use.
 42 bdemsky  1.1.2.1      */
 43 bdemsky  1.1.2.1     public static void main(String args[]) throws java.io.IOException {
 44 bdemsky  1.1.2.7         boolean minimizemethods=false;
 45 bdemsky  1.1.2.1         java.io.PrintWriter out = new java.io.PrintWriter(System.out, true);
 46 cananian 1.1.2.8         Linker linker = Loader.systemLinker;
 47 bdemsky  1.1.2.1 
 48 bdemsky  1.1.2.1         HCodeFactory hcf1 = // default code factory.
 49 bdemsky  1.1.2.1             harpoon.IR.Quads.QuadNoSSA.codeFactory();
 50 bdemsky  1.1.2.7         hcf1=new harpoon.ClassFile.CachingCodeFactory(hcf1);
 51 bdemsky  1.1.2.1         HCodeFactory hcf=harpoon.IR.Quads.QuadSSI.codeFactory(hcf1);
 52 bdemsky  1.1.2.7 
 53 bdemsky  1.1.2.1         int n=0;  // count # of args/flags processed.
 54 bdemsky  1.1.2.1         for (; n < args.length ; n++) {
 55 bdemsky  1.1.2.1             if (args[n].startsWith("-pass")) {
 56 bdemsky  1.1.2.1                 if (++n >= args.length)
 57 bdemsky  1.1.2.1                     throw new Error("-pass option needs codename");
 58 cananian 1.5                     hcf = Options.cfFromString(args[n], hcf, linker);
 59 bdemsky  1.1.2.1             } else if (args[n].startsWith("-stat")) {
 60 bdemsky  1.1.2.1                 String filename = "./phisig.data";
 61 bdemsky  1.1.2.1                 if (args[n].startsWith("-stat:"))
 62 bdemsky  1.1.2.1                     filename = args[n].substring(6);
 63 bdemsky  1.1.2.1                 try {
 64 bdemsky  1.1.2.1                     Options.statWriter = 
 65 bdemsky  1.1.2.1                         new PrintWriter(new FileWriter(filename), true);
 66 bdemsky  1.1.2.1                 } catch (IOException e) {
 67 bdemsky  1.1.2.1                     throw new Error("Could not open " + filename +
 68 bdemsky  1.1.2.1                                     " for statistics: " + e.toString());
 69 bdemsky  1.1.2.1                 }
 70 bdemsky  1.1.2.7             } else if (args[n].startsWith("-onlycallable")) {
 71 bdemsky  1.1.2.7                 minimizemethods=true;
 72 bdemsky  1.1.2.7             } else if (args[n].startsWith("-help")) {
 73 bdemsky  1.1.2.7                 //be nice to users
 74 bdemsky  1.1.2.7                 System.out.println("Valid options:");
 75 bdemsky  1.1.2.7                 System.out.println("-pass");
 76 bdemsky  1.1.2.7                 System.out.println("-stat/-stat:filename");
 77 bdemsky  1.1.2.7                 System.out.println("-onlycallable");
 78 bdemsky  1.1.2.7                 System.exit(0);
 79 bdemsky  1.1.2.7             }
 80 bdemsky  1.1.2.7             else break; // no more command-line options.
 81 bdemsky  1.1.2.1         }
 82 bdemsky  1.1.2.1         // rest of command-line options are class names.
 83 bdemsky  1.1.2.1 
 84 bdemsky  1.1.2.7         //allow some options to work...
 85 bdemsky  1.1.2.7 
 86 bdemsky  1.1.2.7         hcf=harpoon.IR.Quads.QuadWithTry.codeFactory(hcf);
 87 bdemsky  1.1.2.7 
 88 cananian 1.3             // any frame / any method will do
 89 cananian 1.3             HMethod mainM = linker.forName(args[n])
 90 cananian 1.3                 .getDeclaredMethod("main","([Ljava/lang/String;)V");
 91 salcianu 1.4             Frame frame = Backend.getFrame(Backend.PRECISEC, mainM);
 92 cananian 1.3     
 93 bdemsky  1.1.2.1         WorkSet todo=new WorkSet();
 94 cananian 1.3             WorkSet todor=new WorkSet(frame.getRuntime().runtimeCallableMethods());
 95 bdemsky  1.1.2.1         for (int i=0; i<args.length-n; i++) {
 96 cananian 1.1.2.8             HMethod hmx[]=(linker.forName(args[n+i])).getDeclaredMethods();
 97 bdemsky  1.1.2.4             boolean flag=false;
 98 bdemsky  1.1.2.1             for (int j=0; j<hmx.length; j++) {
 99 bdemsky  1.1.2.1                 if (hmx[j].getName().equalsIgnoreCase("main")) {
100 bdemsky  1.1.2.1                     todo.add(hmx[j]);
101 bdemsky  1.1.2.4                     flag=true;
102 bdemsky  1.1.2.4                 }
103 bdemsky  1.1.2.1             }
104 bdemsky  1.1.2.1         }
105 cananian 1.1.2.8         ClassHierarchy ch1=new QuadClassHierarchy(linker,todo,hcf1);
106 cananian 1.1.2.8         ClassHierarchy ch2=new QuadClassHierarchy(linker,todor,hcf1);
107 bdemsky  1.1.2.1         Set cm1=ch1.callableMethods();
108 bdemsky  1.1.2.1         Set cm2=ch2.callableMethods();
109 bdemsky  1.1.2.6         Set cmx=ch1.classes();
110 bdemsky  1.1.2.6         Iterator iterate=cmx.iterator();
111 bdemsky  1.1.2.6 
112 bdemsky  1.1.2.1         WorkSet classes=new WorkSet();
113 bdemsky  1.1.2.1         while(iterate.hasNext()) {
114 bdemsky  1.1.2.6             HClass cl=(HClass)iterate.next();
115 bdemsky  1.1.2.6             if ((!cl.isPrimitive())&&(!cl.isArray())) {
116 bdemsky  1.1.2.3                 classes.add(cl);
117 bdemsky  1.1.2.6             }
118 bdemsky  1.1.2.1         }
119 bdemsky  1.1.2.1         HClass interfaceClasses[] = new HClass[classes.size()];
120 bdemsky  1.1.2.1         iterate=classes.iterator();
121 bdemsky  1.1.2.1         int index=0;
122 bdemsky  1.1.2.1         System.out.println("Compiling following classes:");
123 bdemsky  1.1.2.1         while (iterate.hasNext()) {
124 bdemsky  1.1.2.1             interfaceClasses[index++]=(HClass)iterate.next();
125 bdemsky  1.1.2.1             System.out.println(interfaceClasses[index-1]);
126 bdemsky  1.1.2.1         }
127 bdemsky  1.1.2.1         
128 bdemsky  1.1.2.1         // Do something intelligent with these classes. XXX
129 bdemsky  1.1.2.1         for (int i=0; i<interfaceClasses.length; i++) {
130 bdemsky  1.1.2.1             HMethod hm1[] = interfaceClasses[i].getDeclaredMethods();
131 bdemsky  1.1.2.1             WorkSet hmo=new WorkSet();
132 bdemsky  1.1.2.6             System.out.println(interfaceClasses[i]+":");
133 bdemsky  1.1.2.1             for (int ind=0;ind<hm1.length;ind++) {
134 bdemsky  1.1.2.7                 //reflection sees a little too commonplace to allow this
135 bdemsky  1.1.2.7                 //sort of thing as a default
136 bdemsky  1.1.2.7                 if (minimizemethods) {
137 bdemsky  1.1.2.7                     if (cm1.contains(hm1[ind])||cm2.contains(hm1[ind])) {
138 bdemsky  1.1.2.7                         hmo.add(hm1[ind]);
139 bdemsky  1.1.2.7                     }
140 bdemsky  1.1.2.7                 } else
141 bdemsky  1.1.2.1                     hmo.add(hm1[ind]);
142 bdemsky  1.1.2.1             }
143 bdemsky  1.1.2.1             HMethod hm[] = new HMethod[hmo.size()];
144 bdemsky  1.1.2.1             Iterator hmiter=hmo.iterator();
145 bdemsky  1.1.2.1             int hindex=0;
146 bdemsky  1.1.2.1             while (hmiter.hasNext()) {
147 bdemsky  1.1.2.1                 hm[hindex++]=(HMethod)hmiter.next();
148 bdemsky  1.1.2.1                 System.out.println(hm[hindex-1]);
149 bdemsky  1.1.2.1             }
150 bdemsky  1.1.2.1 
151 bdemsky  1.1.2.1             HCode hc[] = new HCode[hm.length];
152 bdemsky  1.1.2.1             for (int j=0; j<hm.length; j++) {
153 bdemsky  1.1.2.1                 hc[j] = hcf.convert(hm[j]);
154 bdemsky  1.1.2.1                 if (hc[j]!=null) hc[j].print(out);
155 bdemsky  1.1.2.1             }
156 bdemsky  1.1.2.1             Jasmin jasmin=new Jasmin(hc, hm,interfaceClasses[i]);
157 bdemsky  1.1.2.1             FileOutputStream file;
158 bdemsky  1.1.2.1             if (interfaceClasses.length!=1)
159 bdemsky  1.1.2.1                 file=new FileOutputStream("out"+i+".j");
160 bdemsky  1.1.2.1             else
161 bdemsky  1.1.2.1                 file=new FileOutputStream("out.j");
162 bdemsky  1.1.2.1             PrintStream tempstream=new PrintStream(file);
163 bdemsky  1.1.2.1             jasmin.outputClass(tempstream);
164 bdemsky  1.1.2.1             file.close();
165 bdemsky  1.1.2.1         }
166 bdemsky  1.1.2.1         if (Options.profWriter!=null) Options.profWriter.close();
167 bdemsky  1.1.2.1         if (Options.statWriter!=null) Options.statWriter.close();
168 bdemsky  1.1.2.1         Runtime r=Runtime.getRuntime();
169 bdemsky  1.1.2.1         r.exit(0);
170 bdemsky  1.1.2.1     }
171 cananian 1.2     }