1 cananian 1.1.2.4  // QuadSSA.java, created Fri Aug  7 13:45:29 1998 by cananian
 2 cananian 1.1.2.1  // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.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.Quads;
 5 cananian 1.1.2.1  
 6 cananian 1.1.2.11 import harpoon.Analysis.AllocationInformationMap;
 7 cananian 1.1.2.11 import harpoon.Analysis.Maps.AllocationInformation;
 8 cananian 1.1.2.11 import harpoon.Analysis.Quads.DeadCode;
 9 cananian 1.1.2.5  import harpoon.ClassFile.HCode;
10 cananian 1.1.2.11 import harpoon.ClassFile.HCodeAndMaps;
11 cananian 1.1.2.5  import harpoon.ClassFile.HCodeFactory;
12 cananian 1.1.2.5  import harpoon.ClassFile.HMethod;
13 cananian 1.1.2.11 import harpoon.Temp.TempMap;
14 cananian 1.1.2.1  import harpoon.Util.Util;
15 cananian 1.1.2.1  
16 cananian 1.1.2.11 import java.util.Iterator;
17 cananian 1.1.2.11 import java.util.Map;
18 cananian 1.1.2.1  /**
19 cananian 1.1.2.11  * <code>Quads.QuadSSA</code> is a code view in SSA form.
20 cananian 1.1.2.11  * Quad form exposes the details of
21 cananian 1.1.2.11  * the java classfile bytecodes in a pseudo-quadruple format.  Implementation
22 cananian 1.1.2.1   * details of the stack-based JVM are hidden in favor of a flat consistent
23 cananian 1.1.2.1   * temporary-variable based approach.  The generated quadruples adhere
24 cananian 1.1.2.1   * to an SSA form; that is, every variable has exactly one definition,
25 cananian 1.1.2.11  * and <code>PHI</code> functions are used where
26 cananian 1.1.2.11  * control flow merges.
27 cananian 1.1.2.1   * 
28 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
29 cananian 1.3       * @version $Id: QuadSSA.java,v 1.3 2002/09/01 07:47:20 cananian Exp $
30 cananian 1.1.2.1   */
31 cananian 1.1.2.2  public class QuadSSA extends Code /* which extends HCode */ {
32 cananian 1.1.2.1      /** The name of this code view. */
33 cananian 1.1.2.1      public static final String codename = "quad-ssa";
34 cananian 1.1.2.1  
35 cananian 1.1.2.1      /** Creates a <code>Code</code> object from a bytecode object. */
36 cananian 1.1.2.12     public QuadSSA(QuadSSI code) 
37 cananian 1.1.2.1      {
38 cananian 1.1.2.12         super(code.getMethod(), null);
39 cananian 1.1.2.12         SSIToSSA ssi2ssa = new SSIToSSA(code, qf);
40 cananian 1.1.2.12         quads = ssi2ssa.rootQuad;
41 cananian 1.1.2.12         setAllocationInformation(ssi2ssa.allocInfo);
42 cananian 1.1.2.12         // no derivation in high-quad form.
43 cananian 1.1.2.1      }
44 cananian 1.1.2.9  
45 cananian 1.1.2.1      /** 
46 cananian 1.1.2.1       * Create a new code object given a quadruple representation
47 cananian 1.1.2.4       * of the method instructions.
48 cananian 1.1.2.1       */
49 cananian 1.1.2.11     protected QuadSSA(HMethod parent, Quad quads) {
50 cananian 1.1.2.2          super(parent, quads);
51 cananian 1.1.2.1      }
52 cananian 1.1.2.1  
53 cananian 1.1.2.1      /** Clone this code representation. The clone has its own
54 cananian 1.1.2.1       *  copy of the quad graph. */
55 cananian 1.3          public HCodeAndMaps<Quad> clone(HMethod newMethod) {
56 cananian 1.1.2.11         return cloneHelper(new QuadSSA(newMethod, null));
57 cananian 1.1.2.1      }
58 cananian 1.1.2.1  
59 cananian 1.1.2.1      /**
60 cananian 1.1.2.1       * Return the name of this code view.
61 cananian 1.1.2.1       * @return the string <code>"quad-ssa"</code>.
62 cananian 1.1.2.1       */
63 cananian 1.1.2.1      public String getName() { return codename; }
64 cananian 1.1.2.1      
65 cananian 1.1.2.7      /** Return a code factory for <code>QuadSSA</code>, given a code
66 cananian 1.1.2.7       *  factory for <code>QuadNoSSA</code>.  Given a code factory for
67 cananian 1.1.2.7       *  <code>Bytecode</code> or <code>QuadWithTry</code>, chain
68 cananian 1.1.2.7       *  through <code>QuadNoSSA.codeFactory()</code>.
69 cananian 1.1.2.6       */
70 cananian 1.1.2.6      public static HCodeFactory codeFactory(final HCodeFactory hcf) {
71 cananian 1.1.2.11         if (hcf.getCodeName().equals(codename)) return hcf;
72 cananian 1.1.2.11         if (hcf.getCodeName().equals(QuadSSI.codename)) {
73 cananian 1.1.2.8              return new harpoon.ClassFile.SerializableCodeFactory() {
74 cananian 1.1.2.6                  public HCode convert(HMethod m) {
75 cananian 1.1.2.6                      HCode c = hcf.convert(m);
76 cananian 1.1.2.11                     return (c==null)?null:new QuadSSA((QuadSSI)c);
77 cananian 1.1.2.6                  }
78 cananian 1.1.2.6                  public void clear(HMethod m) { hcf.clear(m); }
79 cananian 1.1.2.6                  public String getCodeName() { return codename; }
80 cananian 1.1.2.6              };
81 cananian 1.1.2.7          } else if (hcf.getCodeName().equals(harpoon.IR.Bytecode.Code.codename)
82 cananian 1.1.2.11                    || hcf.getCodeName().equals(QuadWithTry.codename)
83 cananian 1.1.2.11                    || hcf.getCodeName().equals(QuadNoSSA.codename)
84 cananian 1.1.2.11                    || hcf.getCodeName().equals(QuadRSSx.codename)) {
85 cananian 1.1.2.7              // do some implicit chaining.
86 cananian 1.1.2.11             return codeFactory(QuadSSI.codeFactory(hcf));
87 cananian 1.1.2.6          } else throw new Error("don't know how to make " + codename + 
88 cananian 1.1.2.6                                 " from " + hcf.getCodeName());
89 cananian 1.1.2.6      }
90 cananian 1.1.2.6      /** Return a code factory for QuadSSA, using the default code factory
91 cananian 1.1.2.11      *  for QuadSSI. */
92 cananian 1.1.2.6      public static HCodeFactory codeFactory() {
93 cananian 1.1.2.11         return codeFactory(QuadSSI.codeFactory());
94 cananian 1.1.2.1      }
95 cananian 1.2      }