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     }