1 cananian 1.1.2.1 // PAOFFSET.java, created Wed Jan 20 21:47:52 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 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.LowQuad; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 7 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement; 8 cananian 1.1.2.1 import harpoon.Temp.Temp; 9 cananian 1.1.2.1 import harpoon.Temp.TempMap; 10 cananian 1.1.2.1 import harpoon.Util.Util; 11 cananian 1.1.2.1 12 cananian 1.1.2.1 /** 13 cananian 1.1.2.1 * <code>PAOFFSET</code> computes the <code>POINTER</code> offset 14 cananian 1.1.2.1 * needed to access a given array element. 15 cananian 1.1.2.1 * 16 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 17 cananian 1.5 * @version $Id: PAOFFSET.java,v 1.5 2002/04/11 04:00:21 cananian Exp $ 18 cananian 1.1.2.1 */ 19 cananian 1.1.2.1 public class PAOFFSET extends PCONST { 20 cananian 1.1.2.1 /** The array type. */ 21 cananian 1.1.2.1 protected final HClass arrayType; 22 cananian 1.1.2.1 /** The index into the array. */ 23 cananian 1.1.2.1 protected final Temp index; 24 cananian 1.1.2.1 25 cananian 1.1.2.1 /** Creates a <code>PAOFFSET</code> representing the <code>POINTER</code> 26 cananian 1.1.2.1 * offset needed to access a given array element. 27 cananian 1.1.2.1 * @param dst 28 cananian 1.1.2.1 * the <code>Temp</code> in which to store the computed offset. 29 cananian 1.1.2.1 * @param arrayType 30 cananian 1.1.2.1 * the type of the array the element is in. 31 cananian 1.1.2.1 * @param index 32 cananian 1.1.2.1 * the index of the array element to address. 33 cananian 1.1.2.1 */ 34 cananian 1.1.2.1 public PAOFFSET(LowQuadFactory qf, HCodeElement source, 35 cananian 1.1.2.1 final Temp dst, final HClass arrayType, final Temp index) { 36 cananian 1.1.2.1 super(qf, source, dst); 37 cananian 1.1.2.1 this.arrayType = arrayType; 38 cananian 1.1.2.1 this.index = index; 39 cananian 1.3.2.1 assert arrayType!=null && arrayType.isArray() : "arrayType ("+arrayType+") is not valid."; 40 cananian 1.3.2.1 assert index!=null; 41 cananian 1.1.2.1 } 42 cananian 1.1.2.1 /** Returns the array type. */ 43 cananian 1.1.2.1 public HClass arrayType() { return arrayType; } 44 cananian 1.1.2.1 /** Returns the <code>Temp</code> holding the index of the array element 45 cananian 1.1.2.1 * to address. */ 46 cananian 1.1.2.1 public Temp index() { return index; } 47 cananian 1.1.2.1 48 cananian 1.1.2.1 public int kind() { return LowQuadKind.PAOFFSET; } 49 cananian 1.1.2.1 50 cananian 1.1.2.1 public Temp[] use() { return new Temp[] { index }; } 51 cananian 1.1.2.1 52 cananian 1.1.2.1 public harpoon.IR.Quads.Quad rename(harpoon.IR.Quads.QuadFactory qf, 53 cananian 1.1.2.1 TempMap defMap, TempMap useMap) { 54 cananian 1.1.2.1 return new PAOFFSET((LowQuadFactory)qf, this, 55 cananian 1.1.2.1 map(defMap, dst), arrayType, map(useMap, index)); 56 cananian 1.1.2.1 } 57 cananian 1.1.2.1 58 cananian 1.1.2.2 void accept(LowQuadVisitor v) { v.visit(this); } 59 cananian 1.5 <T> T accept(LowQuadValueVisitor<T> v) { return v.visit(this); } 60 cananian 1.1.2.1 61 cananian 1.1.2.1 public String toString() { 62 cananian 1.1.2.1 HClass hc = arrayType; 63 cananian 1.1.2.1 int d; 64 cananian 1.1.2.1 for (d=0; hc.isArray(); d++) 65 cananian 1.1.2.1 hc = hc.getComponentType(); 66 cananian 1.1.2.1 StringBuffer sb = new StringBuffer(); 67 cananian 1.1.2.1 sb.append(dst.toString() + " = PAOFFSET "); 68 cananian 1.1.2.1 sb.append(hc.getName()); 69 cananian 1.1.2.1 for (int i=0; i<d-1; i++) 70 cananian 1.1.2.1 sb.append("[]"); 71 cananian 1.1.2.1 sb.append("["+index+"]"); 72 cananian 1.1.2.1 return sb.toString(); 73 cananian 1.1.2.1 } 74 cananian 1.2 }