> 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).
Jorn Vernee has updated the pull request incrementally with one additional commit since the last revision: Fix canonical layouts + add test ------------- Changes: - all: https://git.openjdk.org/jdk/pull/33417/files - new: https://git.openjdk.org/jdk/pull/33417/files/a232be1b..20ad828d Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=33417&range=08 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=33417&range=07-08 Stats: 254 lines in 17 files changed: 210 ins; 0 del; 44 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
