RFR: 8308031: Linkers should promote variadic arguments [v7]
Jorn Vernee
jvernee at openjdk.org
Tue Jun 6 15:17:48 UTC 2023
On Fri, 2 Jun 2023 16:22:43 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:
>> In C, arguments smaller than `int` are promoted to (`unsigned`) `int`, and `float` is promoted to `double`, when being passed as variadic argument (see e.g. https://en.cppreference.com/w/c/language/conversion#Default_argument_promotions). This patch adds the automatic argument promotion for variadic arguments, to align the implementation with the C specification.
>>
>> The fallback linker is also updated to use to correct function to link variadic calls (not doing this turned out not to be a problem so far, but it is problematic for instance on Mac/AArch64 when using the fallback linker). Adding the restriction on layouts for all linkers is also partly motivated by the fallback linker rejecting such unsupported variadic layouts already.
>>
>> I've added a small paragraph to the Linker javadoc as well that explains this.
>>
>> TestVarArgs needed to be updated in order to account for the difference in the promoted `float` values.
>>
>> Testing:
>> - local testing on Windows/x64
>> - local testing on Linux/x64 using the fallback linker
>> - tier1-3 + jdk-tier5
>> - manual test run on mac/aarch64 with the fallback linker to verify the correctness of the fallback linker changes.
>
> Jorn Vernee has updated the pull request incrementally with one additional commit since the last revision:
>
> address review comment
After more offline discussion we concluded that by applying argument promotions automatically we create an issue for unsigned types. We currently allow an unsigned value to be represented with the signed equivalent. For example, `JAVA_SHORT` can represent both the C `short` and `unsigned short` types. The issue is that if we were to promote `short` values to `int`, it is ambiguous whether sign extension should take place.
As a result, we decided to go back to the approach of rejecting variadic layouts representing a C type that would undergo default argument promotion. If/when we add better support for unsigned types, we can revisit.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/14225#issuecomment-1578960268
More information about the core-libs-dev
mailing list