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 MethodData. This is similar to ProfilingInfo, but most methods require a HotSpotMethodData and the exact position within the method data.
/** * 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.
Returns:tag stored in the LayoutData header
/** * 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.
Returns:an integer between 0 and Short.MAX_VALUE inclusive, or -1 if not supported
/** * 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.
Returns:a value greater than 0
/** * 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); }
Params:
  • data –
  • position –
/** * @param data * @param position */
JavaTypeProfile getTypeProfile(HotSpotMethodData data, int position) { return null; }
Params:
  • data –
  • position –
/** * @param data * @param position */
JavaMethodProfile getMethodProfile(HotSpotMethodData data, int position) { return null; }
Params:
  • data –
  • position –
/** * @param data * @param position */
double getBranchTakenProbability(HotSpotMethodData data, int position) { return -1; }
Params:
  • data –
  • position –
/** * @param data * @param position */
double[] getSwitchProbabilities(HotSpotMethodData data, int position) { return null; }
Params:
  • data –
  • position –
/** * @param data * @param position */
int getExecutionCount(HotSpotMethodData data, int position) { return -1; }
Params:
  • data –
  • position –
/** * @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); }
Params:
  • data –
  • position –
/** * @param data * @param position */
protected int getDynamicSize(HotSpotMethodData data, int position) { return 0; } abstract StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos); }