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}