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      }