1 cananian 1.1.2.1 // QuadRSSx.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.1 import harpoon.Analysis.Quads.DeadCode;
 7 cananian 1.1.2.1 import harpoon.ClassFile.HCode;
 8 cananian 1.1.2.1 import harpoon.ClassFile.HCodeAndMaps;
 9 cananian 1.1.2.1 import harpoon.ClassFile.HCodeFactory;
10 cananian 1.1.2.1 import harpoon.ClassFile.HMethod;
11 cananian 1.1.2.1 import harpoon.Util.Util;
12 cananian 1.1.2.1 
13 cananian 1.1.2.1 /**
14 cananian 1.1.2.1  * <code>Quads.QuadRSSx</code> is a code view in relaxed SSI form.
15 cananian 1.1.2.1  * Quad form exposes the details of
16 cananian 1.1.2.1  * the java classfile bytecodes in a pseudo-quadruple format.  Implementation
17 cananian 1.1.2.1  * details of the stack-based JVM are hidden in favor of a flat consistent
18 cananian 1.1.2.1  * temporary-variable based approach.  The generated quadruples adhere
19 cananian 1.1.2.1  * to an QuadNoSSA form (that is, there are no contraints on variable
20 cananian 1.1.2.1  * definitions/re-definitions); but <code>PHI</code> and <code>SIGMA</code>
21 cananian 1.1.2.1  * functions are allowed.  <code>PHI</code> and <code>SIGMA</code> nodes
22 cananian 1.1.2.1  * behave semantically as their no-ssa conversion; that is, execution
23 cananian 1.1.2.1  * proceeds as if there were implicit <code>MOVE</code>s on the edges
24 cananian 1.1.2.1  * leading to/coming from the <code>PHI</code>/<code>SIGMA</code> nodes.
25 cananian 1.1.2.1  * 
26 cananian 1.1.2.3  * @author  Brian Demsky <bdemsky@mit.edu>
27 cananian 1.3      * @version $Id: QuadRSSx.java,v 1.3 2002/09/01 07:47:20 cananian Exp $
28 cananian 1.1.2.1  */
29 cananian 1.1.2.1 public class QuadRSSx extends Code /* which extends HCode */ {
30 cananian 1.1.2.1     /** The name of this code view. */
31 cananian 1.1.2.2     public static final String codename = "relaxed-quad-ssx";
32 cananian 1.1.2.1 
33 cananian 1.1.2.1     /** Creates a <code>Code</code> object from a bytecode object. */
34 cananian 1.1.2.1     
35 cananian 1.1.2.1     /** 
36 cananian 1.1.2.1      * Create a new code object given a quadruple representation
37 cananian 1.1.2.1      * of the method instructions.
38 cananian 1.1.2.1      */
39 cananian 1.1.2.1     protected QuadRSSx(HMethod parent, Quad quads) {
40 cananian 1.1.2.1         super(parent, quads);
41 cananian 1.1.2.1     }
42 cananian 1.1.2.1 
43 cananian 1.1.2.1     /** Clone this code representation. The clone has its own
44 cananian 1.1.2.1      *  copy of the quad graph. */
45 cananian 1.3         public HCodeAndMaps<Quad> clone(HMethod newMethod) {
46 cananian 1.1.2.1         return cloneHelper(new QuadRSSx(newMethod, null));
47 cananian 1.1.2.1     }
48 cananian 1.1.2.1 
49 cananian 1.1.2.1     /**
50 cananian 1.1.2.1      * Return the name of this code view.
51 cananian 1.1.2.1      * @return the string <code>"relaxed-quad-ssi"</code>.
52 cananian 1.1.2.1      */
53 cananian 1.1.2.1     public String getName() { return codename; }
54 cananian 1.1.2.1 
55 cananian 1.1.2.1     /** Return a code factory for <code>QuadRSSx</code>, given a code
56 cananian 1.1.2.1      *  factory for <code>QuadNoSSA</code> or <code>QuadSSI</code>.
57 cananian 1.1.2.1      */
58 cananian 1.1.2.1     public static HCodeFactory codeFactory(final HCodeFactory hcf) {
59 cananian 1.1.2.1         if (hcf.getCodeName().equals(codename)) return hcf;
60 cananian 1.1.2.1         if (hcf.getCodeName().equals(QuadNoSSA.codename) ||
61 cananian 1.1.2.4             hcf.getCodeName().equals(QuadSSA.codename) ||
62 cananian 1.1.2.1             hcf.getCodeName().equals(QuadSSI.codename)) {
63 cananian 1.1.2.1             return new harpoon.ClassFile.SerializableCodeFactory() {
64 cananian 1.1.2.1                 public HCode convert(HMethod m) {
65 cananian 1.1.2.1                     Code c = (Code) hcf.convert(m);
66 cananian 1.1.2.4                     return (c==null) ? null :
67 cananian 1.1.2.4                         c.cloneHelper(new QuadRSSx(m, null)).hcode();
68 cananian 1.1.2.1                 }
69 cananian 1.1.2.1                 public void clear(HMethod m) { hcf.clear(m); }
70 cananian 1.1.2.1                 public String getCodeName() { return codename; }
71 cananian 1.1.2.1             };
72 cananian 1.1.2.1         } else throw new Error("don't know how to make " + codename +
73 cananian 1.1.2.1                                " from " + hcf.getCodeName());
74 cananian 1.1.2.1     }
75 cananian 1.2     }