Skip to content

Commit 972a763

Browse files
committed
Backport 9a25f822fb2529c1cae3ae909761381789d7b7b1
1 parent 6531254 commit 972a763

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

src/hotspot/cpu/ppc/frame_ppc.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
114114
return false;
115115
}
116116

117-
abi_minframe* sender_abi = (abi_minframe*) fp;
117+
volatile abi_minframe* sender_abi = (abi_minframe*) fp; // May get updated concurrently by deoptimization!
118118
intptr_t* sender_sp = (intptr_t*) fp;
119-
address sender_pc = (address) sender_abi->lr;;
119+
address sender_pc = (address) sender_abi->lr;
120120

121121
// We must always be able to find a recognizable pc.
122122
CodeBlob* sender_blob = CodeCache::find_blob_unsafe(sender_pc);
@@ -129,9 +129,18 @@ bool frame::safe_for_sender(JavaThread *thread) {
129129
return false;
130130
}
131131

132+
intptr_t* unextended_sender_sp = is_interpreted_frame() ? interpreter_frame_sender_sp() : sender_sp;
133+
134+
// If the sender is a deoptimized nmethod we need to check if the original pc is valid.
135+
nmethod* sender_nm = sender_blob->as_nmethod_or_null();
136+
if (sender_nm != nullptr && sender_nm->is_deopt_pc(sender_pc)) {
137+
address orig_pc = *(address*)((address)unextended_sender_sp + sender_nm->orig_pc_offset());
138+
if (!sender_nm->insts_contains_inclusive(orig_pc)) return false;
139+
}
140+
132141
// It should be safe to construct the sender though it might not be valid.
133142

134-
frame sender(sender_sp, sender_pc);
143+
frame sender(sender_sp, sender_pc, unextended_sender_sp, nullptr /* fp */, sender_blob);
135144

136145
// Do we have a valid fp?
137146
address sender_fp = (address) sender.fp();

0 commit comments

Comments
 (0)