< prev index next >
src/share/vm/jvmci/jvmciCompilerToVM.cpp
Print this page
rev 9956 : 8146424: runtime/ReservedStack/ReservedStackTest.java triggers: assert(thread->deopt_mark() == __null) failed: no stack overflow from deopt blob/uncommon trap
@@ -147,10 +147,12 @@
HeapWord** CompilerToVM::Data::_heap_top_addr;
jbyte* CompilerToVM::Data::cardtable_start_address;
int CompilerToVM::Data::cardtable_shift;
+int CompilerToVM::Data::vm_page_size;
+
void CompilerToVM::Data::initialize() {
InstanceKlass_vtable_start_offset = InstanceKlass::vtable_start_offset();
InstanceKlass_vtable_length_offset = InstanceKlass::vtable_length_offset() * HeapWordSize;
Method_extra_stack_entries = Method::extra_stack_entries();
@@ -196,10 +198,12 @@
break;
default:
ShouldNotReachHere();
break;
}
+
+ vm_page_size = os::vm_page_size();
}
/**
* We put all jvmciHotSpotVM values in an array so we can read them easily from Java.
*/
@@ -1386,20 +1390,57 @@
}
}
THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid profile data position %d", position));
C2V_END
+C2V_VMENTRY(int, interpreterFrameSize, (JNIEnv*, jobject, jobject bytecode_frame_handle))
+ if (bytecode_frame_handle == NULL) {
+ THROW_0(vmSymbols::java_lang_NullPointerException());
+ }
+
+ oop top_bytecode_frame = JNIHandles::resolve_non_null(bytecode_frame_handle);
+ oop bytecode_frame = top_bytecode_frame;
+ int size = 0;
+ int callee_parameters = 0;
+ int callee_locals = 0;
+ Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
+ int extra_args = method->max_stack() - BytecodeFrame::numStack(bytecode_frame);
+
+ while (bytecode_frame != NULL) {
+ int locks = BytecodeFrame::numLocks(bytecode_frame);
+ int temps = BytecodeFrame::numStack(bytecode_frame);
+ bool is_top_frame = (bytecode_frame == top_bytecode_frame);
+ Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
+
+ int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(),
+ temps + callee_parameters,
+ extra_args,
+ locks,
+ callee_parameters,
+ callee_locals,
+ is_top_frame);
+ size += frame_size;
+
+ callee_parameters = method->size_of_parameters();
+ callee_locals = method->max_locals();
+ extra_args = 0;
+ bytecode_frame = BytecodePosition::caller(bytecode_frame);
+ }
+ return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord;
+C2V_END
+
#define CC (char*) /*cast a literal from (const char*)*/
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f))
#define STRING "Ljava/lang/String;"
#define OBJECT "Ljava/lang/Object;"
#define CLASS "Ljava/lang/Class;"
#define STACK_TRACE_ELEMENT "Ljava/lang/StackTraceElement;"
#define INSTALLED_CODE "Ljdk/vm/ci/code/InstalledCode;"
#define TARGET_DESCRIPTION "Ljdk/vm/ci/code/TargetDescription;"
+#define BYTECODE_FRAME "Ljdk/vm/ci/code/BytecodeFrame;"
#define RESOLVED_METHOD "Ljdk/vm/ci/meta/ResolvedJavaMethod;"
#define HS_RESOLVED_METHOD "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;"
#define HS_RESOLVED_KLASS "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;"
#define HS_CONSTANT_POOL "Ljdk/vm/ci/hotspot/HotSpotConstantPool;"
#define HS_COMPILED_CODE "Ljdk/vm/ci/hotspot/HotSpotCompiledCode;"
@@ -1466,10 +1507,11 @@
{CC"materializeVirtualObjects", CC"("HS_STACK_FRAME_REF"Z)V", FN_PTR(materializeVirtualObjects)},
{CC"shouldDebugNonSafepoints", CC"()Z", FN_PTR(shouldDebugNonSafepoints)},
{CC"writeDebugOutput", CC"([BII)V", FN_PTR(writeDebugOutput)},
{CC"flushDebugOutput", CC"()V", FN_PTR(flushDebugOutput)},
{CC"methodDataProfileDataSize", CC"(JI)I", FN_PTR(methodDataProfileDataSize)},
+ {CC"interpreterFrameSize", CC"("BYTECODE_FRAME")I", FN_PTR(interpreterFrameSize)},
};
int CompilerToVM::methods_count() {
return sizeof(methods) / sizeof(JNINativeMethod);
}
< prev index next >