1 cananian 1.1.2.1  // QuadWithTry.java, created Sat Dec 19 23:55:52 1998 by cananian
  2 cananian 1.1.2.8  // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.8  // 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 bdemsky  1.1.2.21 import harpoon.ClassFile.HClass;
  7 cananian 1.1.2.4  import harpoon.ClassFile.HCode;
  8 cananian 1.1.2.23 import harpoon.ClassFile.HCodeAndMaps;
  9 bdemsky  1.1.2.21 import harpoon.ClassFile.HCodeElement;
 10 cananian 1.1.2.4  import harpoon.ClassFile.HCodeFactory;
 11 cananian 1.1.2.4  import harpoon.ClassFile.HMethod;
 12 cananian 1.1.2.16 import harpoon.Analysis.Quads.DeadCode;
 13 cananian 1.1.2.1  import harpoon.Util.Util;
 14 bdemsky  1.1.2.21 import harpoon.Util.Tuple;
 15 bdemsky  1.1.2.21 import harpoon.Analysis.Maps.TypeMap;
 16 bdemsky  1.1.2.21 import harpoon.Temp.Temp;
 17 bdemsky  1.1.2.21 
 18 cananian 1.1.2.1  
 19 cananian 1.1.2.18 import java.util.Map;
 20 cananian 1.1.2.1  /**
 21 cananian 1.1.2.1   * <code>QuadWithTry</code> is a code view with explicit try-block
 22 cananian 1.1.2.1   * handlers.  <code>QuadWithTry</code> is not in SSA form.
 23 cananian 1.1.2.1   * 
 24 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 25 cananian 1.3       * @version $Id: QuadWithTry.java,v 1.3 2002/09/01 07:47:20 cananian Exp $
 26 cananian 1.1.2.1   * @see QuadNoSSA
 27 cananian 1.1.2.15  * @see QuadSSI
 28 cananian 1.1.2.1   */
 29 cananian 1.1.2.1  public class QuadWithTry extends Code /* which extends HCode */ {
 30 cananian 1.1.2.1      /** The name of this code view. */
 31 cananian 1.1.2.1      public static final String codename = "quad-with-try";
 32 bdemsky  1.1.2.21     TypeMap typemap;
 33 bdemsky  1.1.2.21 
 34 cananian 1.1.2.1      /** Creates a <code>QuadWithTry</code> object from a
 35 cananian 1.1.2.1       *  <code>harpoon.IR.Bytecode.Code</code> object. */
 36 cananian 1.1.2.1      QuadWithTry(harpoon.IR.Bytecode.Code bytecode) {
 37 cananian 1.1.2.1          super(bytecode.getMethod(), null);
 38 cananian 1.1.2.1          quads = Translate.trans(bytecode, this);
 39 cananian 1.1.2.26         CleanHandlers.clean(this); // translate is sloppy about handler sets
 40 cananian 1.1.2.2          Peephole.normalize(quads); // put variables where they belong.
 41 cananian 1.1.2.27         Peephole.optimize(quads); // move MOVEs more.
 42 cananian 1.1.2.26         CleanHandlers.clean(this); // be safe and clean again.
 43 cananian 1.1.2.3          // if we allow far moves, the state which the handlers expect is
 44 cananian 1.1.2.3          // destroyed.  not sure how to make the optimization handler-safe.
 45 cananian 1.1.2.3          // maybe don't allow moves past instructions that might throw
 46 cananian 1.1.2.3          // exceptions?
 47 bdemsky  1.1.2.21         this.typemap=null;
 48 cananian 1.1.2.1      }
 49 bdemsky  1.1.2.6  
 50 cananian 1.1.2.15     QuadWithTry(harpoon.IR.Quads.QuadSSI quad) {
 51 bdemsky  1.1.2.6          super(quad.getMethod(), null);
 52 cananian 1.1.2.19         ReHandler.QuadMapPair qmp = ReHandler.rehandler(this.qf, quad);
 53 cananian 1.1.2.19         quads = qmp.quad;
 54 bdemsky  1.1.2.21         final Map map=qmp.map;
 55 bdemsky  1.1.2.20         Peephole.normalize(quads,map);
 56 cananian 1.1.2.27         Peephole.optimize(quads, map);
 57 bdemsky  1.1.2.21         //ReHandler.clean doesn't need map, it just eats quads...
 58 bdemsky  1.1.2.12         ReHandler.clean(this);
 59 bdemsky  1.1.2.21         Pattern.patternMatch(this,map);
 60 bdemsky  1.1.2.21         
 61 bdemsky  1.1.2.21         this.typemap=new TypeMap() {
 62 bdemsky  1.1.2.21             public HClass typeMap(HCodeElement hc, Temp t) {
 63 bdemsky  1.1.2.21                 return (HClass) map.get(new Tuple(new Object[]{hc,t}));
 64 bdemsky  1.1.2.21             }
 65 bdemsky  1.1.2.21         };
 66 bdemsky  1.1.2.6      }
 67 bdemsky  1.1.2.6  
 68 cananian 1.1.2.25     protected QuadWithTry(HMethod parent, Quad quads) {
 69 cananian 1.1.2.1          super(parent, quads);
 70 bdemsky  1.1.2.21         this.typemap=null;
 71 cananian 1.1.2.1      }
 72 cananian 1.1.2.1      /** Clone this code representation.  The clone has its own copy of
 73 cananian 1.1.2.1       *  the quad graph. */
 74 cananian 1.3          public HCodeAndMaps<Quad> clone(HMethod newMethod) {
 75 cananian 1.1.2.23         return cloneHelper(new QuadWithTry(newMethod, null));
 76 cananian 1.1.2.1      }
 77 cananian 1.1.2.1      /**
 78 cananian 1.1.2.1       * Return the name of this code view.
 79 cananian 1.1.2.1       * @return the string <code>"quad-with-try"</code>.
 80 cananian 1.1.2.1       */
 81 cananian 1.1.2.1      public String getName() { return codename; }
 82 cananian 1.1.2.1  
 83 cananian 1.1.2.7      /** Return a code factory for <code>QuadWithTry</code>, given a
 84 cananian 1.1.2.7       *  code factory for <code>Bytecode</code> or <code>QuadNoSSA</code>.
 85 cananian 1.1.2.15      *  Given a code factory for <code>QuadSSI</code>, chain through 
 86 cananian 1.1.2.7       *  <code>QuadNoSSA.codeFactory()</code>. */
 87 cananian 1.1.2.5      public static HCodeFactory codeFactory(final HCodeFactory hcf) {
 88 cananian 1.1.2.24         if (hcf.getCodeName().equals(codename)) return hcf;
 89 cananian 1.1.2.5          if (hcf.getCodeName().equals(harpoon.IR.Bytecode.Code.codename)) {
 90 cananian 1.1.2.25             return new CloneSynthesizer // synthesize codes for array.clone()
 91 cananian 1.1.2.25                 (new harpoon.ClassFile.SerializableCodeFactory() {
 92 cananian 1.1.2.5                  public HCode convert(HMethod m) {
 93 cananian 1.1.2.5                      HCode c = hcf.convert(m);
 94 cananian 1.1.2.5                      return (c==null) ? null :
 95 cananian 1.1.2.5                          new QuadWithTry((harpoon.IR.Bytecode.Code)c);
 96 cananian 1.1.2.5                  }
 97 cananian 1.1.2.5                  public void clear(HMethod m) { hcf.clear(m); }
 98 cananian 1.1.2.5                  public String getCodeName() { return codename; }
 99 cananian 1.1.2.25             });
100 cananian 1.1.2.15         } else if (hcf.getCodeName().equals(harpoon.IR.Quads.QuadSSI.codename)) {
101 cananian 1.1.2.9              return new harpoon.ClassFile.SerializableCodeFactory() {
102 bdemsky  1.1.2.6                  public HCode convert(HMethod m) {
103 bdemsky  1.1.2.6                      HCode c = hcf.convert(m);
104 bdemsky  1.1.2.6                      return (c==null) ? null :
105 cananian 1.1.2.15                         new QuadWithTry((harpoon.IR.Quads.QuadSSI)c);
106 bdemsky  1.1.2.6                  }
107 bdemsky  1.1.2.6                  public void clear(HMethod m) { hcf.clear(m); }
108 bdemsky  1.1.2.6                  public String getCodeName() { return codename; }
109 bdemsky  1.1.2.6              };
110 bdemsky  1.1.2.10         } else if (hcf.getCodeName().equals(harpoon.IR.Quads.QuadNoSSA.codename)) {
111 cananian 1.1.2.15             return codeFactory(harpoon.IR.Quads.QuadSSI.codeFactory(hcf));
112 cananian 1.1.2.7          } else throw new Error("don't know how to make " + codename +
113 cananian 1.1.2.5                                 " from " + hcf.getCodeName());
114 cananian 1.1.2.5      }
115 cananian 1.1.2.5      /** Return a code factory for QuadWithTry, using the default
116 cananian 1.1.2.5       *  code factory for Bytecode. */
117 cananian 1.1.2.5      public static HCodeFactory codeFactory() {
118 cananian 1.1.2.5          return codeFactory(harpoon.IR.Bytecode.Code.codeFactory());
119 cananian 1.1.2.5      }
120 bdemsky  1.1.2.21     /** Returns a TypeMap if there is one, or null otherwise**/
121 bdemsky  1.1.2.21     public TypeMap typeMap() {
122 bdemsky  1.1.2.21         return typemap;
123 cananian 1.1.2.1      }
124 cananian 1.2      }