RFR: 8256843: [PPC64] runtime/logging/RedefineClasses.java fails with assert: registers not saved on stack
Richard Reingruber
rrich at openjdk.java.net
Mon Dec 14 10:49:55 UTC 2020
On Fri, 11 Dec 2020 10:18:38 GMT, Martin Doerr <mdoerr at openjdk.org> wrote:
>>>
>>> I tested it successfully on Linux and AIX with the fastdebug build (RedefineClasses.java with -XX:+Verbose).
>>
>> Tests succeeded also in slowdebug and release on Linux/PPC64 (-XX:+Verbose is not supported in release though).
>>
>> test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java failed in slowdebug on AIX. But that's no showstopper, is it?
>> My attempt to build also release on AIX failed because of an internal compiler error raised building libharfbuzz.
>
> Thanks for your proposal. I'll try it.
>
>> test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java failed in slowdebug on AIX. But that's no showstopper, is it?
>
> If it fails without this change, it'd be no regression and hence ok.
>
>> My attempt to build also release on AIX failed because of an internal compiler error raised building libharfbuzz.
>
> That's a known xlc bug. Workaround:
> --- a/make/modules/java.desktop/lib/Awt2dLibraries.gmk
> +++ b/make/modules/java.desktop/lib/Awt2dLibraries.gmk
> @@ -475,6 +475,9 @@ else
> #
>
> LIBHARFBUZZ_OPTIMIZATION := HIGH
> + ifeq ($(call isTargetOs, aix), true)
> + LIBHARFBUZZ_OPTIMIZATION := LOW
> + endif
>
> LIBHARFBUZZ_CFLAGS += $(X_CFLAGS) -DLE_STANDALONE -DHEADLESS
Hi Martin
we can even do without _NMT_NOINLINE_.
diff --git a/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp b/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp
index 2eaf38d05cd..83f8af3b751 100644
--- a/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp
+++ b/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp
@@ -159,13 +159,9 @@ frame os::get_sender_for_C_frame(frame* fr) {
frame os::current_frame() {
- intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer());
- // hack.
- frame topframe(csp, (address)0x8);
- // Return sender of sender of current topframe which hopefully
- // both have pc != NULL.
- frame tmp = os::get_sender_for_C_frame(&topframe);
- return os::get_sender_for_C_frame(&tmp);
+ intptr_t* csp = *(intptr_t**) __builtin_frame_address(0);
+ frame topframe(csp, CAST_FROM_FN_PTR(address, os::current_frame));
+ return os::get_sender_for_C_frame(&topframe);
}
bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info,
diff --git a/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp b/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp
index 5d68c4b3407..8e0af2acecc 100644
--- a/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp
+++ b/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp
@@ -179,13 +179,9 @@ frame os::get_sender_for_C_frame(frame* fr) {
frame os::current_frame() {
- intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer());
- // hack.
- frame topframe(csp, (address)0x8);
- // Return sender of sender of current topframe which hopefully
- // both have pc != NULL.
- frame tmp = os::get_sender_for_C_frame(&topframe);
- return os::get_sender_for_C_frame(&tmp);
+ intptr_t* csp = *(intptr_t**) __builtin_frame_address(0);
+ frame topframe(csp, CAST_FROM_FN_PTR(address, os::current_frame));
+ return os::get_sender_for_C_frame(&topframe);
}
bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info,
diff --git a/src/hotspot/share/utilities/nativeCallStack.cpp b/src/hotspot/share/utilities/nativeCallStack.cpp
index 1093a13eaec..45a29424fd7 100644
--- a/src/hotspot/share/utilities/nativeCallStack.cpp
+++ b/src/hotspot/share/utilities/nativeCallStack.cpp
@@ -36,7 +36,7 @@ NativeCallStack::NativeCallStack(int toSkip, bool fillStack) :
// to call os::get_native_stack. A tail call is used if _NMT_NOINLINE_ is not defined
// (which means this is not a slowdebug build), and we are on 64-bit (except Windows).
// This is not necessarily a rule, but what has been obvserved to date.
-#if (defined(_NMT_NOINLINE_) || defined(_WINDOWS) || !defined(_LP64))
+#if (defined(_NMT_NOINLINE_) || defined(_WINDOWS) || !defined(_LP64) || defined(PPC64))
// Not a tail call.
toSkip++;
#if (defined(_NMT_NOINLINE_) && defined(BSD) && defined(_LP64))
diff --git a/test/hotspot/jtreg/runtime/logging/RedefineClasses.java b/test/hotspot/jtreg/runtime/logging/RedefineClasses.java
My manual tests succeed with this on aix and linuxppc64le, except for the slowdebug build on aix where test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java fails with _and_ without the fix.
Currently I don't understand why the result of __builtin_frame_address(0) has to
be dereferenced? Looking at the disassembly of the slowdebug build it returns
the sp of os::current_frame(). The head revision does the same though.
(gdb) disass /s 0x7fffb71ed974,+64
Dump of assembler code from 0x7fffb71ed974 to 0x7fffb71ed9b4:
181 frame os::current_frame() {
0x00007fffb71ed974 <os::current_frame()+0>: addis r2,r12,161
0x00007fffb71ed978 <os::current_frame()+4>: addi r2,r2,-31604
0x00007fffb71ed97c <os::current_frame()+8>: mflr r0
0x00007fffb71ed980 <os::current_frame()+12>: std r0,16(r1)
0x00007fffb71ed984 <os::current_frame()+16>: std r31,-8(r1)
0x00007fffb71ed988 <os::current_frame()+20>: stdu r1,-128(r1)
0x00007fffb71ed98c <os::current_frame()+24>: mr r31,r1
0x00007fffb71ed990 <os::current_frame()+28>: std r3,40(r31)
182 intptr_t* csp = *(intptr_t**) __builtin_frame_address(0);
0x00007fffb71ed994 <os::current_frame()+32>: mr r9,r31
0x00007fffb71ed998 <os::current_frame()+36>: ld r9,0(r9)
0x00007fffb71ed99c <os::current_frame()+40>: std r9,56(r31)
183 // hack.
184 frame topframe(csp, CAST_FROM_FN_PTR(address, os::current_frame));
0x00007fffb71ed9a0 <os::current_frame()+44>: addi r9,r31,64
0x00007fffb71ed9a4 <os::current_frame()+48>: addis r5,r2,-161
0x00007fffb71ed9a8 <os::current_frame()+52>: addi r5,r5,31604
0x00007fffb71ed9ac <os::current_frame()+56>: ld r4,56(r31)
0x00007fffb71ed9b0 <os::current_frame()+60>: mr r3,r9
-------------
PR: https://git.openjdk.java.net/jdk/pull/1724
More information about the hotspot-dev
mailing list