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](https://openjdk.org/legal/ai). ------------- Commit messages: - Rename withSign - Javadoc pass - API updates - Use i2c for USHORT_TO_LONG conversion - Add doc section describing which layouts have integral extension policies - Tweak comments - Misc. review comments - Do PPC extension to long only for unsigned types - Update docs - Remove explicit sign info from OfChar - ... and 24 more: https://git.openjdk.org/jdk/compare/ff39f9f7...54bfe0d0 Changes: https://git.openjdk.org/jdk/pull/33417/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=33417&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8336664 Stats: 682 lines in 33 files changed: 507 ins; 41 del; 134 mod Patch: https://git.openjdk.org/jdk/pull/33417.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/33417/head:pull/33417 PR: https://git.openjdk.org/jdk/pull/33417
