@@ -114,9 +114,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
114
114
return false ;
115
115
}
116
116
117
- abi_minframe* sender_abi = (abi_minframe*) fp;
117
+ volatile abi_minframe* sender_abi = (abi_minframe*) fp; // May get updated concurrently by deoptimization!
118
118
intptr_t * sender_sp = (intptr_t *) fp;
119
- address sender_pc = (address) sender_abi->lr ;;
119
+ address sender_pc = (address) sender_abi->lr ;
120
120
121
121
// We must always be able to find a recognizable pc.
122
122
CodeBlob* sender_blob = CodeCache::find_blob_unsafe (sender_pc);
@@ -129,9 +129,20 @@ bool frame::safe_for_sender(JavaThread *thread) {
129
129
return false ;
130
130
}
131
131
132
+ intptr_t * unextended_sender_sp = is_interpreted_frame () ? (intptr_t *)get_ijava_state ()->sender_sp : sender_sp;
133
+
132
134
// It should be safe to construct the sender though it might not be valid.
133
135
134
- frame sender (sender_sp, sender_pc);
136
+ // JDK-8339386 is different than the upstream version:
137
+ // The frame constructor doesn't check sanity of a deopt pc, but determines it.
138
+ // Other accessors for reading it are not available in 17u.
139
+ frame sender (sender_sp, sender_pc, unextended_sender_sp);
140
+ // If the sender is a deoptimized nmethod we need to check if the original pc is valid.
141
+ nmethod* sender_nm = sender_blob->as_nmethod_or_null ();
142
+ if (sender_nm != nullptr && sender._deopt_state == is_deoptimized) {
143
+ address orig_pc = sender.pc ();
144
+ if (!sender_nm->insts_contains_inclusive (orig_pc)) return false ;
145
+ }
135
146
136
147
// Do we have a valid fp?
137
148
address sender_fp = (address) sender.fp ();
0 commit comments