8166929: [JVMCI] Expose decompile counts in MDO
Reviewed-by: twisti
This commit is contained in:
parent
3c1ab21ffa
commit
a777d77fb5
@ -53,9 +53,9 @@ final class HotSpotMethodData {
|
||||
* Reference to the C++ MethodData object.
|
||||
*/
|
||||
final long metaspaceMethodData;
|
||||
@SuppressWarnings("unused") private final HotSpotResolvedJavaMethodImpl method;
|
||||
private final HotSpotResolvedJavaMethodImpl method;
|
||||
|
||||
public HotSpotMethodData(long metaspaceMethodData, HotSpotResolvedJavaMethodImpl method) {
|
||||
HotSpotMethodData(long metaspaceMethodData, HotSpotResolvedJavaMethodImpl method) {
|
||||
this.metaspaceMethodData = metaspaceMethodData;
|
||||
this.method = method;
|
||||
}
|
||||
@ -107,6 +107,18 @@ final class HotSpotMethodData {
|
||||
return UNSAFE.getByte(metaspaceMethodData + config.methodDataOopTrapHistoryOffset + config.deoptReasonOSROffset + reasonIndex) & 0xFF;
|
||||
}
|
||||
|
||||
public int getDecompileCount() {
|
||||
return UNSAFE.getInt(metaspaceMethodData + config.methodDataDecompiles);
|
||||
}
|
||||
|
||||
public int getOverflowRecompileCount() {
|
||||
return UNSAFE.getInt(metaspaceMethodData + config.methodDataOverflowRecompiles);
|
||||
}
|
||||
|
||||
public int getOverflowTrapCount() {
|
||||
return UNSAFE.getInt(metaspaceMethodData + config.methodDataOverflowTraps);
|
||||
}
|
||||
|
||||
public HotSpotMethodDataAccessor getNormalData(int position) {
|
||||
if (position >= normalDataSize()) {
|
||||
return null;
|
||||
@ -214,6 +226,12 @@ final class HotSpotMethodData {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String nl = String.format("%n");
|
||||
String nlIndent = String.format("%n%38s", "");
|
||||
sb.append("Raw method data for ");
|
||||
sb.append(method.format("%H.%n(%p)"));
|
||||
sb.append(":");
|
||||
sb.append(nl);
|
||||
sb.append(String.format("nof_decompiles(%d) nof_overflow_recompiles(%d) nof_overflow_traps(%d)%n",
|
||||
getDecompileCount(), getOverflowRecompileCount(), getOverflowTrapCount()));
|
||||
if (hasNormalData()) {
|
||||
int pos = 0;
|
||||
HotSpotMethodDataAccessor data;
|
||||
@ -427,6 +445,10 @@ final class HotSpotMethodData {
|
||||
|
||||
protected abstract long getTypesNotRecordedExecutionCount(HotSpotMethodData data, int position);
|
||||
|
||||
public int getNonprofiledCount(HotSpotMethodData data, int position) {
|
||||
return data.readUnsignedIntAsSignedInt(position, NONPROFILED_COUNT_OFFSET);
|
||||
}
|
||||
|
||||
private JavaTypeProfile createTypeProfile(TriState nullSeen, RawItemProfile<ResolvedJavaType> profile) {
|
||||
if (profile.entries <= 0 || profile.totalCount <= 0) {
|
||||
return null;
|
||||
@ -462,7 +484,7 @@ final class HotSpotMethodData {
|
||||
TriState nullSeen = getNullSeen(data, pos);
|
||||
TriState exceptionSeen = getExceptionSeen(data, pos);
|
||||
sb.append(format("count(%d) null_seen(%s) exception_seen(%s) nonprofiled_count(%d) entries(%d)", getCounterValue(data, pos), nullSeen, exceptionSeen,
|
||||
getTypesNotRecordedExecutionCount(data, pos), profile.entries));
|
||||
getNonprofiledCount(data, pos), profile.entries));
|
||||
for (int i = 0; i < profile.entries; i++) {
|
||||
long count = profile.counts[i];
|
||||
sb.append(format("%n %s (%d, %4.2f)", profile.items[i].toJavaName(), count, (double) count / profile.totalCount));
|
||||
@ -490,7 +512,7 @@ final class HotSpotMethodData {
|
||||
|
||||
@Override
|
||||
protected long getTypesNotRecordedExecutionCount(HotSpotMethodData data, int position) {
|
||||
return data.readUnsignedIntAsSignedInt(position, NONPROFILED_COUNT_OFFSET);
|
||||
return getNonprofiledCount(data, position);
|
||||
}
|
||||
}
|
||||
|
||||
@ -788,7 +810,8 @@ final class HotSpotMethodData {
|
||||
|
||||
@Override
|
||||
public StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos) {
|
||||
return null;
|
||||
sb.append("unknown profile data with tag: " + tag);
|
||||
return sb;
|
||||
}
|
||||
}
|
||||
|
||||
@ -822,10 +845,10 @@ final class HotSpotMethodData {
|
||||
private static boolean checkAccessorTags() {
|
||||
int expectedTag = 0;
|
||||
for (HotSpotMethodDataAccessor accessor : PROFILE_DATA_ACCESSORS) {
|
||||
if (expectedTag ==0 ) {
|
||||
if (expectedTag == 0) {
|
||||
assert accessor == null;
|
||||
} else {
|
||||
assert accessor.tag == expectedTag: expectedTag + " != " + accessor.tag + " " + accessor;
|
||||
assert accessor.tag == expectedTag : expectedTag + " != " + accessor.tag + " " + accessor;
|
||||
}
|
||||
expectedTag++;
|
||||
}
|
||||
|
@ -57,6 +57,18 @@ public final class HotSpotProfilingInfo implements ProfilingInfo {
|
||||
return method.getCodeSize();
|
||||
}
|
||||
|
||||
public int getDecompileCount() {
|
||||
return methodData.getDecompileCount();
|
||||
}
|
||||
|
||||
public int getOverflowRecompileCount() {
|
||||
return methodData.getOverflowRecompileCount();
|
||||
}
|
||||
|
||||
public int getOverflowTrapCount() {
|
||||
return methodData.getOverflowTrapCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaTypeProfile getTypeProfile(int bci) {
|
||||
if (!isMature) {
|
||||
|
@ -434,7 +434,6 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||
methodData = new HotSpotMethodData(metaspaceMethodData, this);
|
||||
String methodDataFilter = Option.TraceMethodDataFilter.getString();
|
||||
if (methodDataFilter != null && this.format("%H.%n").contains(methodDataFilter)) {
|
||||
System.out.println("Raw method data for " + this.format("%H.%n(%p)") + ":");
|
||||
System.out.println(methodData.toString());
|
||||
}
|
||||
}
|
||||
|
@ -160,6 +160,10 @@ class HotSpotVMConfig extends HotSpotVMConfigAccess {
|
||||
final int methodDataOopTrapHistoryOffset = getFieldOffset("MethodData::_trap_hist._array[0]", Integer.class, "u1");
|
||||
final int methodDataIRSizeOffset = getFieldOffset("MethodData::_jvmci_ir_size", Integer.class, "int");
|
||||
|
||||
final int methodDataDecompiles = getFieldOffset("MethodData::_nof_decompiles", Integer.class, "uint");
|
||||
final int methodDataOverflowRecompiles = getFieldOffset("MethodData::_nof_overflow_recompiles", Integer.class, "uint");
|
||||
final int methodDataOverflowTraps = getFieldOffset("MethodData::_nof_overflow_traps", Integer.class, "uint");
|
||||
|
||||
final int nmethodCompLevelOffset = getFieldOffset("nmethod::_comp_level", Integer.class, "int");
|
||||
|
||||
final int compilationLevelNone = getConstant("CompLevel_none", Integer.class);
|
||||
|
@ -40,6 +40,7 @@
|
||||
|
||||
class InvocationCounter VALUE_OBJ_CLASS_SPEC {
|
||||
friend class VMStructs;
|
||||
friend class JVMCIVMStructs;
|
||||
friend class ciReplay;
|
||||
private: // bit no: |31 3| 2 | 1 0 |
|
||||
unsigned int _counter; // format: [count|carry|state]
|
||||
|
@ -169,6 +169,8 @@
|
||||
nonstatic_field(JVMCIEnv, _task, CompileTask*) \
|
||||
nonstatic_field(JVMCIEnv, _jvmti_can_hotswap_or_post_breakpoint, bool) \
|
||||
\
|
||||
nonstatic_field(InvocationCounter, _counter, unsigned int) \
|
||||
\
|
||||
nonstatic_field(Klass, _secondary_super_cache, Klass*) \
|
||||
nonstatic_field(Klass, _secondary_supers, Array<Klass*>*) \
|
||||
nonstatic_field(Klass, _super, Klass*) \
|
||||
@ -199,13 +201,34 @@
|
||||
volatile_nonstatic_field(Method, _code, CompiledMethod*) \
|
||||
volatile_nonstatic_field(Method, _from_compiled_entry, address) \
|
||||
\
|
||||
nonstatic_field(MethodCounters, _nmethod_age, int) \
|
||||
nonstatic_field(MethodCounters, _interpreter_invocation_limit, int) \
|
||||
nonstatic_field(MethodCounters, _interpreter_backward_branch_limit, int) \
|
||||
nonstatic_field(MethodCounters, _interpreter_profile_limit, int) \
|
||||
nonstatic_field(MethodCounters, _invoke_mask, int) \
|
||||
nonstatic_field(MethodCounters, _backedge_mask, int) \
|
||||
nonstatic_field(MethodCounters, _interpreter_invocation_count, int) \
|
||||
nonstatic_field(MethodCounters, _interpreter_throwout_count, u2) \
|
||||
JVMTI_ONLY(nonstatic_field(MethodCounters, _number_of_breakpoints, u2)) \
|
||||
nonstatic_field(MethodCounters, _invocation_counter, InvocationCounter) \
|
||||
nonstatic_field(MethodCounters, _backedge_counter, InvocationCounter) \
|
||||
\
|
||||
nonstatic_field(MethodData, _size, int) \
|
||||
nonstatic_field(MethodData, _method, Method*) \
|
||||
nonstatic_field(MethodData, _data_size, int) \
|
||||
nonstatic_field(MethodData, _data[0], intptr_t) \
|
||||
nonstatic_field(MethodData, _parameters_type_data_di, int) \
|
||||
nonstatic_field(MethodData, _nof_decompiles, uint) \
|
||||
nonstatic_field(MethodData, _nof_overflow_recompiles, uint) \
|
||||
nonstatic_field(MethodData, _nof_overflow_traps, uint) \
|
||||
nonstatic_field(MethodData, _trap_hist._array[0], u1) \
|
||||
nonstatic_field(MethodData, _eflags, intx) \
|
||||
nonstatic_field(MethodData, _arg_local, intx) \
|
||||
nonstatic_field(MethodData, _arg_stack, intx) \
|
||||
nonstatic_field(MethodData, _arg_returned, intx) \
|
||||
nonstatic_field(MethodData, _tenure_traps, uint) \
|
||||
nonstatic_field(MethodData, _invoke_mask, int) \
|
||||
nonstatic_field(MethodData, _backedge_mask, int) \
|
||||
nonstatic_field(MethodData, _jvmci_ir_size, int) \
|
||||
\
|
||||
nonstatic_field(nmethod, _verified_entry_point, address) \
|
||||
@ -290,6 +313,7 @@
|
||||
declare_toplevel_type(ExceptionTableElement) \
|
||||
declare_toplevel_type(Flag) \
|
||||
declare_toplevel_type(Flag*) \
|
||||
declare_toplevel_type(InvocationCounter) \
|
||||
declare_toplevel_type(JVMCIEnv) \
|
||||
declare_toplevel_type(LocalVariableTableElement) \
|
||||
declare_toplevel_type(narrowKlass) \
|
||||
|
Loading…
Reference in New Issue
Block a user