Skip to content

Commit

Permalink
Update the FFI related code intended for JEP434
Browse files Browse the repository at this point in the history
The changes update part of our code in the FFI
framework against the latest APIs specified in
JDK20 to accommodate the new features of JEP434.

Note:
This is the part of implementation intended for
#eclipse-openj9/openj9/issues/16329

Signed-off-by: ChengJin01 <[email protected]>
  • Loading branch information
ChengJin01 committed Mar 17, 2023
1 parent 10a3573 commit 13f5155
Show file tree
Hide file tree
Showing 18 changed files with 116 additions and 111 deletions.
14 changes: 7 additions & 7 deletions src/java.base/share/classes/jdk/internal/foreign/CABI.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved
* (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved
* ===========================================================================
*/

Expand All @@ -40,9 +40,9 @@ public enum CABI {
WIN_64,
LINUX_AARCH_64,
MAC_OS_AARCH_64,
SysVPPC64le,
SysVS390x,
AIX;
SYS_V_PPC_64LE,
SYS_V_S390X,
AIX_PPC_64;

private static final CABI ABI;
private static final String ARCH;
Expand Down Expand Up @@ -70,12 +70,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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved
* (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved
* ===========================================================================
*/

Expand Down Expand Up @@ -269,7 +269,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.
Expand Down Expand Up @@ -328,7 +328,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.
Expand Down Expand Up @@ -387,7 +387,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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, SysVPPC64le, SysVS390x -> libLookup(libs -> libs.load(jdkLibraryPath("syslookup")));
case AIX -> makeAixLookup();
case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, SYS_V_PPC_64LE, SYS_V_S390X -> libLookup(libs -> libs.load(jdkLibraryPath("syslookup")));
case AIX_PPC_64 -> makeAixLookup();
case WIN_64 -> makeWindowsLookup(); // out of line to workaround javac crash
};
} catch (Throwable ex) {
Expand Down Expand Up @@ -159,7 +159,7 @@ private static SymbolLookup libLookup(Function<RawNativeLibraries, NativeLibrary
private static Path jdkLibraryPath(String name) {
Path javahome = Path.of(GetPropertyAction.privilegedGetProperty("java.home"));
String lib = switch (CABI.current()) {
case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, SysVPPC64le, SysVS390x, AIX -> "lib";
case SYS_V, LINUX_AARCH_64, MAC_OS_AARCH_64, SYS_V_PPC_64LE, SYS_V_S390X, AIX_PPC_64 -> "lib";
case WIN_64 -> "bin";
};
String libname = System.mapLibraryName(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved
* (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved
* ===========================================================================
*/

Expand All @@ -41,12 +41,12 @@
import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
import jdk.internal.foreign.layout.AbstractLayout;

import java.lang.foreign.GroupLayout;
import java.lang.foreign.MemoryLayout;
import java.lang.foreign.SegmentScope;
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.SequenceLayout;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,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;
Expand Down Expand Up @@ -193,9 +193,9 @@ public static Linker getSystemLinker() {
case SYS_V -> SysVx64Linker.getInstance();
case LINUX_AARCH_64 -> LinuxAArch64Linker.getInstance();
case MAC_OS_AARCH_64 -> MacOsAArch64Linker.getInstance();
case SysVPPC64le -> SysVPPC64leLinker.getInstance();
case SysVS390x -> SysVS390xLinker.getInstance();
case AIX -> AixPPC64Linker.getInstance();
case SYS_V_PPC_64LE -> SysVPPC64leLinker.getInstance();
case SYS_V_S390X -> SysVS390xLinker.getInstance();
case AIX_PPC_64 -> AixPPC64Linker.getInstance();
};
}

Expand Down Expand Up @@ -307,9 +307,9 @@ public static VaList newVaList(Consumer<VaList.Builder> actions, SegmentScope sc
case SYS_V -> SysVx64Linker.newVaList(actions, scope);
case LINUX_AARCH_64 -> LinuxAArch64Linker.newVaList(actions, scope);
case MAC_OS_AARCH_64 -> MacOsAArch64Linker.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);
};
}

Expand All @@ -319,9 +319,9 @@ public static VaList newVaListOfAddress(long address, SegmentScope scope) {
case SYS_V -> SysVx64Linker.newVaListOfAddress(address, scope);
case LINUX_AARCH_64 -> LinuxAArch64Linker.newVaListOfAddress(address, scope);
case MAC_OS_AARCH_64 -> MacOsAArch64Linker.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);
};
}

Expand All @@ -331,9 +331,9 @@ public static VaList emptyVaList() {
case SYS_V -> SysVx64Linker.emptyVaList();
case LINUX_AARCH_64 -> LinuxAArch64Linker.emptyVaList();
case MAC_OS_AARCH_64 -> MacOsAArch64Linker.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();
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,12 @@ 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;
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;
return UpcallLinker.make(target, mt, cDesc, session);
}

private static boolean isInMemoryReturn(Optional<MemoryLayout> returnLayout) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -132,15 +132,15 @@ 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;
}

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) {
Expand All @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading

0 comments on commit 13f5155

Please sign in to comment.