1 cananian 1.1.2.1 // LowQuadSSI.java, created Wed Feb 3 16:19:45 1999 by duncan 2 cananian 1.1.2.1 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.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.LowQuad; 5 cananian 1.1.2.1 6 cananian 1.1.2.3 import harpoon.Analysis.AllocationInformationMap; 7 cananian 1.1.2.3 import harpoon.Analysis.Maps.AllocationInformation; 8 cananian 1.1.2.1 import harpoon.Analysis.Maps.Derivation; 9 cananian 1.1.2.1 import harpoon.Analysis.Maps.Derivation.DList; 10 cananian 1.1.2.1 import harpoon.Analysis.Maps.TypeMap; 11 pnkfelix 1.1.2.9 import harpoon.Analysis.Maps.TypeMap.TypeNotKnownException; 12 cananian 1.1.2.1 import harpoon.Backend.Maps.FinalMap; 13 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 14 cananian 1.1.2.1 import harpoon.ClassFile.HCode; 15 cananian 1.1.2.10 import harpoon.ClassFile.HCodeAndMaps; 16 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement; 17 cananian 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 18 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 19 cananian 1.1.2.1 import harpoon.IR.Quads.Quad; 20 cananian 1.1.2.1 import harpoon.IR.Quads.QuadSSI; 21 cananian 1.1.2.4 import harpoon.IR.Quads.SSIRename; 22 cananian 1.1.2.1 import harpoon.IR.Quads.ToNoSSA; 23 cananian 1.1.2.1 import harpoon.Temp.Temp; 24 cananian 1.1.2.1 import harpoon.Util.Util; 25 cananian 1.1.2.1 26 cananian 1.1.2.1 import java.util.HashMap; 27 cananian 1.1.2.1 import java.util.Map; 28 cananian 1.1.2.1 29 cananian 1.1.2.1 /** 30 cananian 1.1.2.1 * The <code>LowQuadSSI</code> codeview exposes a lowquad based 31 cananian 1.1.2.2 * representation in SSI form. 32 cananian 1.1.2.1 33 cananian 1.1.2.1 * @author Duncan Bryce <duncan@lcs.mit.edu> 34 cananian 1.6 * @version $Id: LowQuadSSI.java,v 1.6 2003/03/11 18:22:49 cananian Exp $ 35 cananian 1.1.2.1 */ 36 cananian 1.1.2.1 public class LowQuadSSI extends Code { /*which extends harpoon.IR.Quads.Code*/ 37 cananian 1.1.2.1 /** The name of this code view. */ 38 cananian 1.1.2.8 public static final String codename = "low-quad-ssi"; 39 cananian 1.1.2.1 40 cananian 1.1.2.2 /** Creates a <code>LowQuadSSI</code> object from a <code>QuadSSI</code> 41 cananian 1.1.2.2 * object. */ 42 cananian 1.1.2.12 LowQuadSSI(final harpoon.IR.Quads.Code code) { 43 cananian 1.1.2.1 super(code.getMethod(), null); 44 cananian 1.3.2.1 assert code.getName().equals(QuadSSI.codename); 45 cananian 1.6 final Map<Quad,DList> dT = new HashMap<Quad,DList>(); 46 cananian 1.6 final Map<Quad,HClass> tT = new HashMap<Quad,HClass>(); 47 cananian 1.1.2.1 final TypeMap tym = new harpoon.Analysis.Quads.TypeInfo(code); 48 cananian 1.1.2.1 FinalMap fm = new harpoon.Backend.Maps.DefaultFinalMap(); 49 cananian 1.1.2.3 AllocationInformationMap aim = (code.getAllocationInformation()!=null) 50 cananian 1.1.2.3 ? new AllocationInformationMap() : null; 51 cananian 1.1.2.3 quads = Translate.translate((LowQuadFactory)qf, code, tym, fm, 52 cananian 1.1.2.3 dT, tT, aim); 53 cananian 1.1.2.1 54 cananian 1.1.2.1 final LowQuadFactory lqf = // javac bug workaround to let qf be 55 cananian 1.1.2.1 (LowQuadFactory) qf; // visible in anonymous Derivation below. 56 cananian 1.6 setDerivation(new Derivation<Quad>() { 57 cananian 1.6 public DList derivation(Quad hce, Temp t) { 58 cananian 1.3.2.1 assert hce!=null && t!=null; 59 cananian 1.1.2.1 if (dT.get(t)==null && tT.get(t)==null) 60 cananian 1.1.2.1 throw new TypeNotKnownException(hce, t); 61 cananian 1.6 return dT.get(t); 62 cananian 1.1.2.1 } 63 cananian 1.6 public HClass typeMap(Quad hce, Temp t) { 64 cananian 1.3.2.1 assert lqf.tempFactory()==t.tempFactory(); 65 cananian 1.1.2.1 if (dT.get(t)==null && tT.get(t)==null) 66 cananian 1.1.2.1 throw new TypeNotKnownException(hce, t); 67 cananian 1.6 return tT.get(t); 68 cananian 1.1.2.1 } 69 cananian 1.1.2.7 }); 70 cananian 1.1.2.3 setAllocationInformation(aim); 71 cananian 1.1.2.1 } 72 cananian 1.1.2.1 73 cananian 1.1.2.4 /** Creates a <code>LowQuadSSI</code> object from a 74 cananian 1.1.2.4 * <code>LowQuadNoSSA</code> object. */ 75 bdemsky 1.1.2.5 public LowQuadSSI(final LowQuadNoSSA code) { 76 cananian 1.1.2.4 super(code.getMethod(), null); 77 cananian 1.1.2.6 SSIRename rename = new SSIRename(code, qf); 78 cananian 1.1.2.6 quads = rename.rootQuad; 79 cananian 1.1.2.7 setDerivation(rename.derivation); 80 cananian 1.1.2.6 setAllocationInformation(rename.allocInfo); 81 cananian 1.1.2.4 } 82 cananian 1.1.2.4 83 cananian 1.1.2.1 /** 84 cananian 1.1.2.1 * Create a new code object given a quadruple representation of the 85 cananian 1.1.2.1 * method instructions. 86 cananian 1.1.2.1 */ 87 cananian 1.1.2.1 protected LowQuadSSI(HMethod method, Quad quads) { 88 cananian 1.1.2.1 super(method, quads); 89 cananian 1.1.2.1 } 90 cananian 1.1.2.1 91 cananian 1.1.2.1 /** 92 cananian 1.1.2.1 * Clone this code representation. The clone has its own copy of the 93 cananian 1.1.2.1 * quad graph. 94 cananian 1.1.2.8 * <p><b>WARNING: does not preserve derivation or allocation info.</b> 95 cananian 1.1.2.1 */ 96 cananian 1.5 public HCodeAndMaps<Quad> clone(HMethod newMethod) { 97 cananian 1.1.2.10 return cloneHelper(new LowQuadSSI(newMethod, null)); 98 cananian 1.1.2.1 } 99 cananian 1.1.2.1 100 cananian 1.1.2.1 /** 101 cananian 1.1.2.1 * Return the name of this code view. 102 cananian 1.1.2.8 * @return the string <code>"low-quad-ssi"</code> 103 cananian 1.1.2.1 */ 104 cananian 1.1.2.1 public String getName() { return codename; } 105 cananian 1.1.2.1 106 cananian 1.1.2.1 /** 107 cananian 1.1.2.1 * Return a code factory for <code>LowQuadSSI</code>, given a 108 cananian 1.1.2.1 * code factory for <code>QuadSSI</code>. 109 cananian 1.1.2.1 * <BR> <B>effects:</B> if <code>hcf</code> is a code factory for 110 cananian 1.1.2.8 * <code>QuadSSI</code> or <code>LowQuadNoSSA</code>, then 111 cananian 1.1.2.8 * creates and returns a code factory for <code>LowQuadSSI</code>. 112 cananian 1.1.2.8 * Else passes <code>hcf</code> to 113 cananian 1.1.2.1 * <code>QuadSSI.codeFactory()</code>, and reattempts to 114 cananian 1.1.2.1 * create a code factory for <code>LowQuadSSI</code> from the 115 cananian 1.1.2.1 * code factory returned by <code>QuadSSI</code>. 116 cananian 1.1.2.1 * @see QuadSSI#codeFactory(HCodeFactory) 117 cananian 1.1.2.1 */ 118 cananian 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory hcf) { 119 cananian 1.1.2.11 if (hcf.getCodeName().equals(codename)) return hcf; 120 cananian 1.1.2.1 if (hcf.getCodeName().equals(QuadSSI.codename)) { 121 cananian 1.1.2.1 return new harpoon.ClassFile.SerializableCodeFactory() { 122 cananian 1.1.2.1 public HCode convert(HMethod m) { 123 cananian 1.1.2.12 harpoon.IR.Quads.Code c = (harpoon.IR.Quads.Code) 124 cananian 1.1.2.12 hcf.convert(m); 125 cananian 1.1.2.12 return (c==null) ? null : new LowQuadSSI(c); 126 cananian 1.1.2.4 } 127 cananian 1.1.2.4 public void clear(HMethod m) { hcf.clear(m); } 128 cananian 1.1.2.4 public String getCodeName() { return codename; } 129 cananian 1.1.2.4 }; 130 cananian 1.1.2.4 } else if (hcf.getCodeName().equals(LowQuadNoSSA.codename)) { 131 cananian 1.1.2.4 return new harpoon.ClassFile.SerializableCodeFactory() { 132 cananian 1.1.2.4 public HCode convert(HMethod m) { 133 cananian 1.1.2.4 HCode c = hcf.convert(m); 134 cananian 1.1.2.4 return (c==null) ? null : new LowQuadSSI((LowQuadNoSSA)c); 135 cananian 1.1.2.1 } 136 cananian 1.1.2.1 public void clear(HMethod m) { hcf.clear(m); } 137 cananian 1.1.2.1 public String getCodeName() { return codename; } 138 cananian 1.1.2.1 }; 139 cananian 1.1.2.1 } 140 cananian 1.1.2.1 else { 141 cananian 1.1.2.1 //throw new Error("don't know how to make " + codename + 142 cananian 1.1.2.1 // " from " + hcf.getCodeName()); 143 cananian 1.1.2.1 return codeFactory(QuadSSI.codeFactory(hcf)); 144 cananian 1.1.2.1 } 145 cananian 1.1.2.1 } 146 cananian 1.1.2.1 147 cananian 1.1.2.1 /** 148 cananian 1.1.2.8 * Return a code factory for <code>LowQuadSSI</code>, using the default 149 cananian 1.1.2.8 * code factory for <code>harpoon.IR.Quads.QuadSSI</code> 150 cananian 1.1.2.1 */ 151 cananian 1.1.2.1 public static HCodeFactory codeFactory() { 152 cananian 1.1.2.1 return codeFactory(QuadSSI.codeFactory()); 153 cananian 1.1.2.1 } 154 cananian 1.2 }