001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.jikesrvm.compilers.opt.ssa;
014
015import org.jikesrvm.compilers.opt.ir.BasicBlock;
016import org.jikesrvm.compilers.opt.ir.IR;
017import org.jikesrvm.util.BitVector;
018
019/**
020 * An HeapVariable represents a heap variable for heap array SSA form.
021 */
022public class HeapVariable<T> {
023  /**
024   * a unique identifier for this heap variable among all heap variables
025   * with this type.
026   */
027  private final int number;
028  /**
029   * a bit vector representing the basic blocks that write to this
030   * variable
031   */
032  private final BitVector definedIn;
033  /**
034   * The type of this heap variable.  Must be either a
035   * TypeReference, FieldReference, RVMField or a String
036   */
037  private final T type;
038
039  /**
040   * Create a new Heap variable of a given type, with a given number.
041   *
042   * @param type a FieldReference or TypeReference object, naming the type of this
043   *              heap
044   * @param number second part of the name of this heap variable
045   * @param ir the governing IR
046   */
047  public HeapVariable(T type, int number, IR ir) {
048    this.type = type;
049    this.number = number;
050    definedIn = new BitVector(ir.getMaxBasicBlockNumber() + 1);
051  }
052
053  /**
054   * Return a number that uniquely identifies this heap variable, among
055   * all the heap variables with the same type.
056   * @return the number
057   */
058  public int getNumber() {
059    return number;
060  }
061
062  /**
063   * Return the type representing this heap object.
064   * @return either a TypeReference, FieldReference, RVMField or
065   * String object
066   */
067  public T getHeapType() {
068    return type;
069  }
070
071  /**
072   * Is the this the exception heap type?
073   * @return true if the heap represents exceptions
074   */
075  public boolean isExceptionHeapType() {
076    return type == SSADictionary.exceptionState;
077  }
078
079  /**
080   * Return a bit vector that represents the basic blocks that define
081   * this heap variable.
082   * @return a bit vector that represents the basic blocks that define
083   * this heap variable.
084   */
085  public BitVector getDefBlocks() {
086    return definedIn;
087  }
088
089  /**
090   * Note that this heap variable is defined in a given basic block.
091   * @param b a basic block that defines this heap variable
092   */
093  public void registerDef(BasicBlock b) {
094    definedIn.set(b.getNumber());
095  }
096
097  /**
098   * Return a String representation of this variable
099   * @return a String representation of this variable
100   */
101  @Override
102  public String toString() {
103    return "HEAP<" + type + ">" + number;
104  }
105
106  /**
107   * Is this heap variable exposed on procedure entry?
108   * <p> Equivalently: is the number = zero?
109   * @return {@code true} or {@code false}
110   */
111  public boolean isExposedOnEntry() {
112    return (number == 0);
113  }
114}