[foreign-memaccess+abi] RFR: 8274912: Eagerly generate native invokers

Nick Gasson ngasson at openjdk.java.net
Mon Oct 11 07:53:16 UTC 2021


On Thu, 7 Oct 2021 14:29:47 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:

> Hi,
> 
> This patch is a refactoring of VM code pertaining to downcalls. As outlined in the JBS issue, this patch makes 'native invoker' generation currently done by C2 eager.
> 
> Most of the changes in this patch are moving around existing code:
> - The native invoker generation code is moved from sharedRuntime*.cpp to universalNativeInvoker*.cpp, to match what is done for upcalls.
> - C2 & nmethod scaffolding for registering native invokers has been removed (lifetime is now managed in Java code).
> - Now, C2 will only intrinsify trivial downcalls, which means some of the code was simplified there.
> - To reduce code duplication, several utilities have been added:
>   - ArgumentShuffle (and impls of CallConvClosure): a utility class for computing argument shuffles and generating shuffling code. The shuffling code is heavily based on what is done today for optimized upcalls on x64.
>   - To support the above, I've made a copy of the ComputeMoveOrder utility from SharedRuntime code (which was only implemented on x64), and adapted it to our use case.
>   - RegSpillFill: similarly, a utility for computing and generating register spill and fill code (given a list of registers).
>   - oop_cast: this was a pre-existing utility that was renamed (from 'cast') and moved into a separate file.
> - The linkToNative method handle stub now just loads the invoker address from the appendix argument and jumps to it, instead of jumping to the fallback method handle.
> 
> The implementation passes all the jdk_foreign tests on Windows/x64, Linux/x64 (WSL), and Linux/AArch64. Though, there were some pre-exsiting test failures on AArch64 wrt variadic functions.
> 
> Thanks,
> Jorn

AArch64 changes look fine, just a couple of trivial naming comments. I'm also seeing the varargs test failure now on the foreign-memaccess+abi branch.

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp line 296:

> 294: }
> 295: 
> 296: void MacroAssembler::safepoint_poll(Label& slow_path, bool at_return, bool acquire, bool in_nmethod, Register scratch) {

Perhaps rename the `scratch` argument to `tmp` here and below as that's what most of the other MacroAssembler functions are using (and it avoids the visual similarity between `scratch` and `rscratch1`).

src/hotspot/cpu/aarch64/universalNativeInvoker_aarch64.cpp line 231:

> 229:     rbp_off2,
> 230:     return_off,
> 231:     return_off2,

It's a bit weird that we use the x86 register names here (although sharedRuntime_aarch64.cpp has this already). `rfp_off` and `lr_off` would be more accurate.

-------------

Marked as reviewed by ngasson (no project role).

PR: https://git.openjdk.java.net/panama-foreign/pull/593


More information about the panama-dev mailing list