[foreign-abi] RFR 8228486: Add ABI-specific layout constants
Jorn Vernee
jbvernee at xs4all.nl
Tue Jul 23 13:40:10 UTC 2019
Ok, this is also what we talked about a bit before.
Like you said in your other email; to support varargs on Windows we'd
need to add some `MemoryLayout asVarArg(MemoryLayout)` method on
SystemABI that does nothing for the other 2 ABIs, there are other points
where the ABIs might diverge that are not naturally expressible as
MemoryLayout constants as well (though we could add a Windows.Varargs
version of all the constants as well). It seems that exposing
annotations so that users can add ABI specific annotation to an argument
layout is a bit cleaner.
This also brings up the discussion of needing to account for annotations
when checking for layout equality. I think at least for checking
FunctionDescriptor equality we should take annotations into account as
well. Then we can e.g. distinguish a function that takes a 64 bit float
value normally, from one that takes a 64 bit float as a vararg on
Windows. (similarly with int vs float values perhaps).
Jorn
On 2019-07-23 15:27, Maurizio Cimadamore wrote:
> On 23/07/2019 14:20, Jorn Vernee wrote:
>> Also, why aren't annotations exposed at the MemoryLayout level?
>
> I wanted to experiment if we could get away w/o exposing them in the
> API - but having them internally as a more stable basis for
> implementing things like Layout names.
>
> I'd like first to get a sense about how people will be using
> annotations. Layout names are useful and referenced by the 'path' API;
> general annotations don't have that kind of visibility in the API, so
> there's a chance they are just for us/jextract.
>
> Maurizio
>
>>
>> Jorn
>>
>> On 2019-07-23 15:07, Jorn Vernee wrote:
>>> The tests pass on Windows. Overall the patch looks good
>>>
>>> - in TestUpcall you seem to be using the SysV.C_POINTER constant
>>> instead of the magic one.
>>>
>>> - Do we need to distinguish between POINTER and INTEGER class?
>>> Shouldn't this just be about in which register it's passed? It looks
>>> like the isPointer predicate is only used in the tests in order to
>>> construct dummy arguments, is there another way around this? (e.g.
>>> checking that the carrier is a MemoryAddress).
>>>
>>> Some things that I can look into:
>>>
>>> * We can mark vararg arguments with a layout annotation on Windows to
>>> be able to support vargargs on Windows as well.
>>>
>>> * I think some of the code in Window's CallingSequenceBuilderImpl
>>> could be removed at this point (e.g. the x87 stuff), since it's not
>>> supported by the Windows C ABI any ways.
>>>
>>> Jorn
>>>
>>> On 2019-07-22 19:23, Maurizio Cimadamore wrote:
>>>> Hi,
>>>> the recent push for JDK-8228447, as expected, broke the foreign-abi
>>>> branch, since that branch depended on the ValueLayout::isIntegral
>>>> accessor.
>>>>
>>>> This patch replaces that logic with the custom layout annotation
>>>> logic
>>>> discussed in [1]:
>>>>
>>>> http://cr.openjdk.java.net/~mcimadamore/panama/8228486/
>>>>
>>>> This patch makes the following changes:
>>>>
>>>> * introduces three set of annotated layout constants, one for
>>>> supported ABI
>>>> * the annotations point directly at the ABI-specific argument
>>>> classes
>>>> * I've consolidated ArgumentClass a bit, so that now there's a
>>>> common,
>>>> ABI-agnostic super-interface with some general predicates
>>>> * AddressLayout has been removed (we can just look for
>>>> argumentClass::isPointer)
>>>> * the tests have been tweaked to use the new ABI-specific constants;
>>>> since the test has to work across platforms, all ABI test use a new
>>>> interface which imports the 'right' set of constants
>>>>
>>>> While the patch might be a bit raw (I've only tested on Linux x64),
>>>> I
>>>> like where this is going.
>>>>
>>>> Maurizio
More information about the panama-dev
mailing list