1 cananian 1.1.2.15 // LowQuadNoSSA.java, created Wed Feb 3 1:02:14 1999 by duncan 2 cananian 1.1.2.14 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.edu> 3 cananian 1.1.2.14 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 duncan 1.1.2.1 package harpoon.IR.LowQuad; 5 duncan 1.1.2.1 6 cananian 1.1.2.21 import harpoon.Analysis.Maps.Derivation; 7 duncan 1.1.2.1 import harpoon.ClassFile.HCode; 8 cananian 1.1.2.28 import harpoon.ClassFile.HCodeAndMaps; 9 duncan 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 10 duncan 1.1.2.1 import harpoon.ClassFile.HMethod; 11 duncan 1.1.2.1 import harpoon.IR.Quads.Quad; 12 duncan 1.1.2.2 import harpoon.IR.Quads.ToNoSSA; 13 duncan 1.1.2.1 14 duncan 1.1.2.1 /** 15 duncan 1.1.2.16 * The <code>LowQuadNoSSA</code> codeview exposes a lowquad-based 16 duncan 1.1.2.16 * representation. The distinguishing characteristic of this codeview 17 duncan 1.1.2.16 * is that is not in SSA form. What this means is that, although there 18 duncan 1.1.2.16 * are still PHI and SIGMA quads in this codeview, they do not actually 19 cananian 1.1.2.22 * assign values to temporaries. In other words, PHI and SIGMA nodes 20 cananian 1.1.2.22 * exist solely to indicate flow of control in a program, but they will 21 cananian 1.1.2.22 * always be empty. 22 duncan 1.1.2.1 * 23 duncan 1.1.2.1 * @author Duncan Bryce <duncan@lcs.mit.edu> 24 cananian 1.3 * @version $Id: LowQuadNoSSA.java,v 1.3 2003/03/10 22:19:14 cananian Exp $ 25 duncan 1.1.2.1 */ 26 duncan 1.1.2.16 public class LowQuadNoSSA extends Code {/*which extends harpoon.IR.Quads.Code*/ 27 duncan 1.1.2.16 /** The name of this code view. */ 28 duncan 1.1.2.16 public static final String codename = "low-quad-no-ssa"; 29 duncan 1.1.2.16 30 duncan 1.1.2.16 /** Creates a <code>LowQuadNoSSA</code> object from a LowQuad object */ 31 cananian 1.1.2.23 LowQuadNoSSA(LowQuadSSI code) { 32 duncan 1.1.2.16 super(code.getMethod(), null); 33 duncan 1.1.2.8 34 duncan 1.1.2.16 ToNoSSA translator; 35 duncan 1.1.2.8 36 cananian 1.1.2.29 translator = new ToNoSSA(qf, code, (Derivation)code.getDerivation()); 37 duncan 1.1.2.16 quads = translator.getQuads(); 38 cananian 1.1.2.27 setDerivation(translator.getDerivation()); 39 cananian 1.1.2.25 setAllocationInformation(translator.getAllocationInformation()); 40 duncan 1.1.2.1 } 41 duncan 1.1.2.8 42 duncan 1.1.2.16 /** 43 duncan 1.1.2.16 * Create a new code object given a quadruple representation of the 44 duncan 1.1.2.16 * method instructions. 45 duncan 1.1.2.16 */ 46 bdemsky 1.1.2.26 protected LowQuadNoSSA(HMethod method, Quad quads) { 47 duncan 1.1.2.16 super(method, quads); 48 duncan 1.1.2.16 } 49 duncan 1.1.2.16 50 duncan 1.1.2.16 /** 51 duncan 1.1.2.16 * Clone this code representation. The clone has its own copy of the 52 duncan 1.1.2.16 * quad graph. 53 duncan 1.1.2.16 */ 54 cananian 1.3 public HCodeAndMaps<Quad> clone(HMethod newMethod) { 55 cananian 1.1.2.28 return cloneHelper(new LowQuadNoSSA(newMethod, null)); 56 duncan 1.1.2.16 } 57 duncan 1.1.2.16 58 duncan 1.1.2.16 /** 59 duncan 1.1.2.16 * Return the name of this code view. 60 duncan 1.1.2.16 * @return the string <code>"low-quad-no-ssa"</code> 61 duncan 1.1.2.16 */ 62 duncan 1.1.2.16 public String getName() { return codename; } 63 duncan 1.1.2.16 64 duncan 1.1.2.16 /** 65 duncan 1.1.2.16 * Return a code factory for <code>LowQuadNoSSA</code>, given a 66 cananian 1.1.2.23 * code factory for either <code>LowQuadSSI</code>. 67 duncan 1.1.2.16 * <BR> <B>effects:</B> if <code>hcf</code> is a code factory for 68 cananian 1.1.2.23 * <code>LowQuadSSI</code>, then creates and returns a code 69 duncan 1.1.2.16 * factory for <code>LowQuadNoSSA</code>. Else passes 70 duncan 1.1.2.16 * <code>hcf</code> to 71 cananian 1.1.2.23 * <code>LowQuadSSI.codeFactory()</code>, and reattempts to 72 duncan 1.1.2.16 * create a code factory for <code>LowQuadNoSSA</code> from the 73 cananian 1.1.2.23 * code factory returned by <code>LowQuadSSI</code>. 74 cananian 1.1.2.23 * @see LowQuadSSI#codeFactory(HCodeFactory) 75 duncan 1.1.2.16 */ 76 duncan 1.1.2.16 public static HCodeFactory codeFactory(final HCodeFactory hcf) { 77 cananian 1.1.2.30 if (hcf.getCodeName().equals(codename)) return hcf; 78 cananian 1.1.2.23 if (hcf.getCodeName().equals(LowQuadSSI.codename)) { 79 cananian 1.1.2.17 return new harpoon.ClassFile.SerializableCodeFactory() { 80 duncan 1.1.2.16 public HCode convert(HMethod m) { 81 duncan 1.1.2.16 HCode c = hcf.convert(m); 82 cananian 1.1.2.23 return (c==null) ? null : new LowQuadNoSSA((LowQuadSSI)c); 83 duncan 1.1.2.16 } 84 duncan 1.1.2.16 public void clear(HMethod m) { hcf.clear(m); } 85 duncan 1.1.2.16 public String getCodeName() { return codename; } 86 duncan 1.1.2.16 }; 87 duncan 1.1.2.16 } 88 duncan 1.1.2.16 else { 89 pnkfelix 1.1.2.11 //throw new Error("don't know how to make " + codename + 90 pnkfelix 1.1.2.11 // " from " + hcf.getCodeName()); 91 cananian 1.1.2.23 return codeFactory(LowQuadSSI.codeFactory(hcf)); 92 duncan 1.1.2.1 } 93 duncan 1.1.2.1 } 94 duncan 1.1.2.1 95 duncan 1.1.2.16 /** 96 duncan 1.1.2.16 * Return a code factory for <code>LowQuadNoSSA</code>, using the default 97 cananian 1.1.2.23 * code factory for <code>LowQuadSSI</code> 98 duncan 1.1.2.16 */ 99 duncan 1.1.2.16 public static HCodeFactory codeFactory() { 100 cananian 1.1.2.23 return codeFactory(LowQuadSSI.codeFactory()); 101 duncan 1.1.2.1 } 102 cananian 1.2 }