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
