Mercurial > hg > graal-jvmci-8
diff jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMethodDataAccessor.java @ 23717:41fa89f93355
removed jdk.vm.ci.hotspot.HotSpotMethodDataAccessor.Tag (JDK-8159613)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 30 Jun 2016 22:07:57 +0200 |
parents | 4b58c92e939b |
children | a52d7039723b |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMethodDataAccessor.java Fri Jul 01 13:31:04 2016 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMethodDataAccessor.java Thu Jun 30 22:07:57 2016 +0200 @@ -1,110 +1,129 @@ -/* - * Copyright (c) 2011, 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 static jdk.vm.ci.hotspot.HotSpotVMConfig.config; import jdk.vm.ci.meta.JavaMethodProfile; import jdk.vm.ci.meta.JavaTypeProfile; import jdk.vm.ci.meta.ProfilingInfo; import jdk.vm.ci.meta.TriState; /** - * Interface for accessor objects that encapsulate the logic for accessing the different kinds of - * data in a HotSpot methodDataOop. This interface is similar to the interface {@link ProfilingInfo} - * , but most methods require a MethodDataObject and the exact position within the methodData. + * 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. */ -public interface HotSpotMethodDataAccessor { +abstract class HotSpotMethodDataAccessor { - /** - * {@code DataLayout} tag values. - */ - enum Tag { - No(config().dataLayoutNoTag), - BitData(config().dataLayoutBitDataTag), - CounterData(config().dataLayoutCounterDataTag), - JumpData(config().dataLayoutJumpDataTag), - ReceiverTypeData(config().dataLayoutReceiverTypeDataTag), - VirtualCallData(config().dataLayoutVirtualCallDataTag), - RetData(config().dataLayoutRetDataTag), - BranchData(config().dataLayoutBranchDataTag), - MultiBranchData(config().dataLayoutMultiBranchDataTag), - ArgInfoData(config().dataLayoutArgInfoDataTag), - CallTypeData(config().dataLayoutCallTypeDataTag), - VirtualCallTypeData(config().dataLayoutVirtualCallTypeDataTag), - ParametersTypeData(config().dataLayoutParametersTypeDataTag), - SpeculativeTrapData(config().dataLayoutSpeculativeTrapDataTag); + final int tag; + final int staticSize; + final HotSpotVMConfig config; - private final int value; - - Tag(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static Tag getEnum(int value) { - Tag result = values()[value]; - assert value == result.value; - return result; - } + protected HotSpotMethodDataAccessor(HotSpotVMConfig config, int tag, int staticSize) { + this.config = config; + this.tag = tag; + this.staticSize = staticSize; } /** - * Returns the {@link Tag} stored in the LayoutData header. + * Returns the tag stored in the LayoutData header. * * @return tag stored in the LayoutData header */ - Tag getTag(); + 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 ≥ 0 and ≤ Short.MAX_VALUE, or -1 if not supported. + * @return an integer between 0 and {@link Short#MAX_VALUE} inclusive, or -1 if not supported */ - int getBCI(HotSpotMethodData data, int position); + int getBCI(HotSpotMethodData data, int position) { + return data.readUnsignedShort(position, config.dataLayoutBCIOffset); + } /** * Computes the size for the specific data at the given position. * - * @return An integer > 0. + * @return a value greater than 0 */ - int getSize(HotSpotMethodData data, int position); + 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); + } - JavaTypeProfile getTypeProfile(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + JavaTypeProfile getTypeProfile(HotSpotMethodData data, int position) { + return null; + } - JavaMethodProfile getMethodProfile(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + JavaMethodProfile getMethodProfile(HotSpotMethodData data, int position) { + return null; + } - double getBranchTakenProbability(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + double getBranchTakenProbability(HotSpotMethodData data, int position) { + return -1; + } - double[] getSwitchProbabilities(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + double[] getSwitchProbabilities(HotSpotMethodData data, int position) { + return null; + } - TriState getExceptionSeen(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + int getExecutionCount(HotSpotMethodData data, int position) { + return -1; + } - TriState getNullSeen(HotSpotMethodData data, int 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); + } - int getExecutionCount(HotSpotMethodData data, int position); + /** + * @param data + * @param position + */ + protected int getDynamicSize(HotSpotMethodData data, int position) { + return 0; + } - StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos); + abstract StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos); + }