/*
* Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
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 HotSpotMethodData.VMState state;
final HotSpotVMConfig config;
protected HotSpotMethodDataAccessor(HotSpotMethodData.VMState state, int tag, int staticSize) {
this.state = state;
this.config = state.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 exceptionsMask = 1 << config.bitDataExceptionSeenFlag;
return TriState.get((getFlags(data, position) & exceptionsMask) != 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);
}