RFR: 8313800: AArch64: SA stack walking code having trouble finding sender frame when invoking LambdaForms is involved [v2]
Fei Yang
fyang at openjdk.org
Tue Sep 12 06:01:39 UTC 2023
On Fri, 8 Sep 2023 12:34:39 GMT, Andrew Haley <aph at openjdk.org> wrote:
>> This PR fixes a specific problem caused by using r29/rfp to unwind Java code. For some time we have treated r29 as a callee-saved scratch register, and it is freely used by C2-generated code. Therefore, any code in SA that uses getFP() in a compiled frame is very likely to come to grief.
>>
>> I believe this is the root cause of 8313800, but it's very hard to prove that because because it's something of an intermittent fault.
>
> Andrew Haley has updated the pull request incrementally with one additional commit since the last revision:
>
> Duplicated comment
Neither can I reproduce this issue on linux-riscv64 platform with jdk/jdk tip. But it has the same settings for the x8/fp register and context, I guess it also bears the same problem.
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java
index 90d070112db..b21a163e970 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java
@@ -322,24 +322,17 @@ private Frame senderForEntryFrame(RISCV64RegisterMap map) {
//------------------------------------------------------------------------------
// frame::adjust_unextended_sp
private void adjustUnextendedSP() {
- // If we are returning to a compiled MethodHandle call site, the
- // saved_fp will in fact be a saved value of the unextended SP. The
- // simplest way to tell whether we are returning to such a call site
- // is as follows:
+ // Sites calling method handle intrinsics and lambda forms are
+ // treated as any other call site. Therefore, no special action is
+ // needed when we are returning to any of these call sites.
CodeBlob cb = cb();
NMethod senderNm = (cb == null) ? null : cb.asNMethodOrNull();
if (senderNm != null) {
- // If the sender PC is a deoptimization point, get the original
- // PC. For MethodHandle call site the unextended_sp is stored in
- // saved_fp.
- if (senderNm.isDeoptMhEntry(getPC())) {
- raw_unextendedSP = getFP();
- }
- else if (senderNm.isDeoptEntry(getPC())) {
- }
- else if (senderNm.isMethodHandleReturn(getPC())) {
- raw_unextendedSP = getFP();
+ // If the sender PC is a deoptimization point, get the original PC.
+ if (senderNm.isDeoptEntry(getPC()) ||
+ senderNm.isDeoptMhEntry(getPC())) {
+ // DEBUG_ONLY(verifyDeoptriginalPc(senderNm, raw_unextendedSp));
}
}
}
-------------
PR Comment: https://git.openjdk.org/jdk/pull/15624#issuecomment-1715030409
More information about the serviceability-dev
mailing list