1 cananian 1.1.2.28 // LowQuadSSA.java, created Wed May 31 16:18:58 2000 by cananian
 2 cananian 1.1.2.28 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.16 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.17 package harpoon.IR.LowQuad;
 5 duncan   1.1.2.1  
 6 duncan   1.1.2.7  import harpoon.ClassFile.HClass;
 7 duncan   1.1.2.1  import harpoon.ClassFile.HCode;
 8 cananian 1.1.2.29 import harpoon.ClassFile.HCodeAndMaps;
 9 cananian 1.1.2.5  import harpoon.ClassFile.HCodeElement;
10 duncan   1.1.2.1  import harpoon.ClassFile.HCodeFactory;
11 duncan   1.1.2.1  import harpoon.ClassFile.HMethod;
12 cananian 1.1.2.28 import harpoon.IR.Quads.SSIToSSA;
13 duncan   1.1.2.1  import harpoon.IR.Quads.Quad;
14 cananian 1.1.2.21 import harpoon.IR.Quads.QuadSSI;
15 duncan   1.1.2.1  /**
16 cananian 1.1.2.28  * The <code>LowQuadSSA</code> codeview exposes a lowquad based
17 cananian 1.1.2.28  * representation in SSA form.
18 cananian 1.1.2.28  * 
19 cananian 1.1.2.28  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
20 cananian 1.3       * @version $Id: LowQuadSSA.java,v 1.3 2003/03/10 22:19:15 cananian Exp $
21 duncan   1.1.2.1   */
22 cananian 1.1.2.28 public class LowQuadSSA extends Code /*which extends harpoon.IR.Quads.Code*/ {
23 duncan   1.1.2.18     /** The name of this code view. */
24 cananian 1.1.2.28     public static final String codename = "low-quad-ssa";
25 cananian 1.1.2.28     
26 cananian 1.1.2.28     /** Creates a <code>LowQuadSSA</code> object from a
27 cananian 1.1.2.28      *  <code>LowQuadSSI</code> object. */
28 cananian 1.1.2.28     public LowQuadSSA(final LowQuadSSI code) {
29 cananian 1.1.2.28         super(code.getMethod(), null);
30 cananian 1.1.2.28         SSIToSSA ssi2ssa = new SSIToSSA(code, qf);
31 cananian 1.1.2.28         quads = ssi2ssa.rootQuad;
32 cananian 1.1.2.28         setDerivation(ssi2ssa.derivation);
33 cananian 1.1.2.28         setAllocationInformation(ssi2ssa.allocInfo);
34 duncan   1.1.2.1      }
35 duncan   1.1.2.4  
36 duncan   1.1.2.18     /**
37 duncan   1.1.2.18      * Create a new code object given a quadruple representation of the
38 duncan   1.1.2.18      * method instructions.
39 duncan   1.1.2.18      */
40 duncan   1.1.2.18     protected LowQuadSSA(HMethod method, Quad quads) {
41 cananian 1.1.2.28         super(method, quads);
42 cananian 1.1.2.28         setDerivation(null);
43 cananian 1.1.2.28         setAllocationInformation(null);
44 duncan   1.1.2.18     }
45 duncan   1.1.2.18 
46 duncan   1.1.2.18     /**
47 duncan   1.1.2.18      * Clone this code representation.  The clone has its own copy of the
48 duncan   1.1.2.18      * quad graph.
49 cananian 1.1.2.28      * <p><b>WARNING: does not preserve derivation or allocation info.</b>
50 duncan   1.1.2.18      */
51 cananian 1.3          public HCodeAndMaps<Quad> clone(HMethod newMethod) {
52 cananian 1.1.2.29         return cloneHelper(new LowQuadSSA(newMethod, null));
53 duncan   1.1.2.18     }
54 duncan   1.1.2.18 
55 duncan   1.1.2.18     /**
56 duncan   1.1.2.18      * Return the name of this code view.
57 duncan   1.1.2.18      * @return the string <code>"low-quad-ssa"</code>
58 duncan   1.1.2.18      */
59 duncan   1.1.2.18     public String getName() { return codename; }
60 duncan   1.1.2.18 
61 duncan   1.1.2.18     /**
62 duncan   1.1.2.18      * Return a code factory for <code>LowQuadSSA</code>, given a 
63 cananian 1.1.2.28      * code factory for <code>LowQuadSSI</code>.
64 duncan   1.1.2.18      * <BR> <B>effects:</B> if <code>hcf</code> is a code factory for
65 cananian 1.1.2.28      *      <code>LowQuadSSI</code>, then creates and returns a code
66 duncan   1.1.2.18      *      factory for <code>LowQuadSSA</code>.  Else passes
67 duncan   1.1.2.18      *      <code>hcf</code> to
68 cananian 1.1.2.28      *      <code>LowQuadSSI.codeFactory()</code>, and reattempts to
69 duncan   1.1.2.18      *      create a code factory for <code>LowQuadSSA</code> from the
70 cananian 1.1.2.28      *      code factory returned by <code>LowQuadSSI</code>.
71 cananian 1.1.2.28      * @see LowQuadSSI#codeFactory(HCodeFactory)
72 duncan   1.1.2.18      */
73 duncan   1.1.2.18     public static HCodeFactory codeFactory(final HCodeFactory hcf) {
74 cananian 1.1.2.30         if (hcf.getCodeName().equals(codename)) return hcf;
75 cananian 1.1.2.28         if (hcf.getCodeName().equals(LowQuadSSI.codename)) {
76 cananian 1.1.2.28             return new harpoon.ClassFile.SerializableCodeFactory() {
77 cananian 1.1.2.28                 public HCode convert(HMethod m) {
78 cananian 1.1.2.28                     HCode c = hcf.convert(m);
79 cananian 1.1.2.28                     return (c==null) ? null : new LowQuadSSA((LowQuadSSI)c);
80 cananian 1.1.2.28                 }
81 cananian 1.1.2.28                 public void clear(HMethod m) { hcf.clear(m); }
82 cananian 1.1.2.28                 public String getCodeName() { return codename; }
83 cananian 1.1.2.28             };
84 cananian 1.1.2.28         } else {
85 cananian 1.1.2.28             return codeFactory(LowQuadSSI.codeFactory(hcf));
86 cananian 1.1.2.28         }
87 duncan   1.1.2.1      }
88 duncan   1.1.2.1    
89 duncan   1.1.2.18     /**
90 cananian 1.1.2.28      * Return a code factory for <code>LowQuadSSA</code>, using the default
91 cananian 1.1.2.28      * code factory for <code>LowQuadSSI</code>
92 duncan   1.1.2.18      */
93 duncan   1.1.2.18     public static HCodeFactory codeFactory() {  
94 cananian 1.1.2.28         return codeFactory(LowQuadSSI.codeFactory());
95 duncan   1.1.2.18     }
96 cananian 1.2      }