Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
JDK-8265112 :
|
Testing https://github.com/openjdk/jdk/pull/2200 reveals this crash in java/foreign/StdLibTest.java java/foreign/TestVarArgs.java java/foreign/valist/VaListTest.java The root cause of all three crashes is the same snipets of stack traces: StdLibTest.java Current thread (0x000000012d009200): JavaThread "MainThread" [_thread_in_native, id=24579, stack(0x000000016e190000,0x000000016e393000)] Stack: [0x000000016e190000,0x000000016e393000], sp=0x000000016e390480, free space=2049k Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libsystem_platform.dylib+0xfa4] _platform_strlen+0x4 C [libsystem_c.dylib+0x6796c] __v2printf+0x194 C [libsystem_c.dylib+0x42c4c] vfprintf_l+0x44 C [libsystem_c.dylib+0x411b8] printf+0x54 C 0x047c80011209f27c V [libjvm.dylib+0x974590] ProgrammableInvoker::invoke_native(void (*)(unsigned char*), unsigned char*, JavaThread*)+0xb8 V [libjvm.dylib+0x97473c] PI_invokeNative+0x104 printf is va_arg function as we all know. VaListTest.java Current thread (0x000000015c04dc00): JavaThread "MainThread" [_thread_in_native, id=39939, stack(0x0000000171644000,0x0000000171847000)] Stack: [0x0000000171644000,0x0000000171847000], sp=0x0000000171844830, free space=2050k Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libVaList.dylib+0x3ac4] sumHugeStruct+0x4 V [libjvm.dylib+0x974590] ProgrammableInvoker::invoke_native(void (*)(unsigned char*), unsigned char*, JavaThread*)+0xb8 V [libjvm.dylib+0x97473c] PI_invokeNative+0x104 j jdk.internal.foreign.abi.ProgrammableInvoker.invokeNative(JJ)V+0 jdk.incubator.foreign@17-internal where sumHugeStruct is va_arg function: EXPORT long long sumHugeStruct(va_list list) { HugePoint point = va_arg(list, HugePoint); return point.x + point.y + point.z; } va_args work diferently on macos_aarch64 then on intel fixed part is passed in regs/on stack variable part is passed on stack always https://developer.apple.com/documentation/apple-silicon/addressing-architectural-differences-in-your-macos-code "On arm64, the compiler always places variadic parameters on the stack, regardless of whether registers are available. If you implement a function with fixed parameters, but redeclare it with variadic parameters, the mismatch causes unexpected behavior at runtime."
|