blob: 6edff1da0a118dc1abf8cf25d48b3234d0179130 [file] [log] [blame]
package jdk.vm.ci.hotspot;
import jdk.vm.ci.meta.JavaMethodProfile;
import jdk.vm.ci.meta.JavaTypeProfile;
import jdk.vm.ci.meta.ProfilingInfo;
import jdk.vm.ci.meta.TriState;
/**
* Base class for accessing the different kinds of data in a HotSpot {@code MethodData}. This is
* similar to {@link ProfilingInfo}, but most methods require a {@link HotSpotMethodData} and the
* exact position within the method data.
*/
abstract class HotSpotMethodDataAccessor {
final int tag;
final int staticSize;
final HotSpotVMConfig config;
protected HotSpotMethodDataAccessor(HotSpotVMConfig config, int tag, int staticSize) {
this.config = config;
this.tag = tag;
this.staticSize = staticSize;
}
/**
* Returns the tag stored in the LayoutData header.
*
* @return tag stored in the LayoutData header
*/
int getTag() {
return tag;
}
static int readTag(HotSpotVMConfig config, HotSpotMethodData data, int position) {
final int tag = data.readUnsignedByte(position, config.dataLayoutTagOffset);
assert tag >= config.dataLayoutNoTag && tag <= config.dataLayoutSpeculativeTrapDataTag : "profile data tag out of bounds: " + tag;
return tag;
}
/**
* Returns the BCI stored in the LayoutData header.
*
* @return an integer between 0 and {@link Short#MAX_VALUE} inclusive, or -1 if not supported
*/
int getBCI(HotSpotMethodData data, int position) {
return data.readUnsignedShort(position, config.dataLayoutBCIOffset);
}
/**
* Computes the size for the specific data at the given position.
*
* @return a value greater than 0
*/
final int getSize(HotSpotMethodData data, int position) {
int size = staticSize + getDynamicSize(data, position);
// Sanity check against VM
int vmSize = HotSpotJVMCIRuntime.runtime().compilerToVm.methodDataProfileDataSize(data.metaspaceMethodData, position);
assert size == vmSize : size + " != " + vmSize;
return size;
}
TriState getExceptionSeen(HotSpotMethodData data, int position) {
final int EXCEPTIONS_MASK = 1 << config.bitDataExceptionSeenFlag;
return TriState.get((getFlags(data, position) & EXCEPTIONS_MASK) != 0);
}
/**
* @param data
* @param position
*/
JavaTypeProfile getTypeProfile(HotSpotMethodData data, int position) {
return null;
}
/**
* @param data
* @param position
*/
JavaMethodProfile getMethodProfile(HotSpotMethodData data, int position) {
return null;
}
/**
* @param data
* @param position
*/
double getBranchTakenProbability(HotSpotMethodData data, int position) {
return -1;
}
/**
* @param data
* @param position
*/
double[] getSwitchProbabilities(HotSpotMethodData data, int position) {
return null;
}
/**
* @param data
* @param position
*/
int getExecutionCount(HotSpotMethodData data, int position) {
return -1;
}
/**
* @param data
* @param position
*/
TriState getNullSeen(HotSpotMethodData data, int position) {
return TriState.UNKNOWN;
}
protected int getFlags(HotSpotMethodData data, int position) {
return data.readUnsignedByte(position, config.dataLayoutFlagsOffset);
}
/**
* @param data
* @param position
*/
protected int getDynamicSize(HotSpotMethodData data, int position) {
return 0;
}
abstract StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos);
}