1 cananian 1.1.2.1  // QuadNoSSA.java, created Sat Dec 26 01:42:53 1998 by cananian
  2 cananian 1.1.2.12 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.12 // 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.15 import harpoon.Analysis.Maps.TypeMap;
  7 cananian 1.1.2.15 import harpoon.Analysis.Quads.TypeInfo;
  8 cananian 1.1.2.3  import harpoon.ClassFile.HCode;
  9 cananian 1.1.2.23 import harpoon.ClassFile.HCodeAndMaps;
 10 cananian 1.1.2.3  import harpoon.ClassFile.HCodeFactory;
 11 cananian 1.1.2.3  import harpoon.ClassFile.HMethod;
 12 cananian 1.1.2.1  import harpoon.Util.Util;
 13 cananian 1.1.2.1  
 14 duncan   1.1.2.7  import java.util.Hashtable;
 15 duncan   1.1.2.7  
 16 cananian 1.1.2.1  /**
 17 cananian 1.1.2.1   * <code>QuadNoSSA</code> is a code view with explicit exception handling.
 18 cananian 1.1.2.1   * It does not have <code>HANDLER</code> quads, and is not in SSA form.
 19 cananian 1.1.2.1   * 
 20 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 21 cananian 1.3       * @version $Id: QuadNoSSA.java,v 1.3 2002/09/01 07:47:20 cananian Exp $
 22 cananian 1.1.2.1   * @see QuadWithTry
 23 cananian 1.1.2.14  * @see QuadSSI
 24 cananian 1.1.2.1   */
 25 cananian 1.1.2.1  public class QuadNoSSA extends Code /* which extends HCode */ {
 26 cananian 1.1.2.1      /** The name of this code view. */
 27 cananian 1.1.2.1      public static final String codename = "quad-no-ssa";
 28 cananian 1.1.2.15     /** Type information for this code view.
 29 cananian 1.1.2.15      *  Only non-null if you pass a non-null <code>TypeMap</code> to the
 30 cananian 1.1.2.15      *  constructor (or use the <code>codeFactoryWithTypes</code> to 
 31 cananian 1.1.2.15      *  generate your <code>QuadNoSSA</code>s). */
 32 cananian 1.1.2.15     public final TypeMap typeMap;
 33 cananian 1.1.2.1  
 34 cananian 1.1.2.1      /** Creates a <code>QuadNoSSA</code> object from a
 35 cananian 1.1.2.1       *  <code>QuadWithTry</code> object. */
 36 cananian 1.1.2.31     QuadNoSSA(Code qwt, boolean coalesce) {
 37 cananian 1.1.2.31         this(qwt, null, coalesce);
 38 cananian 1.1.2.15     }
 39 cananian 1.1.2.31     /** Creates a <code>QuadNoSSA</code> object from a
 40 cananian 1.1.2.31      *  <code>QuadSSI</code> object and a <code>TypeMap</code>. */
 41 cananian 1.1.2.31     QuadNoSSA(Code qsa, TypeMap tm) {
 42 cananian 1.1.2.31         this(qsa, tm, false);
 43 cananian 1.1.2.31     }
 44 cananian 1.1.2.31     QuadNoSSA(Code qsa) {
 45 cananian 1.1.2.31         this(qsa, null, false);
 46 cananian 1.1.2.31     }
 47 cananian 1.1.2.31     private QuadNoSSA(Code qcode, TypeMap tm, boolean coalesce) {
 48 cananian 1.1.2.31         super(qcode.getMethod(), null);
 49 cananian 1.1.2.31         if (qcode.getName().equals(QuadWithTry.codename)) {
 50 cananian 1.1.2.31             this.quads = UnHandler.unhandler(this.qf, qcode, coalesce);
 51 cananian 1.1.2.31             Peephole.optimize(this.quads);
 52 cananian 1.1.2.31             Prune.prune(this);
 53 cananian 1.1.2.31             this.typeMap = null;
 54 cananian 1.1.2.31         } else if (qcode.getName().equals(QuadRSSx.codename)) {
 55 cananian 1.1.2.31             RSSxToNoSSA translate = new RSSxToNoSSA(this.qf, qcode);
 56 cananian 1.1.2.31             this.quads=translate.getQuads();
 57 cananian 1.1.2.31             this.typeMap = null;
 58 cananian 1.1.2.31         } else if (qcode.getName().equals(QuadSSI.codename)) {
 59 cananian 1.1.2.31             ToNoSSA translator = new ToNoSSA(this.qf, qcode, tm);
 60 cananian 1.1.2.31             this.quads = translator.getQuads();
 61 cananian 1.1.2.31             this.typeMap = (tm==null) ? null : translator.getDerivation();
 62 cananian 1.1.2.31             setAllocationInformation(translator.getAllocationInformation());
 63 cananian 1.1.2.31         } else throw new RuntimeException("can't make quad-no-ssa from "+
 64 cananian 1.1.2.31                                           qcode.getName());
 65 bdemsky  1.1.2.19     }
 66 bdemsky  1.1.2.19 
 67 bdemsky  1.1.2.16     protected QuadNoSSA(HMethod parent, Quad quads) {
 68 cananian 1.1.2.1          super(parent, quads);
 69 cananian 1.1.2.15         this.typeMap = null;
 70 cananian 1.1.2.1      }
 71 cananian 1.1.2.1      /** Clone this code representation.  The clone has its own copy of
 72 cananian 1.1.2.1       *  the quad graph. */
 73 cananian 1.3          public HCodeAndMaps<Quad> clone(HMethod newMethod) {
 74 cananian 1.1.2.23         return cloneHelper(new QuadNoSSA(newMethod, null));
 75 cananian 1.1.2.1      }
 76 cananian 1.1.2.1      /**
 77 cananian 1.1.2.1       * Return the name of this code view.
 78 cananian 1.1.2.1       * @return the string <code>"quad-no-ssa"</code>.
 79 cananian 1.1.2.1       */
 80 cananian 1.1.2.1      public String getName() { return codename; }
 81 cananian 1.1.2.1  
 82 cananian 1.1.2.11     /** Return a code factory for <code>QuadNoSSA</code>, given a code
 83 cananian 1.1.2.14      *  factory for <code>QuadWithTry</code> or <code>QuadSSI</code>.
 84 cananian 1.1.2.11      *  Given a code factory for <code>Bytecode</code>, chain through
 85 cananian 1.1.2.11      *  <code>QuadWithTry.codeFactory()</code>.  */
 86 cananian 1.1.2.4      public static HCodeFactory codeFactory(final HCodeFactory hcf) {
 87 cananian 1.1.2.26         if (hcf.getCodeName().equals(codename)) return hcf;
 88 cananian 1.1.2.4          if (hcf.getCodeName().equals(QuadWithTry.codename)) {
 89 cananian 1.1.2.25             return new harpoon.ClassFile.SerializableCodeFactory() {
 90 cananian 1.1.2.4                  public HCode convert(HMethod m) {
 91 cananian 1.1.2.4                      HCode c = hcf.convert(m);
 92 cananian 1.1.2.4                      return (c==null) ? null :
 93 cananian 1.1.2.31                         new QuadNoSSA((Code)c, null,
 94 cananian 1.1.2.28                                       !Boolean.getBoolean
 95 cananian 1.1.2.28                                       ("harpoon.quads.nocoalesce"));
 96 cananian 1.1.2.28                     // set harpoon.quads.nocoalesce to true to disable
 97 cananian 1.1.2.28                     // coalescing exception handling.  disabling this
 98 cananian 1.1.2.28                     // will result in shorter branches, on average.
 99 cananian 1.1.2.5                  }
100 cananian 1.1.2.5                  public void clear(HMethod m) { hcf.clear(m); }
101 cananian 1.1.2.5                  public String getCodeName() { return codename; }
102 cananian 1.1.2.25             };
103 cananian 1.1.2.14         } else if (hcf.getCodeName().equals(QuadSSI.codename)) {
104 cananian 1.1.2.13             return new harpoon.ClassFile.SerializableCodeFactory() {
105 cananian 1.1.2.5                  public HCode convert(HMethod m) {
106 cananian 1.1.2.5                      HCode c = hcf.convert(m);
107 cananian 1.1.2.5                      return (c==null) ? null :
108 cananian 1.1.2.31                         new QuadNoSSA((Code)c, null, false);
109 cananian 1.1.2.4                  }
110 cananian 1.1.2.4                  public void clear(HMethod m) { hcf.clear(m); }
111 cananian 1.1.2.4                  public String getCodeName() { return codename; }
112 cananian 1.1.2.4              };
113 cananian 1.1.2.27         } else if (hcf.getCodeName().equals(QuadRSSx.codename)) {
114 bdemsky  1.1.2.19             return new harpoon.ClassFile.SerializableCodeFactory() {
115 bdemsky  1.1.2.19                 public HCode convert(HMethod m) {
116 bdemsky  1.1.2.19                     HCode c = hcf.convert(m);
117 bdemsky  1.1.2.19                     return (c==null) ? null :
118 cananian 1.1.2.31                         new QuadNoSSA((Code)c, null, false);
119 bdemsky  1.1.2.19                 }
120 bdemsky  1.1.2.19                 public void clear(HMethod m) { hcf.clear(m); }
121 bdemsky  1.1.2.19                 public String getCodeName() { return codename; }
122 bdemsky  1.1.2.19             };      
123 cananian 1.1.2.29         } else if (hcf.getCodeName().equals(QuadSSA.codename)) {
124 cananian 1.1.2.29             // implicit chaining.
125 cananian 1.1.2.29             return codeFactory(QuadRSSx.codeFactory(hcf));
126 bdemsky  1.1.2.19         }else if (hcf.getCodeName().equals(harpoon.IR.Bytecode.Code.codename)){
127 cananian 1.1.2.11             // implicit chaining
128 cananian 1.1.2.11             return codeFactory(QuadWithTry.codeFactory(hcf));
129 cananian 1.1.2.15         } else throw new Error("don't know how to make " + codename +
130 cananian 1.1.2.15                                " from " + hcf.getCodeName());
131 cananian 1.1.2.15     }
132 cananian 1.1.2.15     /** Return a code factory for <code>QuadNoSSA</code>, given a code
133 cananian 1.1.2.15      *  factory for <code>QuadSSI</code>.  The <code>QuadNoSSA</code>s
134 cananian 1.1.2.15      *  generated by the code factory will have valid typeMap fields,
135 cananian 1.1.2.15      *  courtesy of <code>TypeInfo</code>. */
136 cananian 1.1.2.15     public static HCodeFactory codeFactoryWithTypes(final HCodeFactory hcf) {
137 cananian 1.1.2.15         if (hcf.getCodeName().equals(QuadSSI.codename)) {
138 cananian 1.1.2.15             return new harpoon.ClassFile.SerializableCodeFactory() {
139 cananian 1.1.2.15                 public HCode convert(HMethod m) {
140 cananian 1.1.2.15                     HCode c = hcf.convert(m);
141 cananian 1.1.2.15                     return (c==null) ? null :
142 cananian 1.1.2.15                         new QuadNoSSA((QuadSSI)c, new TypeInfo((QuadSSI)c));
143 cananian 1.1.2.15                 }
144 cananian 1.1.2.15                 public void clear(HMethod m) { hcf.clear(m); }
145 cananian 1.1.2.15                 public String getCodeName() { return codename; }
146 cananian 1.1.2.15             };
147 cananian 1.1.2.4          } else throw new Error("don't know how to make " + codename +
148 cananian 1.1.2.4                                 " from " + hcf.getCodeName());
149 cananian 1.1.2.4      }
150 bdemsky  1.1.2.19 
151 cananian 1.1.2.4      /** Return a code factory for QuadNoSSA, using the default code
152 cananian 1.1.2.4       *  factory for QuadWithTry. */
153 cananian 1.1.2.4      public static HCodeFactory codeFactory() {
154 cananian 1.1.2.4          return codeFactory(QuadWithTry.codeFactory());
155 cananian 1.1.2.1      }
156 cananian 1.2      }