Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8307205

Downcall to clibrary printf fails on OS X AArch64

XMLWordPrintable

      ADDITIONAL SYSTEM INFORMATION :
      uname -a
      Darwin Scotts-MacBook-Pro.local 21.6.0 Darwin Kernel Version 21.6.0: Thu Mar 9 20:12:18 PST 2023; root:xnu-8020.240.18.700.8~1/RELEASE_ARM64_T8110 arm64

      $JAVA_HOME/bin/java --version
      openjdk 21-ea 2023-09-19
      OpenJDK Runtime Environment (build 21-ea+20-1677)
      OpenJDK 64-Bit Server VM (build 21-ea+20-1677, mixed mode, sharing)

      A DESCRIPTION OF THE PROBLEM :
      A test program that calls the c library printf function with a string with an int %d format fails to handle the int argument correctly.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. $JAVA_HOME/bin/javac -g -d out --release 21 --enable-preview Printf.java
      2. $JAVA_HOME/bin/java -cp out --enable-preview --enable-native-access=ALL-UNNAMED Printf



      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      $JAVA_HOME/bin/java -cp out --enable-preview --enable-native-access=ALL-UNNAMED Printf
      Java version: 21
      Java FFM call to printf 21
      cprintf rtn: 27

      ACTUAL -
      $JAVA_HOME/bin/java -cp out --enable-preview --enable-native-access=ALL-UNNAMED Printf
      Java version: 21
      Java FFM call to printf 1874110304
      cprintf rtn: 35


      ---------- BEGIN SOURCE ----------
      import java.lang.foreign.*;
      import java.lang.invoke.MethodHandle;
      import java.util.Optional;

      import static java.lang.foreign.ValueLayout.ADDRESS;
      import static java.lang.foreign.ValueLayout.JAVA_INT;

      public class Printf {
          public static void main(String[] args) throws Throwable {
              Linker linker = Linker.nativeLinker();
              Optional<MemorySegment> optPrintfMS = linker.defaultLookup().find("printf");
              MemorySegment printfMS = optPrintfMS.orElseThrow();
              MethodHandle printf = linker.downcallHandle(printfMS, FunctionDescriptor.of(JAVA_INT, ADDRESS, JAVA_INT));

              int version = Integer.getInteger("java.specification.version");
              System.out.printf("Java version: %d\n", version);
              try(Arena offHeap = Arena.openConfined()) {
                  MemorySegment formatStr = offHeap.allocateUtf8String("Java FFM call to printf %d\n");
                  int rtn = (int) printf.invoke(formatStr, version);
                  System.out.printf("cprintf rtn: %d\n", rtn);
              }
          }
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


            pminborg Per-Ake Minborg
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: