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
JDKnext 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 <jincheng@ca.ibm.com>
  • Loading branch information
ChengJin01 committed Mar 17, 2023
1 parent a75d267 commit f99bfa2
Show file tree
Hide file tree
Showing 18 changed files with 137 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 @@ -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 @@ -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;
Expand Down Expand Up @@ -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();
};
}

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 f99bfa2

Please sign in to comment.