1 cananian 1.1.2.1 // PSET.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.3 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>PSET</code> represents a <code>POINTER</code> dereference to 14 cananian 1.1.2.1 * set a field or array element. The <code>ptr</code> <code>Temp</code> 15 cananian 1.1.2.1 * ought to contain a <code>POINTER</code> value. 16 cananian 1.1.2.1 * 17 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 18 cananian 1.5 * @version $Id: PSET.java,v 1.5 2002/04/11 04:00:21 cananian Exp $ 19 cananian 1.1.2.1 */ 20 cananian 1.1.2.1 public class PSET extends LowQuad { 21 cananian 1.1.2.1 /** <code>Temp</code> holding the <code>POINTER</code> value to 22 cananian 1.1.2.3 * dereference and store to. */ 23 cananian 1.1.2.1 protected final Temp ptr; 24 cananian 1.1.2.1 /** <code>Temp</code> containing the desired new value of the 25 cananian 1.1.2.1 * field or element. */ 26 cananian 1.1.2.1 protected final Temp src; 27 cananian 1.1.2.3 /** The type of the object we are storing. This may be 28 cananian 1.1.2.3 * a sub-integer type, and thus disagree with the type of 29 cananian 1.1.2.3 * <code>src</code>. For non-primitive types, this may be 30 cananian 1.1.2.3 * simply <code>Object</code>; use a typemap and the <code>src</code> 31 cananian 1.1.2.3 * field if you need accurate non-primitive types. */ 32 cananian 1.1.2.3 protected final HClass type; 33 cananian 1.1.2.1 34 cananian 1.1.2.1 /** Creates a <code>PSET</code> representing a pointer dereference and 35 cananian 1.1.2.1 * store. 36 cananian 1.1.2.1 * @param ptr 37 cananian 1.1.2.1 * the <code>Temp</code> holding the <code>POINTER</code> value 38 cananian 1.1.2.1 * to dereference. 39 cananian 1.1.2.1 * @param src 40 cananian 1.1.2.1 * the <code>Temp</code> containing the value to put into the 41 cananian 1.1.2.1 * field or element. 42 cananian 1.1.2.3 * @param type 43 cananian 1.1.2.3 * the type of the object we are storing; possibly a sub-integer 44 cananian 1.1.2.3 * type. Not necessarily precise if non-primitive. 45 cananian 1.1.2.1 */ 46 cananian 1.1.2.3 public PSET(LowQuadFactory qf, HCodeElement source, 47 cananian 1.1.2.3 Temp ptr, Temp src, HClass type) { 48 cananian 1.1.2.1 super(qf, source); 49 cananian 1.1.2.1 this.ptr = ptr; 50 cananian 1.1.2.1 this.src = src; 51 cananian 1.1.2.3 this.type= type; 52 cananian 1.3.2.1 assert ptr!=null && src!=null && type!=null; 53 cananian 1.1.2.1 } 54 cananian 1.1.2.1 // ACCESSOR METHODS: 55 cananian 1.1.2.1 /** Returns the <code>Temp</code> holding the <code>POINTER</code> value 56 cananian 1.1.2.1 * to dereference. */ 57 cananian 1.1.2.1 public Temp ptr() { return ptr; } 58 cananian 1.1.2.1 /** Returns the <code>Temp</code> holding the desired new value for 59 cananian 1.1.2.1 * the dereference field or element. */ 60 cananian 1.1.2.1 public Temp src() { return src; } 61 cananian 1.1.2.3 /** Returns the type of the field or array element we are storing. 62 cananian 1.1.2.3 * Not necessarily precise if non-primitive. May be a sub-integer 63 cananian 1.1.2.3 * type. */ 64 cananian 1.1.2.3 public HClass type() { return type; } 65 cananian 1.1.2.1 66 cananian 1.1.2.1 public int kind() { return LowQuadKind.PSET; } 67 cananian 1.1.2.1 68 cananian 1.1.2.1 public Temp[] use() { return new Temp[] { ptr, src }; } 69 cananian 1.1.2.1 public Temp[] def() { return new Temp[0]; } 70 cananian 1.1.2.1 71 cananian 1.1.2.1 public harpoon.IR.Quads.Quad rename(harpoon.IR.Quads.QuadFactory qf, 72 cananian 1.1.2.1 TempMap defMap, TempMap useMap) { 73 cananian 1.1.2.1 return new PSET((LowQuadFactory)qf, this, 74 cananian 1.1.2.3 map(useMap, ptr), map(useMap, src), type); 75 cananian 1.1.2.1 } 76 cananian 1.1.2.1 77 cananian 1.1.2.2 void accept(LowQuadVisitor v) { v.visit(this); } 78 cananian 1.5 <T> T accept(LowQuadValueVisitor<T> v) { return v.visit(this); } 79 cananian 1.1.2.1 80 cananian 1.1.2.1 public String toString() { 81 cananian 1.1.2.3 String r = "PSET *" + ptr.toString() + " to " + src.toString(); 82 cananian 1.1.2.3 if (type.isPrimitive()) r+=" ("+type.toString()+")"; 83 cananian 1.1.2.3 return r; 84 cananian 1.1.2.1 } 85 cananian 1.2 }