[foreign] RFR 8218144: Direct invoker does not handle varargs correctly

Sundararajan Athijegannathan sundararajan.athijegannathan at oracle.com
Thu Jan 31 14:24:33 UTC 2019


Looks good.

-Sundar

On 31/01/19, 7:40 PM, Maurizio Cimadamore wrote:
> Hi,
> our CI systems detected a spurious failures on StdLibTest, only on 
> Linux x64. After a lot of digging, I figured out the problem was that 
> SystemV ABI requires the RAX register to be set to the number of 
> vector arguments in a variadic call:
>
> %rax: temporary register;with variable arguments passes information 
> about the number of vector registers used
>
> So, if we are doing a variadic call, we need to set this register to 
> the number of floating point args we're passing. The universal invoker 
> seems to do that:
>
> http://hg.openjdk.java.net/panama/dev/file/tip/src/hotspot/cpu/x86/universalNativeInvoker_x86.cpp#l515 
>
>
> For both variadic and non-variadic calls.
>
> So, a natural fix for the direct approach is to tweak the cast to the 
> function pointers in our native stubs - e.g. from this:
>
> void DNI_invokeNative_V_JD(JNIEnv *env, jobject _unused, jlong addr, 
> jlong arg0, jdouble arg1) {
>      ((void (*)(jlong, jdouble))addr)(arg0, arg1);
> }
>
> To this:
>
> void DNI_invokeNative_V_JD(JNIEnv *env, jobject _unused, jlong addr, 
> jlong arg0, jdouble arg1) {
>      ((void (*)(jlong, jdouble,...))addr)(arg0, arg1);
> }
>
> Which will generate the right set for RAX (even though it will do so 
> also for non-variadic call - but  that's the same as what universal 
> invoker does).
>
> I also strengthened the test - I tried first to use sprintf instead of 
> printf, but that didn't work, as that doesn't seem to reproduce the 
> issue (my suspicion here is that 'printf' is optimized to look into 
> RAX). So, instead, I tweaked the test to run for a lot longer, by 
> repeatedly shuffling the permutation array, and I also increased the 
> decimal length of the double formatting string - that's because, 
> unfortunately, we were using 1.23, which has 4 chars, and sometimes 
> the result of printf ended up with "-NaN" which also has 4 chars, 
> despite being very wrong. With both measures, tests are much more 
> likely, so much so that in the affected machine I've never been able 
> to get a pass w/o the proposed patch.
>
> I verified that the patch works on all platforms, and I also verified 
> that the patch does not introduce performance regressions, which is 
> not the case (kind of expected, given that the only difference for 
> adding a "..." is the extra MOV to RAX, as shown here [1]).
>
> Webrev:
>
> http://cr.openjdk.java.net/~mcimadamore/panama/8218144/
>
> Cheers
> Maurizio
>
> [1] - https://gcc.godbolt.org/z/VAgfZc
>
>
>
>
>


More information about the panama-dev mailing list