Skip to content

Commit

Permalink
Merge pull request ibmruntimes#559 from ChengJin01/ffi_update_code_ag…
Browse files Browse the repository at this point in the history
…ainst_latest_apis_jep434_jdknext

Update the FFI related code intended for JEP434
  • Loading branch information
keithc-ca authored Mar 23, 2023
2 parents af0f311 + 93b48b1 commit ec2d8af
Show file tree
Hide file tree
Showing 18 changed files with 135 additions and 107 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 @@ -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;
Expand Down Expand Up @@ -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;
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 @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
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, 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) {
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, LINUX_RISCV_64, SysVPPC64le, SysVS390x, AIX -> "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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,9 @@ public static Linker getSystemLinker() {
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 SYS_V_PPC_64LE -> SysVPPC64leLinker.getInstance();
case SYS_V_S390X -> SysVS390xLinker.getInstance();
case AIX_PPC_64 -> AixPPC64Linker.getInstance();
};
}

Expand Down Expand Up @@ -318,9 +318,9 @@ public static VaList newVaList(Consumer<VaList.Builder> 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);
};
}

Expand All @@ -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);
};
}

Expand All @@ -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();
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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.
//
Expand Down Expand Up @@ -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<MemoryLayout> returnLayout) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
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 ec2d8af

Please sign in to comment.