RFR: 8259937: guarantee(loc != NULL) failed: missing saved register with native invoker [v4]
Vladimir Ivanov
vlivanov at openjdk.java.net
Fri Feb 26 16:10:40 UTC 2021
On Wed, 24 Feb 2021 16:12:59 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> We spotted this issue with Shenandoah and I managed to write a simple
>> test case that reproduces it reliably with Shenandoah but the issue is
>> independent of the GC.
>>
>> The loop in the test case calls a native invoker with an oop live in
>> rbp. rbp is saved in the native invoker stub's frame. A safepoint is
>> triggered from the safepoint check in the native invoker. The stack
>> walking code sees that rbp contains an oop but can't find where that
>> oop is stored. That's because stack walking updates the caller's frame
>> with the location of rbp in the callee on calls to
>> frame::sender(). But the current code sets the last java frame to be
>> the compiled frame where rbp is live. So there's no call to
>> frame::sender() to update the location rbp. The fix I propose is that
>> the frame of the native invoker be visible by stack walking. On a
>> safepoint, stack walking starts from the native invoker thread, then
>> calls frame::sender() to move to the compiled frame. That causes rbp
>> to be properly recorded with its location in the native invoker frame.
>>
>> Same problem affects both x86 and aarch64. I've tested this patch with:
>>
>> make run-test TEST="java/foreign" TEST_VM_OPTS="-Xcomp" JTREG="TIMEOUT_FACTOR=10"
>>
>> on both platforms.
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
>
> Revert "test & debug"
>
> This reverts commit cb9dd24c9fcccc6997e9fca874e2860f966b9576.
Marked as reviewed by vlivanov (Reviewer).
-------------
PR: https://git.openjdk.java.net/jdk/pull/2528
More information about the hotspot-compiler-dev
mailing list