changeset 11816:3fcea91bb5a8

8133749: os::current_frame() is not returning the proper frame on ARM and solaris-x64 Summary: Need to go up one extra frame to be consistent with other platforms. Reviewed-by: dholmes, zgu
author cjplummer
date Mon, 15 Aug 2016 13:06:50 -0700
parents 0b3116993972
children 8f2230e4c0ed
files src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp	Mon Aug 15 16:15:16 2016 +0200
+++ b/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp	Mon Aug 15 13:06:50 2016 -0700
@@ -292,15 +292,19 @@
 
 frame os::current_frame() {
   intptr_t* fp = _get_current_fp();  // it's inlined so want current fp
+  // fp is for os::current_frame. We want the fp for our caller.
   frame myframe((intptr_t*)os::current_stack_pointer(),
                 (intptr_t*)fp,
                 CAST_FROM_FN_PTR(address, os::current_frame));
-  if (os::is_first_C_frame(&myframe)) {
+  frame caller_frame = os::get_sender_for_C_frame(&myframe);
+
+  if (os::is_first_C_frame(&caller_frame)) {
     // stack is not walkable
     frame ret; // This will be a null useless frame
     return ret;
   } else {
-    return os::get_sender_for_C_frame(&myframe);
+    // return frame for our caller's caller
+    return os::get_sender_for_C_frame(&caller_frame);
   }
 }