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

Reply via email to