Skip to content
This repository has been archived by the owner on Dec 13, 2024. It is now read-only.

Commit

Permalink
Merge pull request #23 from ChengJin01/ffi_update_code_against_latest…
Browse files Browse the repository at this point in the history
…_apis_jep434

Update the FFI related code intended for JEP434
  • Loading branch information
keithc-ca authored Mar 23, 2023
2 parents 6cbdf58 + 50d879d commit 98fb39d
Show file tree
Hide file tree
Showing 18 changed files with 112 additions and 108 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 Down
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
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 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
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 SysVPPC64leVaList(segment, session);
return new SysVPPC64leVaList(segment);
}
}
}
Loading

0 comments on commit 98fb39d

Please sign in to comment.