1 cananian 1.1.2.4 // QuadSSA.java, created Fri Aug 7 13:45:29 1998 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.IR.Quads; 5 cananian 1.1.2.1 6 cananian 1.1.2.11 import harpoon.Analysis.AllocationInformationMap; 7 cananian 1.1.2.11 import harpoon.Analysis.Maps.AllocationInformation; 8 cananian 1.1.2.11 import harpoon.Analysis.Quads.DeadCode; 9 cananian 1.1.2.5 import harpoon.ClassFile.HCode; 10 cananian 1.1.2.11 import harpoon.ClassFile.HCodeAndMaps; 11 cananian 1.1.2.5 import harpoon.ClassFile.HCodeFactory; 12 cananian 1.1.2.5 import harpoon.ClassFile.HMethod; 13 cananian 1.1.2.11 import harpoon.Temp.TempMap; 14 cananian 1.1.2.1 import harpoon.Util.Util; 15 cananian 1.1.2.1 16 cananian 1.1.2.11 import java.util.Iterator; 17 cananian 1.1.2.11 import java.util.Map; 18 cananian 1.1.2.1 /** 19 cananian 1.1.2.11 * <code>Quads.QuadSSA</code> is a code view in SSA form. 20 cananian 1.1.2.11 * Quad form exposes the details of 21 cananian 1.1.2.11 * the java classfile bytecodes in a pseudo-quadruple format. Implementation 22 cananian 1.1.2.1 * details of the stack-based JVM are hidden in favor of a flat consistent 23 cananian 1.1.2.1 * temporary-variable based approach. The generated quadruples adhere 24 cananian 1.1.2.1 * to an SSA form; that is, every variable has exactly one definition, 25 cananian 1.1.2.11 * and <code>PHI</code> functions are used where 26 cananian 1.1.2.11 * control flow merges. 27 cananian 1.1.2.1 * 28 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 29 cananian 1.3 * @version $Id: QuadSSA.java,v 1.3 2002/09/01 07:47:20 cananian Exp $ 30 cananian 1.1.2.1 */ 31 cananian 1.1.2.2 public class QuadSSA extends Code /* which extends HCode */ { 32 cananian 1.1.2.1 /** The name of this code view. */ 33 cananian 1.1.2.1 public static final String codename = "quad-ssa"; 34 cananian 1.1.2.1 35 cananian 1.1.2.1 /** Creates a <code>Code</code> object from a bytecode object. */ 36 cananian 1.1.2.12 public QuadSSA(QuadSSI code) 37 cananian 1.1.2.1 { 38 cananian 1.1.2.12 super(code.getMethod(), null); 39 cananian 1.1.2.12 SSIToSSA ssi2ssa = new SSIToSSA(code, qf); 40 cananian 1.1.2.12 quads = ssi2ssa.rootQuad; 41 cananian 1.1.2.12 setAllocationInformation(ssi2ssa.allocInfo); 42 cananian 1.1.2.12 // no derivation in high-quad form. 43 cananian 1.1.2.1 } 44 cananian 1.1.2.9 45 cananian 1.1.2.1 /** 46 cananian 1.1.2.1 * Create a new code object given a quadruple representation 47 cananian 1.1.2.4 * of the method instructions. 48 cananian 1.1.2.1 */ 49 cananian 1.1.2.11 protected QuadSSA(HMethod parent, Quad quads) { 50 cananian 1.1.2.2 super(parent, quads); 51 cananian 1.1.2.1 } 52 cananian 1.1.2.1 53 cananian 1.1.2.1 /** Clone this code representation. The clone has its own 54 cananian 1.1.2.1 * copy of the quad graph. */ 55 cananian 1.3 public HCodeAndMaps<Quad> clone(HMethod newMethod) { 56 cananian 1.1.2.11 return cloneHelper(new QuadSSA(newMethod, null)); 57 cananian 1.1.2.1 } 58 cananian 1.1.2.1 59 cananian 1.1.2.1 /** 60 cananian 1.1.2.1 * Return the name of this code view. 61 cananian 1.1.2.1 * @return the string <code>"quad-ssa"</code>. 62 cananian 1.1.2.1 */ 63 cananian 1.1.2.1 public String getName() { return codename; } 64 cananian 1.1.2.1 65 cananian 1.1.2.7 /** Return a code factory for <code>QuadSSA</code>, given a code 66 cananian 1.1.2.7 * factory for <code>QuadNoSSA</code>. Given a code factory for 67 cananian 1.1.2.7 * <code>Bytecode</code> or <code>QuadWithTry</code>, chain 68 cananian 1.1.2.7 * through <code>QuadNoSSA.codeFactory()</code>. 69 cananian 1.1.2.6 */ 70 cananian 1.1.2.6 public static HCodeFactory codeFactory(final HCodeFactory hcf) { 71 cananian 1.1.2.11 if (hcf.getCodeName().equals(codename)) return hcf; 72 cananian 1.1.2.11 if (hcf.getCodeName().equals(QuadSSI.codename)) { 73 cananian 1.1.2.8 return new harpoon.ClassFile.SerializableCodeFactory() { 74 cananian 1.1.2.6 public HCode convert(HMethod m) { 75 cananian 1.1.2.6 HCode c = hcf.convert(m); 76 cananian 1.1.2.11 return (c==null)?null:new QuadSSA((QuadSSI)c); 77 cananian 1.1.2.6 } 78 cananian 1.1.2.6 public void clear(HMethod m) { hcf.clear(m); } 79 cananian 1.1.2.6 public String getCodeName() { return codename; } 80 cananian 1.1.2.6 }; 81 cananian 1.1.2.7 } else if (hcf.getCodeName().equals(harpoon.IR.Bytecode.Code.codename) 82 cananian 1.1.2.11 || hcf.getCodeName().equals(QuadWithTry.codename) 83 cananian 1.1.2.11 || hcf.getCodeName().equals(QuadNoSSA.codename) 84 cananian 1.1.2.11 || hcf.getCodeName().equals(QuadRSSx.codename)) { 85 cananian 1.1.2.7 // do some implicit chaining. 86 cananian 1.1.2.11 return codeFactory(QuadSSI.codeFactory(hcf)); 87 cananian 1.1.2.6 } else throw new Error("don't know how to make " + codename + 88 cananian 1.1.2.6 " from " + hcf.getCodeName()); 89 cananian 1.1.2.6 } 90 cananian 1.1.2.6 /** Return a code factory for QuadSSA, using the default code factory 91 cananian 1.1.2.11 * for QuadSSI. */ 92 cananian 1.1.2.6 public static HCodeFactory codeFactory() { 93 cananian 1.1.2.11 return codeFactory(QuadSSI.codeFactory()); 94 cananian 1.1.2.1 } 95 cananian 1.2 }