changeset 51377:e7519209f7ff

8203481: Incorrect constraint for unextended_sp in frame:safe_for_sender Summary: Relaxed assert inside safe_for_sender Reviewed-by: aph, dpochepk
author dsamersoff
date Sun, 24 Jun 2018 15:02:08 +0300
parents 7348c41ca46d
children 6c306d54366d
files src/hotspot/cpu/aarch64/frame_aarch64.cpp
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/cpu/aarch64/frame_aarch64.cpp	Sun Jun 24 10:41:51 2018 +0200
+++ b/src/hotspot/cpu/aarch64/frame_aarch64.cpp	Sun Jun 24 15:02:08 2018 +0300
@@ -71,9 +71,20 @@
     return false;
   }
 
-  // unextended sp must be within the stack and above or equal sp
-  bool unextended_sp_safe = (unextended_sp < thread->stack_base()) &&
-                            (unextended_sp >= sp);
+  // When we are running interpreted code the machine stack pointer, SP, is
+  // set low enough so that the Java expression stack can grow and shrink
+  // without ever exceeding the machine stack bounds.  So, ESP >= SP.
+
+  // When we call out of an interpreted method, SP is incremented so that
+  // the space between SP and ESP is removed.  The SP saved in the callee's
+  // frame is the SP *before* this increment.  So, when we walk a stack of
+  // interpreter frames the sender's SP saved in a frame might be less than
+  // the SP at the point of call.
+
+  // So unextended sp must be within the stack but we need not to check
+  // that unextended sp >= sp
+
+  bool unextended_sp_safe = (unextended_sp < thread->stack_base());
 
   if (!unextended_sp_safe) {
     return false;