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 }