1 cananian 1.1.2.1 // LABEL.java, created Fri Dec 11 05:59:31 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.6 import harpoon.ClassFile.HCodeElement; 7 cananian 1.1.2.1 import harpoon.Temp.Temp; 8 cananian 1.1.2.1 import harpoon.Temp.TempMap; 9 cananian 1.1.2.1 import harpoon.Util.Util; 10 cananian 1.1.2.1 11 cananian 1.1.2.1 /** 12 cananian 1.1.2.1 * <code>LABEL</code> marks a basic-block entrance. 13 cananian 1.1.2.1 * 14 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 15 cananian 1.3 * @version $Id: LABEL.java,v 1.3 2002/04/11 04:00:34 cananian Exp $ 16 cananian 1.1.2.1 */ 17 cananian 1.1.2.1 public class LABEL extends PHI { 18 cananian 1.1.2.1 /** the (optional) name of this label. <p> 19 cananian 1.1.2.1 * <code>null</code> if the label has no name. */ 20 cananian 1.1.2.1 protected String label; 21 cananian 1.1.2.1 22 cananian 1.1.2.1 /** Creates a <code>LABEL</code> representing the entrance to a basic 23 cananian 1.1.2.1 * block. 24 cananian 1.1.2.1 * @param label the name of this label, or <code>null</code> for no name. 25 cananian 1.1.2.1 */ 26 cananian 1.1.2.3 public LABEL(QuadFactory qf, HCodeElement source, String label, 27 cananian 1.1.2.1 Temp dst[], Temp src[][], int arity) { 28 cananian 1.1.2.3 super(qf, source, dst, src, arity); 29 cananian 1.1.2.1 this.label = label; 30 cananian 1.1.2.1 } 31 cananian 1.1.2.3 public LABEL(QuadFactory qf, HCodeElement source, String label, 32 cananian 1.1.2.1 Temp dst[], int arity) { 33 cananian 1.1.2.3 super(qf, source, dst, arity); 34 cananian 1.1.2.1 this.label = label; 35 cananian 1.1.2.1 } 36 cananian 1.1.2.4 /** Creates a <code>LABEL</code> to replace a <code>PHI</code>. 37 cananian 1.1.2.1 * @param label the name of this label, or <code>null</code> for no name. 38 cananian 1.1.2.1 */ 39 cananian 1.1.2.3 public LABEL(QuadFactory qf, PHI phi, String label) { 40 cananian 1.1.2.3 this(qf, phi, label, phi.dst, phi.src, phi.arity()); 41 cananian 1.1.2.1 // SHOULD I REWRITE EDGES in this constructor? 42 cananian 1.1.2.1 } 43 cananian 1.1.2.1 /** Returns the optional name of this label, or <code>null</code> if 44 cananian 1.1.2.1 * this label has no name. */ 45 cananian 1.1.2.1 public String label() { return label; } 46 cananian 1.1.2.1 47 cananian 1.1.2.2 public int kind() { return QuadKind.LABEL; } 48 cananian 1.1.2.2 49 cananian 1.1.2.5 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 50 cananian 1.1.2.5 return new LABEL(qqf, this, 51 cananian 1.1.2.5 label, map(defMap,dst), map(useMap,src), arity()); 52 cananian 1.1.2.2 } 53 cananian 1.1.2.2 54 cananian 1.1.2.7 public void accept(QuadVisitor v) { v.visit(this); } 55 cananian 1.3 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 56 cananian 1.1.2.1 57 cananian 1.1.2.1 /** Returns a human-readable representation of this quad. */ 58 cananian 1.1.2.1 public String toString() { 59 cananian 1.1.2.1 StringBuffer sb = new StringBuffer("LABEL("+prev.length+"): "); 60 cananian 1.1.2.1 for (int i=0; i<dst.length; i++) { 61 cananian 1.1.2.1 sb.append(dst[i].toString() + "=("); 62 cananian 1.1.2.1 for (int j=0; j<src[i].length; j++) { 63 cananian 1.1.2.1 if (src[i][j]==null) 64 cananian 1.1.2.1 sb.append("null"); 65 cananian 1.1.2.1 else 66 cananian 1.1.2.1 sb.append(src[i][j].toString()); 67 cananian 1.1.2.1 if (j < src[i].length-1) 68 cananian 1.1.2.1 sb.append(","); 69 cananian 1.1.2.1 } 70 cananian 1.1.2.1 sb.append(")"); 71 cananian 1.1.2.1 if (i < dst.length-1) 72 cananian 1.1.2.1 sb.append("; "); 73 cananian 1.1.2.1 } 74 cananian 1.1.2.1 return sb.toString(); 75 cananian 1.1.2.1 } 76 cananian 1.2 }