[foreign] RFR: 8223808: initial port for AArch64
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue May 21 08:17:15 UTC 2019
On 21/05/2019 08:29, Nick Gasson wrote:
> Hi Maurizio
>
> On 20/05/2019 19:04, Maurizio Cimadamore wrote:
>> I guess that means that, e.g. if your native function takes nothing and
>> returns a big struct, we will need to make a long array that is big
>> enough to contain all register values (which are unused in this case)
>> and fill it with SKIP steps, just in order to use the last step?
> Yes, that's exactly what happens. So the shuffle recipe looks like:
>
> ShuffleRecipe: {
> Operations: {
> [STOP, STOP, STOP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, PULL, STOP, STOP, STOP, STOP, STOP, PULL, STOP, STOP] }
> }
>
> It works but it feels quite hacky.
>
>> I think that could work - but at the same time, patch (2) seem more or
>> less in the spirit of what was done with X87 registers (which are only
>> supported on Intel platforms), so I can also live with that one, which
>> has the advantage of being cleaner.
> OK, I think patch [2] is neater as well. I'll squash that onto the main
> patch.
Cool!
>> I wouldn't bother with DirectInvoker for now; you can enable it in a
>> follow up patch if you find out what the issue is, and want to fix it -
>> but as you say, it's probably better to focus on linkToNative which is
>> gonna be the future here.
>>
> So the error I get is:
>
> java.lang.IllegalArgumentException: Invalid size: 36
> at java.base/jdk.internal.foreign.memory.BoundedPointer.unsafeGetBits(BoundedPointer.java:331)
> at java.base/jdk.internal.foreign.memory.BoundedPointer.getBits(BoundedPointer.java:160)
> at java.base/jdk.internal.foreign.abi.DirectSignatureShuffler.structToLong(DirectSignatureShuffler.java:343)
>
> This happens because for >16 byte structs we now have an integer
> argument register that holds a pointer to the struct rather than the
> struct's data packed into that register. I can fix it with the simple
> change below, if that's acceptable?
>
> @@ -410,12 +410,17 @@ public class DirectSignatureShuffler {
> switch (binding.storage().getStorageClass()) {
> case X87_RETURN_REGISTER:
> case STACK_ARGUMENT_SLOT:
> + case INDIRECT_RESULT_REGISTER:
> //arguments passed in memory not supported
> return false;
> case VECTOR_ARGUMENT_REGISTER:
> case VECTOR_RETURN_REGISTER:
> //avoid passing around floats as doubles as that leads to trouble
> return (binding.argument().layout().bitsSize() / 8) == binding.storage().getSize();
> + case INTEGER_ARGUMENT_REGISTER:
> + // On some platforms large by-value structures are passed by
> + // pointer in integer argument registers
> + return (binding.argument().layout().bitsSize() / 8) <= binding.storage().getSize();
> default:
> return true;
> }
Yep - that will disable the 'direct' approach when you have big structs
in the indirect register, which is probably for the best (for now).
>
> Thanks,
> Nick
More information about the panama-dev
mailing list