RFR: 8263512: [macos_aarch64] issues with calling va_args functions from invoke_native

Nick Gasson ngasson at openjdk.java.net
Fri Jun 4 10:08:58 UTC 2021


On Wed, 2 Jun 2021 13:42:22 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:

>> macOS on Apple silicon uses slightly different ABI conventions to the
>> standard AArch64 ABI.  The differences are outlined in [1].  In
>> particular in the standard (AAPCS) ABI, variadic arguments may be passed
>> in either registers or on the stack following the normal calling
>> convention.  To handle this, va_list is a struct containing separate
>> pointers for arguments located in integer registers, floating point
>> registers, and on the stack.  Apple's ABI simplifies this by passing all
>> variadic arguments on the stack and the va_list type becomes a simple
>> char* pointer.
>> 
>> This patch adds a new MacOsAArch64 CABI type and MacOsAArch64Linker to
>> represent the new ABI variant on macOS.  StackVaList is based on
>> WinVaList lightly modified to handle the different TypeClasses on
>> AArch64.  The original AArch64Linker is renamed to AapcsLinker and is
>> currently used for all non-Mac platforms.  I think we also need to add a
>> WinAArch64 CABI but I haven't yet been able to test on a Windows system
>> so will do that later.
>> 
>> The macOS ABI also uses a different method of spilling arguments to the
>> stack (the standard ABI pads each argument to a multiple of 8 byte stack
>> slots, but the Mac ABI packs arguments according to their natural
>> alignment).  None of the existing tests exercise this so I'll open a new
>> JBS issue and work on that separately.
>> 
>> Tested jdk_foreign on macOS AArch64, Linux AArch64, and Linux X86_64.
>> 
>> [1] https://developer.apple.com/documentation/xcode/writing_arm64_code_for_apple_platforms
>
> The JEP has been integrated, so we can pick this back up (and handle it as a bug for 17 even after the fork).
> 
> Thank you for your patience.

Thanks @JornVernee! I noticed VaListTest has started failing on Windows with this error:

test VaListTest.testUpcall(java.lang.invoke.BoundMethodHandle$Species_LLLLLLL at 198ebce4, MethodHandle(VaList)void): success
test VaListTest.testUpcall(java.lang.invoke.BoundMethodHandle$Species_LLLLLLL at 7a97cd30, MethodHandle(VaList)void): success
Uncaught exception:
java.lang.IllegalArgumentException 
{0x00000000d6506c20} - klass: 'java/lang/IllegalArgumentException'
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (universalUpcallHandler.cpp:113), pid=13972, tid=23500
#  Error: ShouldNotReachHere()
#


I guess it must be related to the two new cases I added and the Windows code is now throwing an IllegalArgumentException but I can't see where from. Any ideas?

-------------

PR: https://git.openjdk.java.net/jdk/pull/3617


More information about the core-libs-dev mailing list