/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.ssa;
import org.jikesrvm.compilers.opt.ir.BasicBlock;
import org.jikesrvm.compilers.opt.ir.IR;
import org.jikesrvm.util.BitVector;
/**
* An HeapVariable represents a heap variable for heap array SSA form.
*/
public class HeapVariable<T> {
/**
* a unique identifier for this heap variable among all heap variables
* with this type.
*/
private final int number;
/**
* a bit vector representing the basic blocks that write to this
* variable
*/
private final BitVector definedIn;
/**
* The type of this heap variable. Must be either a
* TypeReference, FieldReference, RVMField or a String
*/
private final T type;
/**
* Create a new Heap variable of a given type, with a given number.
*
* @param type a FieldReference or TypeReference object, naming the type of this
* heap
* @param number second part of the name of this heap variable
* @param ir the governing IR
*/
public HeapVariable(T type, int number, IR ir) {
this.type = type;
this.number = number;
definedIn = new BitVector(ir.getMaxBasicBlockNumber() + 1);
}
/**
* Return a number that uniquely identifies this heap variable, among
* all the heap variables with the same type.
* @return the number
*/
public int getNumber() {
return number;
}
/**
* Return the type representing this heap object.
* @return either a TypeReference, FieldReference, RVMField or
* String object
*/
public T getHeapType() {
return type;
}
/**
* Is the this the exception heap type?
* @return true if the heap represents exceptions
*/
public boolean isExceptionHeapType() {
return type == SSADictionary.exceptionState;
}
/**
* Return a bit vector that represents the basic blocks that define
* this heap variable.
* @return a bit vector that represents the basic blocks that define
* this heap variable.
*/
public BitVector getDefBlocks() {
return definedIn;
}
/**
* Note that this heap variable is defined in a given basic block.
* @param b a basic block that defines this heap variable
*/
public void registerDef(BasicBlock b) {
definedIn.set(b.getNumber());
}
/**
* Return a String representation of this variable
* @return a String representation of this variable
*/
@Override
public String toString() {
return "HEAP<" + type + ">" + number;
}
/**
* Is this heap variable exposed on procedure entry?
* <p> Equivalently: is the number = zero?
* @return {@code true} or {@code false}
*/
public boolean isExposedOnEntry() {
return (number == 0);
}
}