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      }