On Thu, 28 Nov 2024 12:06:13 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> Allow `captureCallState` and `critical(true)` linker options to be combined. 
>> This allows passing a Java array to capture call state.
>> 
>> One caveat is that the linker expects the memory to be aligned, which means 
>> that at least an `int[]` has to be used (i.e. `byte[]` will no work).
>> 
>> This patch contains two implementations: one for the linkers that use 
>> `CallingSequenceBuilder`. That one is quite straight-forward, as we can just 
>> mimic what we already do for other memory segment arguments, but also for 
>> the capture state segment. i.e. split it into base and offset, and pass that 
>> down to our downcall stub. The stub will then add the offset and oop 
>> together, and pass use the resulting address to write to.
>> 
>> The other implementation is for the fallback linker. This handles the 
>> capture state a little differently, but essentially currently just passes 
>> the native address to the back end for the native code to write the captured 
>> state into. I've just added another heap base parameter for that capture 
>> state segment to the back end, which is then turned into a native address 
>> using JNI's `GetPrimitiveArrayCritical`, similarly to what we do for other 
>> heap segments.
>> 
>> Testing: `jdk_foreign` test suite.
>
> src/java.base/share/classes/jdk/internal/foreign/abi/fallback/LibFallback.java
>  line 93:
> 
>> 91:      */
>> 92:     static void doDowncall(MemorySegment cif, MemorySegment target, 
>> MemorySegment retPtr, MemorySegment argPtrs,
>> 93:                            Object captureStateHeapBase, MemorySegment 
>> capturedState, int capturedStateMask,
> 
> I find it a bit weird that this method is receiving both the captured segment 
> base and the segment itself. It almost seems as if the checks we do in 
> `FallbackLinker` should be done here?

I see what you mean, and I agree it looks a bit strange. but we also pass the 
array of heap bases separately here (which is more or less a forced move due to 
how the libffi API works). So, I think the current code is more inline with 
that. The `LibFallback` class is only supposed to be a thin wrapper around the 
native methods in `fallbackLinker.c`. The actual logic is all in 
`FallbackLinker`.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22327#discussion_r1862190619

Reply via email to