On Mon, 13 Mar 2023 20:57:22 GMT, Martin Doerr <mdo...@openjdk.org> wrote:
> Note that argument and return value passing works. I'm getting all values > back. So, the native side seems to be ok. Only (one or two) values in > `returnBox` are broken. You mean you tested by returning each element of the array one by one? If so, that rules out an issue with the downcall, or the struct not being in the right format (in the register), I think. I suggest checking the bindings generated for the upcall, and seeing if they match what the native code does. This could be done in `jshell` for instance: $ .\build\windows-fastdebug\images\jdk\bin\jshell.exe --enable-preview '--add-exports=java.base/jdk.internal.foreign.abi.x64.windows=ALL-UNNAMED' '--add-exports=java.base/jdk.internal.foreign.abi=ALL-UNNAMED' jshell> import java.lang.foreign.* jshell> import java.lang.invoke.* jshell> import static java.lang.foreign.ValueLayout.* jshell> import jdk.internal.foreign.abi.x64.windows.CallArranger jshell> MemoryLayout.structLayout(MemoryLayout.sequenceLayout(8, JAVA_BYTE)) $5 ==> [[8:b8]] jshell> FunctionDescriptor.of($5, $5, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE, JAVA_BYTE) $6 ==> ([[8:b8]]b8b8b8b8b8b8b8b8)[[8:b8]] jshell> CallArranger.getBindings($6.toMethodType(), $6, true) $7 ==> Bindings[callingSequence=jdk.internal.foreign.abi.CallingSequence@396e2f39, isInMemoryReturn=false] jshell> System.out.println($7.callingSequence().asString()) CallingSequence: { callerMethodType: (long,int,int,int,int,int,int,int,int)long calleeMethodType: (MemorySegment,byte,byte,byte,byte,byte,byte,byte,byte)MemorySegment FunctionDescriptor: ([[8:b8]]b8b8b8b8b8b8b8b8)[[8:b8]] Argument Bindings: 0: [Allocate[size=8, alignment=1], Dup[], VMLoad[storage=VMStorage[type=0, segmentMaskOrSize=15, indexOrOffset=1, debugName=rcx], type=long], BufferStore[offset=0, type=long, byteWidth=8]] 1: [VMLoad[storage=VMStorage[type=0, segmentMaskOrSize=15, indexOrOffset=2, debugName=rdx], type=int], INT_TO_BYTE] 2: [VMLoad[storage=VMStorage[type=0, segmentMaskOrSize=15, indexOrOffset=8, debugName=r8], type=int], INT_TO_BYTE] 3: [VMLoad[storage=VMStorage[type=0, segmentMaskOrSize=15, indexOrOffset=9, debugName=r9], type=int], INT_TO_BYTE] 4: [VMLoad[storage=VMStorage[type=3, segmentMaskOrSize=8, indexOrOffset=0, debugName=Stack@0], type=int], INT_TO_BYTE] 5: [VMLoad[storage=VMStorage[type=3, segmentMaskOrSize=8, indexOrOffset=8, debugName=Stack@8], type=int], INT_TO_BYTE] 6: [VMLoad[storage=VMStorage[type=3, segmentMaskOrSize=8, indexOrOffset=16, debugName=Stack@16], type=int], INT_TO_BYTE] 7: [VMLoad[storage=VMStorage[type=3, segmentMaskOrSize=8, indexOrOffset=24, debugName=Stack@24], type=int], INT_TO_BYTE] 8: [VMLoad[storage=VMStorage[type=3, segmentMaskOrSize=8, indexOrOffset=32, debugName=Stack@32], type=int], INT_TO_BYTE] Return bindings: [BufferLoad[offset=0, type=long, byteWidth=8], VMStore[storage=VMStorage[type=0, segmentMaskOrSize=15, indexOrOffset=0, debugName=rax], type=long]] } ------------- PR: https://git.openjdk.org/jdk/pull/12708