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 }