Varargs bindings do not work in java 19 on the macbook pro M1 MAX
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Oct 24 15:10:27 UTC 2022
Do you get the error even if you add the asVariadic call, as noted by Jorn?
Maurizio
On 24/10/2022 15:38, Mark Hammons wrote:
> Sorry, yes there's an error there. However, this was not the first
> place I noticed the error. Rather, I noticed that my binding to
> sprintf was returning halfway malformed strings like `1810529328
> hello: �_�����{���\���^��@xA�!$@�!@����@Q@ 922798592` when the
> following test code was run:
> ```
> valformat= Ptr.copy("%i hello: %s %i")
> valbuffer= Ptr.blankArray[Byte](256)
> assertEquals(format.copyIntoString(200), "%i hello: %s %i")
> Cstd.sprintf(buffer, format, 1, Ptr.copy("hello"), 2)
> assertEquals(buffer.copyIntoString(256), "1 hello: hello 2")
> ```
>
> With the fixed code above, I get the following result from add_var:
>
> -1884714972
>
> ~Mark
>
> On Mon, Oct 24, 2022 at 3:23 PM Maurizio Cimadamore
> <maurizio.cimadamore at oracle.com> wrote:
>
> Hi Mark,
> interesting. On M1 we have currently few issues - see also this:
>
> https://bugs.openjdk.org/browse/JDK-8275584
>
> Stack spilling doesn't always occur correctly, however I note that
> your example should not spill on the stack, so it should be immune.
>
> Is your C code correct? I see you do _two_ va_arg per loop
> iteration, which surely would leave you accessing invalid data.
> E.g. in this case n = 2, so the loop would do two iterations, and
> va_arg will be called _four_ times? Am I missing something?
>
> I'd rewrite it as:
>
> ```
> for(int i = 0; i < n; i++) {
> int i = va_arg(ptr, int);
> printf("lala %d", i);
> Sum += i;
> }
> ```
>
> And test again.
>
> Maurizio
>
> On 24/10/2022 13:40, Mark Hammons wrote:
>> Hi all,
>>
>> I was testing panama on java 19 with my work issued macbook pro,
>> and my varargs method bindings were returning invalid data.
>>
>> I thought that maybe it was a failure in my own code, but I
>> couldn't work around it so I created a test instance using
>> manually written code:
>>
>> test("manual varargs") {
>> vallinker= Linker.nativeLinker().nn
>> valsl= SymbolLookup.loaderLookup().nn
>> valmh= linker
>> .downcallHandle(
>> sl.lookup("add_var").nn.orElseThrow(),
>> FunctionDescriptor.of(JAVA_INT, JAVA_INT, JAVA_INT, JAVA_INT)
>> )
>> .nn;
>> valres= MethodHandleFacade.callVariadic(mh, 2, 1,
>> 2).asInstanceOf[Int]
>> assertEquals(res, 3)
>> }
>> #include<stdarg.h>
>> #include<stdio.h>
>> intadd_var(intn, ...) {
>> intSum = 0;
>> va_list ptr;
>> va_start(ptr, n);
>> for(inti = 0; i < n; i++) {
>> inti = va_arg(ptr, int);
>> printf("lala %d", i);
>> Sum += va_arg(ptr, int);
>> }
>> va_end(ptr);
>> returnSum;
>> } The output of the test code is consistent with my autogenerated
>> code,
>> the Ints are not reaching the add_var function in a proper state,
>> and therefore
>> add_var is returning something like 840370212 instead of 3.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20221024/0481d6bb/attachment.htm>
More information about the panama-dev
mailing list