diff --git a/src/java.base/share/classes/jdk/internal/foreign/CABI.java b/src/java.base/share/classes/jdk/internal/foreign/CABI.java index a142c7f56d9..671a4389533 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/CABI.java +++ b/src/java.base/share/classes/jdk/internal/foreign/CABI.java @@ -26,7 +26,7 @@ /* * =========================================================================== - * (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved + * (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved * =========================================================================== */ @@ -42,9 +42,9 @@ public enum CABI { MAC_OS_AARCH_64, WIN_AARCH_64, LINUX_RISCV_64, - SysVPPC64le, - SysVS390x, - AIX; + SYS_V_PPC_64LE, + SYS_V_S390X, + AIX_PPC_64; private static final CABI ABI; private static final String ARCH; @@ -81,12 +81,12 @@ public enum CABI { } } else if (ARCH.startsWith("ppc64")) { if (OS.startsWith("Linux")) { - ABI = SysVPPC64le; + ABI = SYS_V_PPC_64LE; } else { - ABI = AIX; + ABI = AIX_PPC_64; } } else if (ARCH.equals("s390x") && OS.startsWith("Linux")) { - ABI = SysVS390x; + ABI = SYS_V_S390X; } else { // unsupported ABI = null; diff --git a/src/java.base/share/classes/jdk/internal/foreign/PlatformLayouts.java b/src/java.base/share/classes/jdk/internal/foreign/PlatformLayouts.java index 0e14c830740..530c3e14179 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/PlatformLayouts.java +++ b/src/java.base/share/classes/jdk/internal/foreign/PlatformLayouts.java @@ -26,7 +26,7 @@ /* * =========================================================================== - * (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved + * (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved * =========================================================================== */ @@ -325,7 +325,7 @@ private SysVPPC64le() { /** * The {@code T*} native type. */ - public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64); + public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64).asUnbounded(); /** * The {@code va_list} native type, as it is passed to a function. @@ -384,7 +384,7 @@ private SysVS390x() { /** * The {@code T*} native type. */ - public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64); + public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64).asUnbounded(); /** * The {@code va_list} native type, as it is passed to a function. @@ -443,7 +443,7 @@ private AIX() { /** * The {@code T*} native type. */ - public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64); + public static final ValueLayout.OfAddress C_POINTER = ValueLayout.ADDRESS.withBitAlignment(64).asUnbounded(); /** * The {@code va_list} native type, as it is passed to a function. diff --git a/src/java.base/share/classes/jdk/internal/foreign/SystemLookup.java b/src/java.base/share/classes/jdk/internal/foreign/SystemLookup.java index 3ea7d13eb89..14099b0f23d 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/SystemLookup.java +++ b/src/java.base/share/classes/jdk/internal/foreign/SystemLookup.java @@ -65,8 +65,8 @@ private SystemLookup() { } private static SymbolLookup makeSystemLookup() { try { return switch (CABI.current()) { - case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, LINUX_RISCV_64, SysVPPC64le, SysVS390x -> libLookup(libs -> libs.load(jdkLibraryPath("syslookup"))); - case AIX -> makeAixLookup(); + case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, LINUX_RISCV_64, SYS_V_PPC_64LE, SYS_V_S390X -> libLookup(libs -> libs.load(jdkLibraryPath("syslookup"))); + case AIX_PPC_64 -> makeAixLookup(); case WIN_64, WIN_AARCH_64 -> makeWindowsLookup(); // out of line to workaround javac crash }; } catch (Throwable ex) { @@ -159,7 +159,7 @@ private static SymbolLookup libLookup(Function "lib"; + case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, LINUX_RISCV_64, SYS_V_PPC_64LE, SYS_V_S390X, AIX_PPC_64 -> "lib"; case WIN_64, WIN_AARCH_64 -> "bin"; }; String libname = System.mapLibraryName(name); diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java b/src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java index 797c125479e..f84d9cdc3e8 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java @@ -46,13 +46,13 @@ import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker; import jdk.internal.vm.annotation.ForceInline; -import java.lang.foreign.Linker; import java.lang.foreign.FunctionDescriptor; import java.lang.foreign.GroupLayout; +import java.lang.foreign.Linker; import java.lang.foreign.MemoryLayout; import java.lang.foreign.MemorySegment; -import java.lang.foreign.SegmentScope; import java.lang.foreign.SegmentAllocator; +import java.lang.foreign.SegmentScope; import java.lang.foreign.VaList; import java.lang.foreign.ValueLayout; import java.lang.invoke.MethodHandle; @@ -200,11 +200,11 @@ public static Linker getSystemLinker() { case SYS_V -> SysVx64Linker.getInstance(); case LINUX_AARCH_64 -> LinuxAArch64Linker.getInstance(); case MAC_OS_AARCH_64 -> MacOsAArch64Linker.getInstance(); - case WIN_AARCH_64 -> WindowsAArch64Linker.getInstance(); case LINUX_RISCV_64 -> LinuxRISCV64Linker.getInstance(); - case SysVPPC64le -> SysVPPC64leLinker.getInstance(); - case SysVS390x -> SysVS390xLinker.getInstance(); - case AIX -> AixPPC64Linker.getInstance(); + case WIN_AARCH_64 -> WindowsAArch64Linker.getInstance(); + case SYS_V_PPC_64LE -> SysVPPC64leLinker.getInstance(); + case SYS_V_S390X -> SysVS390xLinker.getInstance(); + case AIX_PPC_64 -> AixPPC64Linker.getInstance(); }; } @@ -318,9 +318,9 @@ public static VaList newVaList(Consumer actions, SegmentScope sc case MAC_OS_AARCH_64 -> MacOsAArch64Linker.newVaList(actions, scope); case LINUX_RISCV_64 -> LinuxRISCV64Linker.newVaList(actions, scope); case WIN_AARCH_64 -> WindowsAArch64Linker.newVaList(actions, scope); - case SysVPPC64le -> SysVPPC64leLinker.newVaList(actions, scope); - case SysVS390x -> SysVS390xLinker.newVaList(actions, scope); - case AIX -> AixPPC64Linker.newVaList(actions, scope); + case SYS_V_PPC_64LE -> SysVPPC64leLinker.newVaList(actions, scope); + case SYS_V_S390X -> SysVS390xLinker.newVaList(actions, scope); + case AIX_PPC_64 -> AixPPC64Linker.newVaList(actions, scope); }; } @@ -332,9 +332,9 @@ public static VaList newVaListOfAddress(long address, SegmentScope scope) { case MAC_OS_AARCH_64 -> MacOsAArch64Linker.newVaListOfAddress(address, scope); case LINUX_RISCV_64 -> LinuxRISCV64Linker.newVaListOfAddress(address, scope); case WIN_AARCH_64 -> WindowsAArch64Linker.newVaListOfAddress(address, scope); - case SysVPPC64le -> SysVPPC64leLinker.newVaListOfAddress(address, scope); - case SysVS390x -> SysVS390xLinker.newVaListOfAddress(address, scope); - case AIX -> AixPPC64Linker.newVaListOfAddress(address, scope); + case SYS_V_PPC_64LE -> SysVPPC64leLinker.newVaListOfAddress(address, scope); + case SYS_V_S390X -> SysVS390xLinker.newVaListOfAddress(address, scope); + case AIX_PPC_64 -> AixPPC64Linker.newVaListOfAddress(address, scope); }; } @@ -346,9 +346,9 @@ public static VaList emptyVaList() { case MAC_OS_AARCH_64 -> MacOsAArch64Linker.emptyVaList(); case LINUX_RISCV_64 -> LinuxRISCV64Linker.emptyVaList(); case WIN_AARCH_64 -> WindowsAArch64Linker.emptyVaList(); - case SysVPPC64le -> SysVPPC64leLinker.emptyVaList(); - case SysVS390x -> SysVS390xLinker.emptyVaList(); - case AIX -> AixPPC64Linker.emptyVaList(); + case SYS_V_PPC_64LE -> SysVPPC64leLinker.emptyVaList(); + case SYS_V_S390X -> SysVS390xLinker.emptyVaList(); + case AIX_PPC_64 -> AixPPC64Linker.emptyVaList(); }; } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/CallArranger.java index e11cb1686c0..b224ae34742 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/CallArranger.java @@ -57,6 +57,8 @@ import java.util.List; import java.util.Optional; +import sun.security.action.GetPropertyAction; + import static jdk.internal.foreign.PlatformLayouts.*; import static jdk.internal.foreign.abi.aarch64.AArch64Architecture.*; import static jdk.internal.foreign.abi.aarch64.AArch64Architecture.Regs.*; @@ -78,6 +80,8 @@ public abstract class CallArranger { private static final VMStorage INDIRECT_RESULT = r8; + private static final boolean isWinOS = GetPropertyAction.privilegedGetProperty("os.name").startsWith("Windows"); + // This is derived from the AAPCS64 spec, restricted to what's // possible when calling to/from C code. // @@ -186,15 +190,18 @@ public Bindings getBindings(MethodType mt, FunctionDescriptor cDesc, boolean for /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + if (isWinOS) { + throw new InternalError("arrangeDowncall is not implemented on Windows/Aarch64"); + } + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + if (isWinOS) { + throw new InternalError("arrangeUpcall is not implemented on Windows/Aarch64"); + } + return UpcallLinker.make(target, mt, cDesc, session); } private static boolean isInMemoryReturn(Optional returnLayout) { diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/windows/WindowsAArch64VaList.java b/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/windows/WindowsAArch64VaList.java index e6ca31537d9..dd0037a7a29 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/windows/WindowsAArch64VaList.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/aarch64/windows/WindowsAArch64VaList.java @@ -23,6 +23,13 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + +/* + * =========================================================================== + * (c) Copyright IBM Corp. 2023, 2023 All Rights Reserved + * =========================================================================== + */ + package jdk.internal.foreign.abi.aarch64.windows; import java.lang.foreign.GroupLayout; @@ -64,6 +71,7 @@ public non-sealed class WindowsAArch64VaList implements VaList { private WindowsAArch64VaList(MemorySegment segment) { this.segment = segment; + throw new InternalError("WindowsAArch64VaList()/VaList is not implemented on Windows/Aarch64"); } public static VaList empty() { @@ -103,6 +111,11 @@ private Object read(MemoryLayout layout) { private Object read(MemoryLayout layout, SegmentAllocator allocator) { Objects.requireNonNull(layout); Object res; + + if (layout != null) { + throw new InternalError("VaList is not implemented on Windows/Aarch64"); + } + if (layout instanceof GroupLayout) { TypeClass typeClass = TypeClass.classifyLayout(layout); res = switch (typeClass) { @@ -189,6 +202,7 @@ public static non-sealed class Builder implements VaList.Builder { public Builder(SegmentScope session) { ((MemorySessionImpl) session).checkValidState(); this.session = session; + throw new InternalError("VaList is not implemented on Windows/Aarch64"); } private Builder arg(MemoryLayout layout, Object value) { diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java index 3aa7a3b4d25..190fb74eab7 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java @@ -49,13 +49,17 @@ * on AIX/ppc64 and might be updated accordingly in terms of VaList in the future. */ public final class AixPPC64Linker extends AbstractLinker { - private static AixPPC64Linker instance; public static AixPPC64Linker getInstance() { - if (instance == null) { - instance = new AixPPC64Linker(); + final class Holder { + private static final AixPPC64Linker INSTANCE = new AixPPC64Linker(); } - return instance; + + return Holder.INSTANCE; + } + + private AixPPC64Linker() { + /* Ensure there is only one instance. */ } @Override diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64VaList.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64VaList.java index ecbe7ed0976..f89587d75e9 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64VaList.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64VaList.java @@ -68,9 +68,9 @@ public non-sealed class AixPPC64VaList implements VaList { private MemorySegment segment; private final SegmentScope session; - private AixPPC64VaList(MemorySegment segment, SegmentScope session) { + private AixPPC64VaList(MemorySegment segment) { this.segment = segment; - this.session = session; + this.session = segment.scope(); } public static final VaList empty() { @@ -132,7 +132,7 @@ private Object readArg(MemoryLayout argLayout, SegmentAllocator allocator) { default -> throw new IllegalStateException("Unsupported TypeClass: " + typeClass); } - /* Move to the next argument in the va_list buffer */ + /* Move to the next argument in the va_list buffer. */ segment = segment.asSlice(argByteSize); return argument; } @@ -140,7 +140,7 @@ private Object readArg(MemoryLayout argLayout, SegmentAllocator allocator) { private static long getAlignedArgSize(MemoryLayout argLayout) { long argLayoutSize = VA_LIST_SLOT_BYTES; // Always aligned with 8 bytes for primitives/pointer by default - /* As with primitives, a struct should aligned with 8 bytes */ + /* As with primitives, a struct should aligned with 8 bytes. */ if (argLayout instanceof GroupLayout) { argLayoutSize = argLayout.byteSize(); if ((argLayoutSize % VA_LIST_SLOT_BYTES) > 0) { @@ -151,7 +151,7 @@ private static long getAlignedArgSize(MemoryLayout argLayout) { return argLayoutSize; } - /* Check whether the argument to be skipped exceeds the existing memory size in the VaList */ + /* Check whether the argument to be skipped exceeds the existing memory size in the VaList. */ private void checkNextArgument(MemoryLayout argLayout, long argByteSize) { if (argByteSize > segment.byteSize()) { throw SharedUtils.newVaListNSEE(argLayout); @@ -171,20 +171,19 @@ public void skip(MemoryLayout... layouts) { Objects.requireNonNull(layout); long argByteSize = getAlignedArgSize(layout); checkNextArgument(layout, argByteSize); - /* Skip to the next argument in the va_list buffer */ + /* Skip to the next argument in the va_list buffer. */ segment = segment.asSlice(argByteSize); } } - public static VaList ofAddress(long addr, SegmentScope session) { - MemorySegment segment = MemorySegment.ofAddress(addr, Long.MAX_VALUE, session); - return new AixPPC64VaList(segment, session); + public static VaList ofAddress(long address, SegmentScope session) { + return new AixPPC64VaList(MemorySegment.ofAddress(address, Long.MAX_VALUE, session)); } @Override public VaList copy() { ((MemorySessionImpl)session).checkValidState(); - return new AixPPC64VaList(segment, session); + return new AixPPC64VaList(segment); } @Override @@ -284,7 +283,7 @@ public VaList build() { /* Move to the next argument by the aligned size of the current argument */ cursorSegment = cursorSegment.asSlice(argByteSize); } - return new AixPPC64VaList(segment, session); + return new AixPPC64VaList(segment); } } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/CallArranger.java index 3630f819f8f..cb408b9f2a6 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/CallArranger.java @@ -50,14 +50,11 @@ public class CallArranger { /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public static MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + return UpcallLinker.make(target, mt, cDesc, session); } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/CallArranger.java index 14a5b35e813..ffc15707691 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/CallArranger.java @@ -50,14 +50,11 @@ public class CallArranger { /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public static MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + return UpcallLinker.make(target, mt, cDesc, session); } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leLinker.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leLinker.java index 683f3b61107..7bd126b2959 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leLinker.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leLinker.java @@ -49,13 +49,17 @@ * on Linux/ppc64le and might be updated accordingly in terms of VaList in the future. */ public final class SysVPPC64leLinker extends AbstractLinker { - private static SysVPPC64leLinker instance; public static SysVPPC64leLinker getInstance() { - if (instance == null) { - instance = new SysVPPC64leLinker(); + final class Holder { + private static final SysVPPC64leLinker INSTANCE = new SysVPPC64leLinker(); } - return instance; + + return Holder.INSTANCE; + } + + private SysVPPC64leLinker() { + /* Ensure there is only one instance. */ } @Override diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leVaList.java b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leVaList.java index 4ef881cd5a4..7b12853eb24 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leVaList.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/sysv/SysVPPC64leVaList.java @@ -68,9 +68,9 @@ public non-sealed class SysVPPC64leVaList implements VaList { private MemorySegment segment; private final SegmentScope session; - private SysVPPC64leVaList(MemorySegment segment, SegmentScope session) { + private SysVPPC64leVaList(MemorySegment segment) { this.segment = segment; - this.session = session; + this.session = segment.scope(); } public static final VaList empty() { @@ -132,7 +132,7 @@ private Object readArg(MemoryLayout argLayout, SegmentAllocator allocator) { default -> throw new IllegalStateException("Unsupported TypeClass: " + typeClass); } - /* Move to the next argument in the va_list buffer */ + /* Move to the next argument in the va_list buffer. */ segment = segment.asSlice(argByteSize); return argument; } @@ -140,7 +140,7 @@ private Object readArg(MemoryLayout argLayout, SegmentAllocator allocator) { private static long getAlignedArgSize(MemoryLayout argLayout) { long argLayoutSize = VA_LIST_SLOT_BYTES; // Always aligned with 8 bytes for primitives/pointer by default - /* As with primitives, a struct should aligned with 8 bytes */ + /* As with primitives, a struct should aligned with 8 bytes. */ if (argLayout instanceof GroupLayout) { argLayoutSize = argLayout.byteSize(); if ((argLayoutSize % VA_LIST_SLOT_BYTES) > 0) { @@ -151,7 +151,7 @@ private static long getAlignedArgSize(MemoryLayout argLayout) { return argLayoutSize; } - /* Check whether the argument to be skipped exceeds the existing memory size in the VaList */ + /* Check whether the argument to be skipped exceeds the existing memory size in the VaList. */ private void checkNextArgument(MemoryLayout argLayout, long argByteSize) { if (argByteSize > segment.byteSize()) { throw SharedUtils.newVaListNSEE(argLayout); @@ -171,20 +171,19 @@ public void skip(MemoryLayout... layouts) { Objects.requireNonNull(layout); long argByteSize = getAlignedArgSize(layout); checkNextArgument(layout, argByteSize); - /* Skip to the next argument in the va_list buffer */ + /* Skip to the next argument in the va_list buffer. */ segment = segment.asSlice(argByteSize); } } - public static VaList ofAddress(long addr, SegmentScope session) { - MemorySegment segment = MemorySegment.ofAddress(addr, Long.MAX_VALUE, session); - return new SysVPPC64leVaList(segment, session); + public static VaList ofAddress(long address, SegmentScope session) { + return new SysVPPC64leVaList(MemorySegment.ofAddress(address, Long.MAX_VALUE, session)); } @Override public VaList copy() { ((MemorySessionImpl)session).checkValidState(); - return new SysVPPC64leVaList(segment, session); + return new SysVPPC64leVaList(segment); } @Override @@ -284,7 +283,7 @@ public VaList build() { /* Move to the next argument by the aligned size of the current argument */ cursorSegment = cursorSegment.asSlice(argByteSize); } - return new SysVPPC64leVaList(segment, session); + return new SysVPPC64leVaList(segment); } } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/CallArranger.java index 8a92de0ce78..b6757174934 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/CallArranger.java @@ -50,14 +50,11 @@ public class CallArranger { /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public static MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + return UpcallLinker.make(target, mt, cDesc, session); } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xLinker.java b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xLinker.java index 39da97eddec..6c7cadc96e6 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xLinker.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xLinker.java @@ -49,13 +49,17 @@ * on Linux/s390x and might be updated accordingly in terms of VaList in the future. */ public final class SysVS390xLinker extends AbstractLinker { - private static SysVS390xLinker instance; public static SysVS390xLinker getInstance() { - if (instance == null) { - instance = new SysVS390xLinker(); + final class Holder { + private static final SysVS390xLinker INSTANCE = new SysVS390xLinker(); } - return instance; + + return Holder.INSTANCE; + } + + private SysVS390xLinker() { + /* Ensure there is only one instance */ } @Override diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xVaList.java b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xVaList.java index b4e444d3fa4..1abd2ef4853 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xVaList.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/s390x/sysv/SysVS390xVaList.java @@ -46,7 +46,6 @@ import static java.lang.foreign.MemoryLayout.PathElement.groupElement; import static jdk.internal.foreign.abi.SharedUtils.SimpleVaArg; -import static jdk.internal.foreign.abi.SharedUtils.THROWING_ALLOCATOR; import static jdk.internal.foreign.PlatformLayouts.SysVS390x; /** @@ -132,9 +131,9 @@ public non-sealed class SysVS390xVaList implements VaList { FP_REG.withName("f6") /* #3 */ ); - /* The starting offset of the general register save area */ + /* The starting offset of the general register save area. */ private static final long GPR_OFFSET = LAYOUT_REG_SAVE_AREA.byteOffset(groupElement("r2")); - /* The starting offset of the floating-point register save area */ + /* The starting offset of the floating-point register save area. */ private static final long FPR_OFFSET = LAYOUT_REG_SAVE_AREA.byteOffset(groupElement("f0")); private static final long MAX_GPR_NUM = 5; /* 5 8-byte general registers (r2-r6) being used */ @@ -218,12 +217,12 @@ public void skip(MemoryLayout... layouts) { Objects.requireNonNull(layouts); ((MemorySessionImpl)segment.scope()).checkValidState(); for (MemoryLayout layout : layouts) { - readArg(layout, THROWING_ALLOCATOR, false); + readArg(layout, SharedUtils.THROWING_ALLOCATOR, false); } } private Object readArg(MemoryLayout layout) { - return readArg(layout, THROWING_ALLOCATOR, true); + return readArg(layout, SharedUtils.THROWING_ALLOCATOR, true); } private Object readArg(MemoryLayout layout, SegmentAllocator allocator, boolean isRead) { @@ -239,7 +238,7 @@ private Object readArg(MemoryLayout layout, SegmentAllocator allocator, boolean if (isRead) { argument = getArgFromMemoryArea(layout, overflowAreaCursor, allocator, true); } - /* Move to the next argument by 8 bytes in the overflow area */ + /* Move to the next argument by 8 bytes in the overflow area. */ overflowAreaCursor = overflowAreaCursor.asSlice(VA_LIST_SLOT_BYTES); } else { checkRegSaveAreaElement(layout); @@ -248,14 +247,14 @@ private Object readArg(MemoryLayout layout, SegmentAllocator allocator, boolean if (isRead) { argument = getArgFromMemoryArea(layout, gpRegSaveArea, allocator, false); } - /* Move to the next argument in the general register area */ + /* Move to the next argument in the general register area. */ moveToNextArgOfGprArea(nextGprNo); } case FLOAT, STRUCT_ONE_FLOAT -> { if (isRead) { argument = getArgFromMemoryArea(layout, fpRegSaveArea, allocator, false); } - /* Move to the next argument in the floating-point register area */ + /* Move to the next argument in the floating-point register area. */ moveToNextArgOfFprArea(nextFprNo); } default -> throw new IllegalStateException("Unsupported TypeClass: " + typeClass); @@ -293,7 +292,7 @@ private void checkRegSaveAreaElement(MemoryLayout layout) { } } - /* Obtain the argument value from the specified memory area of VaList */ + /* Obtain the argument value from the specified memory area of VaList. */ private Object getArgFromMemoryArea(MemoryLayout layout, MemorySegment argAreaSegment, SegmentAllocator allocator, boolean isOverflowArea) { TypeClass typeClass = TypeClass.classifyLayout(layout); VarHandle argHandle = TypeClass.classifyVarHandle(layout); @@ -382,18 +381,18 @@ private long currentFprNo() { private void moveToNextArgOfGprArea(long nextGprNo) { VH_GPR_NO.set(segment, nextGprNo); - /* Move to the next argument by 8 bytes in the general register area */ + /* Move to the next argument by 8 bytes in the general register area. */ gpRegSaveArea = gpRegSaveArea.asSlice(VA_LIST_SLOT_BYTES); } private void moveToNextArgOfFprArea(long nextFprNo) { VH_FPR_NO.set(segment, nextFprNo); - /* Move to the next argument by 8 bytes in the floating-point register area */ + /* Move to the next argument by 8 bytes in the floating-point register area. */ fpRegSaveArea = fpRegSaveArea.asSlice(VA_LIST_SLOT_BYTES); } - public static VaList ofAddress(long addr, SegmentScope session) { - MemorySegment segment = MemorySegment.ofAddress(addr, LAYOUT_VA_LIST.byteSize(), session); + public static VaList ofAddress(long address, SegmentScope session) { + MemorySegment segment = MemorySegment.ofAddress(address, LAYOUT_VA_LIST.byteSize(), session); MemorySegment regSaveAreaOfVaList = MemorySegment.ofAddress(((MemorySegment)VH_REG_SAVE_AREA.get(segment)).address(), LAYOUT_REG_SAVE_AREA.byteSize(), session); MemorySegment overflowArgAreaOfVaList = MemorySegment.ofAddress(((MemorySegment)VH_OVERFLOW_ARG_AREA.get(segment)).address(), @@ -545,7 +544,7 @@ private void storeArgToMemoryArea(List vaListArgs, MemorySegment ar default -> throw new IllegalStateException("Unsupported TypeClass: " + typeClass); } - /* Move to the next argument by 8 bytes */ + /* Move to the next argument by 8 bytes. */ argAreaCursor = argAreaCursor.asSlice(VA_LIST_SLOT_BYTES); } } @@ -571,7 +570,7 @@ public VaList build() { storeArgToMemoryArea(fprArgs, fpRegSaveArea, false); storeArgToMemoryArea(overflowArgs, overflowArgArea, true); - /* Set va_list with all required information so as to ensure va_list is correctly accessed in native */ + /* Set va_list with all required information so as to ensure va_list is correctly accessed in native. */ VH_GPR_NO.set(vaListSegment, 0); VH_FPR_NO.set(vaListSegment, 0); VH_OVERFLOW_ARG_AREA.set(vaListSegment, overflowArgArea.asSlice(0, 0)); diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/x64/sysv/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/x64/sysv/CallArranger.java index 99bb46c7cba..be21fa3c3a4 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/x64/sysv/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/x64/sysv/CallArranger.java @@ -128,15 +128,12 @@ public static Bindings getBindings(MethodType mt, FunctionDescriptor cDesc, bool /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public static MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + return UpcallLinker.make(target, mt, cDesc, session); } private static boolean isInMemoryReturn(Optional returnLayout) { diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/x64/windows/CallArranger.java b/src/java.base/share/classes/jdk/internal/foreign/abi/x64/windows/CallArranger.java index 44db601f844..4836758f29c 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/abi/x64/windows/CallArranger.java +++ b/src/java.base/share/classes/jdk/internal/foreign/abi/x64/windows/CallArranger.java @@ -128,15 +128,12 @@ void setReturnBindings(Class carrier, MemoryLayout layout) { /* Replace DowncallLinker in OpenJDK with the implementation of DowncallLinker specific to OpenJ9 */ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDesc, LinkerOptions options) { - // MethodHandle handle = DowncallLinker.getBoundMethodHandle(mt, cDesc, options); - // return handle; - return null; + return DowncallLinker.getBoundMethodHandle(mt, cDesc, options); } /* Replace UpcallLinker in OpenJDK with the implementation of UpcallLinker specific to OpenJ9 */ public static MemorySegment arrangeUpcall(MethodHandle target, MethodType mt, FunctionDescriptor cDesc, SegmentScope session) { - // return UpcallLinker.make(target, mt, cDesc, session); - return null; + return UpcallLinker.make(target, mt, cDesc, session); } private static boolean isInMemoryReturn(Optional returnLayout) { diff --git a/src/java.base/share/classes/jdk/internal/foreign/layout/ValueLayouts.java b/src/java.base/share/classes/jdk/internal/foreign/layout/ValueLayouts.java index 079cb123a39..9f55104862a 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/layout/ValueLayouts.java +++ b/src/java.base/share/classes/jdk/internal/foreign/layout/ValueLayouts.java @@ -23,6 +23,13 @@ * questions. * */ + +/* + * =========================================================================== + * (c) Copyright IBM Corp. 2023, 2023 All Rights Reserved + * =========================================================================== + */ + package jdk.internal.foreign.layout; import jdk.internal.foreign.Utils; @@ -32,6 +39,7 @@ import jdk.internal.vm.annotation.ForceInline; import jdk.internal.vm.annotation.Stable; import sun.invoke.util.Wrapper; +import sun.security.action.GetPropertyAction; import java.lang.foreign.MemoryLayout; import java.lang.foreign.MemorySegment; @@ -65,6 +73,8 @@ abstract sealed static class AbstractValueLayout carrier; private final ByteOrder order; @Stable @@ -399,6 +409,10 @@ public static OfDouble of(ByteOrder order) { return new OfDoubleImpl(order); } + @Override + public boolean hasNaturalAlignment() { + return isAixOS ? ((bitAlignment() % 32) == 0) : super.hasNaturalAlignment(); + } } public static final class OfAddressImpl extends AbstractValueLayout implements ValueLayout.OfAddress {