8261846: [JVMCI] c2v_iterateFrames can get out of sync with the StackFrameStream

Reviewed-by: kvn
This commit is contained in:
Tom Rodriguez 2021-02-18 06:35:42 +00:00
parent b8fd61420c
commit 97e1657ba2
3 changed files with 14 additions and 5 deletions

View file

@ -1230,7 +1230,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
jobjectArray methods = initial_methods; jobjectArray methods = initial_methods;
int frame_number = 0; int frame_number = 0;
vframe* vf = vframe::new_vframe(fst.current(), fst.register_map(), thread); vframe* vf = vframe::new_vframe(fst, thread);
while (true) { while (true) {
// look for the given method // look for the given method
@ -1340,7 +1340,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
if (fst.current()->sp() != stack_pointer) { if (fst.current()->sp() != stack_pointer) {
THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "stack frame not found after deopt") THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "stack frame not found after deopt")
} }
vf = vframe::new_vframe(fst.current(), fst.register_map(), thread); vf = vframe::new_vframe(fst, thread);
if (!vf->is_compiled_frame()) { if (!vf->is_compiled_frame()) {
THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "compiled stack frame expected") THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "compiled stack frame expected")
} }
@ -1367,7 +1367,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
break; break;
} }
fst.next(); fst.next();
vf = vframe::new_vframe(fst.current(), fst.register_map(), thread); vf = vframe::new_vframe(fst, thread);
frame_number = 0; frame_number = 0;
} // end of frame loop } // end of frame loop

View file

@ -63,6 +63,14 @@ vframe::vframe(const frame* fr, JavaThread* thread)
_fr = *fr; _fr = *fr;
} }
vframe* vframe::new_vframe(StackFrameStream& fst, JavaThread* thread) {
if (fst.current()->is_runtime_frame()) {
fst.next();
}
guarantee(!fst.is_done(), "missing caller");
return new_vframe(fst.current(), fst.register_map(), thread);
}
vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThread* thread) { vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThread* thread) {
// Interpreter frame // Interpreter frame
if (f->is_interpreted_frame()) { if (f->is_interpreted_frame()) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -60,8 +60,9 @@ class vframe: public ResourceObj {
vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread); vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread);
vframe(const frame* fr, JavaThread* thread); vframe(const frame* fr, JavaThread* thread);
public: public:
// Factory method for creating vframes // Factory methods for creating vframes
static vframe* new_vframe(const frame* f, const RegisterMap *reg_map, JavaThread* thread); static vframe* new_vframe(const frame* f, const RegisterMap *reg_map, JavaThread* thread);
static vframe* new_vframe(StackFrameStream& fst, JavaThread* thread);
// Accessors // Accessors
frame fr() const { return _fr; } frame fr() const { return _fr; }