On Thu, 5 Nov 2026 15:41:03 GMT, Jorn Vernee <[email protected]> wrote:

>> Currently we do not directly support unsigned types in the Linker. The 
>> javadoc has this to say about it:
>> 
>>>  A native linker typically does not provide canonical layouts for C's 
>>> unsigned integral
>>  types. Instead, they are modeled using the canonical layouts associated 
>> with their
>>  corresponding signed integral types. For instance, the C type `unsigned 
>> long`
>>  maps to the canonical layout for `code long`.
>> 
>> This was done under the earlier assumption that ABIs treat signed and 
>> unsigned types the same. However, it turns out that we missed certain cases 
>> where this does matter for some ABIs. More concretely:
>> 
>> - Mac x64 and AArch64 ABIs require integral types smaller than `int`  to be 
>> widened to `int` before being passed to a function 
>> [1](https://developer.apple.com/documentation/xcode/writing-64-bit-intel-code-for-apple-platforms),
>>  
>> [2](https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms).
>>  Clang even extends this behavior to Linux x64 (although this appears to be 
>> a bug) 
>> [3](https://mail.openjdk.org/archives/list/[email protected]/message/RJNMKNUXN7R5PSJETZKX3PMBJ7P6GYJG/).
>> - RISCV requires arguments smaller than XLEN to be extended to 32 bits 
>> according to their sign, and then sign extended to XLEN 
>> [4](https://docs.riscv.org/reference/abi/v1.0/riscv-cc-procedure-calling-convention.html).
>> - PowerPC requires small integer types (char, short, int, long, enum) to be 
>> extended to long 
>> [5](https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#PARAM-PASS).
>> 
>> In order to address these use cases we need to attach a bit of extra 
>> information to a linkage request that indicates the signedness of certain 
>> arguments. For this patch, we've chosen to attach that information directly 
>> to the argument layouts through a newly introduced `boolean isSigned()` 
>> method on a new `ValueLayout` subclass `OfIntegral` that is implemented by 
>> `OfByte`, `OfShort`, `OfInt`, and `OfLong`.
>> 
>> This information is potentially used by the linker to implement the correct 
>> extension. In cases where it doesn't affect the way functions are linker the 
>> information is erased in order to provide more efficient caching, since 
>> signed and unsigned types can share the same downcall handle in that case.
>> 
>> Testing: `jdk_foreign` test suite on Windows/Linux/Mac-x64, 
>> Mac/Linux-AArch64, Linux-x64 using the fallback linker.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](http...
>
> Jorn Vernee has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains 49 commits:
> 
>  - AIX test fix
>  - Merge branch 'master' into SignInfo
>  - Update copyright years
>  - Try to avoid compiler warning
>  - Don't use list
>  - Fix canonical layouts + add test
>  - Fix @since errors
>  - re-add requires tag
>  - Rework tests
>  - Sign -> signedness paramter name
>  - ... and 39 more: https://git.openjdk.org/jdk/compare/ce0c58ba...3a1f1c7f

Looks great! (Didn't review the fallback linker parts.) I only have some minor 
questions / comments.

src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java line 394:

> 392: 
> 393:     public static boolean isSigned(MemoryLayout layout) {
> 394:         return !(layout instanceof OfIntegral integral) || 
> integral.isSigned();

May be a bit confusing that non-integral MemoryLayouts are signed, but ok.

test/jdk/java/foreign/normalize/TestZeroExtendInt.java line 30:

> 28:  * @requires (os.name == "Mac OS X")
> 29:  *           | (os.name == "Linux"
> 30:  *               & (os.arch == "amd64" | os.arch == "ppc64" | os.arch == 
> "ppc64le" | os.arch == "riscv64"))

Why are AIX and linux s390 excluded, but linux on ppc64 included? The test 
passes on all of these platforms.

test/jdk/java/foreign/normalize/TestZeroExtendLong.java line 28:

> 26:  * @requires jdk.foreign.linker != "FALLBACK"
> 27:  * @library ../
> 28:  * @requires os.arch == "ppc64" | os.arch == "ppc64le" | os.arch == 
> "s390x"

This test also passes on linux x86. Not sure if we should run it.

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

Marked as reviewed by mdoerr (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/33417#pullrequestreview-5825502531
PR Review Comment: https://git.openjdk.org/jdk/pull/33417#discussion_r4512448735
PR Review Comment: https://git.openjdk.org/jdk/pull/33417#discussion_r4512510352
PR Review Comment: https://git.openjdk.org/jdk/pull/33417#discussion_r4513878264

Reply via email to