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 }