aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/x86/vm/frame_x86.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86/vm/frame_x86.cpp')
-rw-r--r--src/cpu/x86/vm/frame_x86.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/cpu/x86/vm/frame_x86.cpp b/src/cpu/x86/vm/frame_x86.cpp
index 1a3364313..4cadc43ca 100644
--- a/src/cpu/x86/vm/frame_x86.cpp
+++ b/src/cpu/x86/vm/frame_x86.cpp
@@ -370,13 +370,16 @@ frame frame::sender_for_entry_frame(RegisterMap* map) const {
JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
assert(!entry_frame_is_first(), "next Java fp must be non zero");
assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
+ // Since we are walking the stack now this nested anchor is obviously walkable
+ // even if it wasn't when it was stacked.
+ if (!jfa->walkable()) {
+ // Capture _last_Java_pc (if needed) and mark anchor walkable.
+ jfa->capture_last_Java_pc();
+ }
map->clear();
assert(map->include_argument_oops(), "should be set by clear");
- if (jfa->last_Java_pc() != NULL ) {
- frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc());
- return fr;
- }
- frame fr(jfa->last_Java_sp(), jfa->last_Java_fp());
+ assert(jfa->last_Java_pc() != NULL, "not walkable");
+ frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc());
return fr;
}
@@ -714,3 +717,21 @@ frame::frame(void* sp, void* fp, void* pc) {
init((intptr_t*)sp, (intptr_t*)fp, (address)pc);
}
#endif
+
+void JavaFrameAnchor::make_walkable(JavaThread* thread) {
+ // last frame set?
+ if (last_Java_sp() == NULL) return;
+ // already walkable?
+ if (walkable()) return;
+ assert(Thread::current() == (Thread*)thread, "not current thread");
+ assert(last_Java_sp() != NULL, "not called from Java code?");
+ assert(last_Java_pc() == NULL, "already walkable");
+ capture_last_Java_pc();
+ assert(walkable(), "something went wrong");
+}
+
+void JavaFrameAnchor::capture_last_Java_pc() {
+ assert(_last_Java_sp != NULL, "no last frame set");
+ assert(_last_Java_pc == NULL, "already walkable");
+ _last_Java_pc = (address)_last_Java_sp[-1];
+}