1 cananian 1.1.2.1 // QuadRSSx.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.1 import harpoon.Analysis.Quads.DeadCode; 7 cananian 1.1.2.1 import harpoon.ClassFile.HCode; 8 cananian 1.1.2.1 import harpoon.ClassFile.HCodeAndMaps; 9 cananian 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 10 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 11 cananian 1.1.2.1 import harpoon.Util.Util; 12 cananian 1.1.2.1 13 cananian 1.1.2.1 /** 14 cananian 1.1.2.1 * <code>Quads.QuadRSSx</code> is a code view in relaxed SSI form. 15 cananian 1.1.2.1 * Quad form exposes the details of 16 cananian 1.1.2.1 * the java classfile bytecodes in a pseudo-quadruple format. Implementation 17 cananian 1.1.2.1 * details of the stack-based JVM are hidden in favor of a flat consistent 18 cananian 1.1.2.1 * temporary-variable based approach. The generated quadruples adhere 19 cananian 1.1.2.1 * to an QuadNoSSA form (that is, there are no contraints on variable 20 cananian 1.1.2.1 * definitions/re-definitions); but <code>PHI</code> and <code>SIGMA</code> 21 cananian 1.1.2.1 * functions are allowed. <code>PHI</code> and <code>SIGMA</code> nodes 22 cananian 1.1.2.1 * behave semantically as their no-ssa conversion; that is, execution 23 cananian 1.1.2.1 * proceeds as if there were implicit <code>MOVE</code>s on the edges 24 cananian 1.1.2.1 * leading to/coming from the <code>PHI</code>/<code>SIGMA</code> nodes. 25 cananian 1.1.2.1 * 26 cananian 1.1.2.3 * @author Brian Demsky <bdemsky@mit.edu> 27 cananian 1.3 * @version $Id: QuadRSSx.java,v 1.3 2002/09/01 07:47:20 cananian Exp $ 28 cananian 1.1.2.1 */ 29 cananian 1.1.2.1 public class QuadRSSx extends Code /* which extends HCode */ { 30 cananian 1.1.2.1 /** The name of this code view. */ 31 cananian 1.1.2.2 public static final String codename = "relaxed-quad-ssx"; 32 cananian 1.1.2.1 33 cananian 1.1.2.1 /** Creates a <code>Code</code> object from a bytecode object. */ 34 cananian 1.1.2.1 35 cananian 1.1.2.1 /** 36 cananian 1.1.2.1 * Create a new code object given a quadruple representation 37 cananian 1.1.2.1 * of the method instructions. 38 cananian 1.1.2.1 */ 39 cananian 1.1.2.1 protected QuadRSSx(HMethod parent, Quad quads) { 40 cananian 1.1.2.1 super(parent, quads); 41 cananian 1.1.2.1 } 42 cananian 1.1.2.1 43 cananian 1.1.2.1 /** Clone this code representation. The clone has its own 44 cananian 1.1.2.1 * copy of the quad graph. */ 45 cananian 1.3 public HCodeAndMaps<Quad> clone(HMethod newMethod) { 46 cananian 1.1.2.1 return cloneHelper(new QuadRSSx(newMethod, null)); 47 cananian 1.1.2.1 } 48 cananian 1.1.2.1 49 cananian 1.1.2.1 /** 50 cananian 1.1.2.1 * Return the name of this code view. 51 cananian 1.1.2.1 * @return the string <code>"relaxed-quad-ssi"</code>. 52 cananian 1.1.2.1 */ 53 cananian 1.1.2.1 public String getName() { return codename; } 54 cananian 1.1.2.1 55 cananian 1.1.2.1 /** Return a code factory for <code>QuadRSSx</code>, given a code 56 cananian 1.1.2.1 * factory for <code>QuadNoSSA</code> or <code>QuadSSI</code>. 57 cananian 1.1.2.1 */ 58 cananian 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory hcf) { 59 cananian 1.1.2.1 if (hcf.getCodeName().equals(codename)) return hcf; 60 cananian 1.1.2.1 if (hcf.getCodeName().equals(QuadNoSSA.codename) || 61 cananian 1.1.2.4 hcf.getCodeName().equals(QuadSSA.codename) || 62 cananian 1.1.2.1 hcf.getCodeName().equals(QuadSSI.codename)) { 63 cananian 1.1.2.1 return new harpoon.ClassFile.SerializableCodeFactory() { 64 cananian 1.1.2.1 public HCode convert(HMethod m) { 65 cananian 1.1.2.1 Code c = (Code) hcf.convert(m); 66 cananian 1.1.2.4 return (c==null) ? null : 67 cananian 1.1.2.4 c.cloneHelper(new QuadRSSx(m, null)).hcode(); 68 cananian 1.1.2.1 } 69 cananian 1.1.2.1 public void clear(HMethod m) { hcf.clear(m); } 70 cananian 1.1.2.1 public String getCodeName() { return codename; } 71 cananian 1.1.2.1 }; 72 cananian 1.1.2.1 } else throw new Error("don't know how to make " + codename + 73 cananian 1.1.2.1 " from " + hcf.getCodeName()); 74 cananian 1.1.2.1 } 75 cananian 1.2 }