Skip to content

Commit d8bb082

Browse files
committed
[GR-52573] Allow usage of foreign memory API on all platforms.
PullRequest: graal/19824
2 parents 2f481b4 + 53b646d commit d8bb082

15 files changed

+204
-113
lines changed

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/AbiUtils.java

Lines changed: 5 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import jdk.internal.foreign.abi.CallingSequence;
8080
import jdk.internal.foreign.abi.LinkerOptions;
8181
import jdk.internal.foreign.abi.NativeEntryPoint;
82+
import jdk.internal.foreign.abi.SharedUtils;
8283
import jdk.internal.foreign.abi.VMStorage;
8384
import jdk.internal.foreign.abi.aarch64.AArch64Architecture;
8485
import jdk.internal.foreign.abi.x64.X86_64Architecture;
@@ -696,7 +697,6 @@ protected List<Adapter.Adaptation> generateAdaptations(NativeEntryPointInfo nep)
696697

697698
@Override
698699
public void checkLibrarySupport() {
699-
fail();
700700
}
701701

702702
@Override
@@ -716,7 +716,7 @@ public int trampolineSize() {
716716

717717
@Override
718718
public TrampolineTemplate generateTrampolineTemplate() {
719-
return fail();
719+
return null;
720720
}
721721
}
722722

@@ -763,33 +763,7 @@ public AssignedLocation[] toMemoryAssignment(VMStorage[] argMoves, boolean forRe
763763

764764
@Override
765765
public Map<String, MemoryLayout> canonicalLayouts() {
766-
return Map.ofEntries(
767-
// specified canonical layouts
768-
Map.entry("bool", ValueLayout.JAVA_BOOLEAN),
769-
Map.entry("char", ValueLayout.JAVA_BYTE),
770-
Map.entry("short", ValueLayout.JAVA_SHORT),
771-
Map.entry("int", ValueLayout.JAVA_INT),
772-
Map.entry("float", ValueLayout.JAVA_FLOAT),
773-
Map.entry("long", (ValueLayout) ValueLayout.JAVA_LONG),
774-
Map.entry("long long", ValueLayout.JAVA_LONG),
775-
Map.entry("double", ValueLayout.JAVA_DOUBLE),
776-
Map.entry("void*", ValueLayout.ADDRESS),
777-
Map.entry("size_t", (ValueLayout) ValueLayout.JAVA_LONG),
778-
Map.entry("wchar_t", (ValueLayout) ValueLayout.JAVA_INT),
779-
// unspecified size-dependent layouts
780-
Map.entry("int8_t", ValueLayout.JAVA_BYTE),
781-
Map.entry("int16_t", ValueLayout.JAVA_SHORT),
782-
Map.entry("int32_t", ValueLayout.JAVA_INT),
783-
Map.entry("int64_t", ValueLayout.JAVA_LONG),
784-
// unspecified JNI layouts
785-
Map.entry("jboolean", ValueLayout.JAVA_BOOLEAN),
786-
Map.entry("jchar", ValueLayout.JAVA_CHAR),
787-
Map.entry("jbyte", ValueLayout.JAVA_BYTE),
788-
Map.entry("jshort", ValueLayout.JAVA_SHORT),
789-
Map.entry("jint", ValueLayout.JAVA_INT),
790-
Map.entry("jlong", ValueLayout.JAVA_LONG),
791-
Map.entry("jfloat", ValueLayout.JAVA_FLOAT),
792-
Map.entry("jdouble", ValueLayout.JAVA_DOUBLE));
766+
return SharedUtils.canonicalLayouts(ValueLayout.JAVA_LONG, ValueLayout.JAVA_LONG, ValueLayout.JAVA_INT);
793767
}
794768

795769
@Override
@@ -937,36 +911,6 @@ public AssignedLocation[] toMemoryAssignment(VMStorage[] argMoves, boolean forRe
937911
return storages;
938912
}
939913

940-
protected static Map<String, MemoryLayout> canonicalLayouts(ValueLayout longLayout, ValueLayout sizetLayout, ValueLayout wchartLayout) {
941-
return Map.ofEntries(
942-
// specified canonical layouts
943-
Map.entry("bool", ValueLayout.JAVA_BOOLEAN),
944-
Map.entry("char", ValueLayout.JAVA_BYTE),
945-
Map.entry("short", ValueLayout.JAVA_SHORT),
946-
Map.entry("int", ValueLayout.JAVA_INT),
947-
Map.entry("float", ValueLayout.JAVA_FLOAT),
948-
Map.entry("long", longLayout),
949-
Map.entry("long long", ValueLayout.JAVA_LONG),
950-
Map.entry("double", ValueLayout.JAVA_DOUBLE),
951-
Map.entry("void*", ValueLayout.ADDRESS),
952-
Map.entry("size_t", sizetLayout),
953-
Map.entry("wchar_t", wchartLayout),
954-
// unspecified size-dependent layouts
955-
Map.entry("int8_t", ValueLayout.JAVA_BYTE),
956-
Map.entry("int16_t", ValueLayout.JAVA_SHORT),
957-
Map.entry("int32_t", ValueLayout.JAVA_INT),
958-
Map.entry("int64_t", ValueLayout.JAVA_LONG),
959-
// unspecified JNI layouts
960-
Map.entry("jboolean", ValueLayout.JAVA_BOOLEAN),
961-
Map.entry("jchar", ValueLayout.JAVA_CHAR),
962-
Map.entry("jbyte", ValueLayout.JAVA_BYTE),
963-
Map.entry("jshort", ValueLayout.JAVA_SHORT),
964-
Map.entry("jint", ValueLayout.JAVA_INT),
965-
Map.entry("jlong", ValueLayout.JAVA_LONG),
966-
Map.entry("jfloat", ValueLayout.JAVA_FLOAT),
967-
Map.entry("jdouble", ValueLayout.JAVA_DOUBLE));
968-
}
969-
970914
@Override
971915
public Registers upcallSpecialArgumentsRegisters() {
972916
return new Registers(AMD64.r10, AMD64.r11);
@@ -1058,7 +1002,7 @@ public void checkLibrarySupport() {
10581002

10591003
@Override
10601004
public Map<String, MemoryLayout> canonicalLayouts() {
1061-
return canonicalLayouts(ValueLayout.JAVA_LONG, ValueLayout.JAVA_LONG, ValueLayout.JAVA_INT);
1005+
return SharedUtils.canonicalLayouts(ValueLayout.JAVA_LONG, ValueLayout.JAVA_LONG, ValueLayout.JAVA_INT);
10621006
}
10631007
}
10641008

@@ -1114,7 +1058,7 @@ public void checkLibrarySupport() {
11141058

11151059
@Override
11161060
public Map<String, MemoryLayout> canonicalLayouts() {
1117-
return canonicalLayouts(ValueLayout.JAVA_INT, ValueLayout.JAVA_LONG, ValueLayout.JAVA_CHAR);
1061+
return SharedUtils.canonicalLayouts(ValueLayout.JAVA_INT, ValueLayout.JAVA_LONG, ValueLayout.JAVA_CHAR);
11181062
}
11191063
}
11201064

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -28,9 +28,31 @@
2828

2929
import com.oracle.svm.core.SubstrateOptions;
3030

31-
final class ForeignFunctionsEnabled implements BooleanSupplier {
32-
@Override
33-
public boolean getAsBoolean() {
34-
return SubstrateOptions.ForeignAPISupport.getValue();
31+
/**
32+
* Set of predicates used to control activation of substitutions (depending on method
33+
* {@link ForeignFunctionsRuntime#areFunctionCallsSupported()}) if FFM API support is enabled. In
34+
* case of the FFM API support is disabled entirely, substitutions in
35+
* {@link com.oracle.svm.core.jdk.ForeignDisabledSubstitutions} will be used.
36+
*/
37+
public final class ForeignAPIPredicates {
38+
public static final class Enabled implements BooleanSupplier {
39+
@Override
40+
public boolean getAsBoolean() {
41+
return SubstrateOptions.ForeignAPISupport.getValue();
42+
}
43+
}
44+
45+
public static final class FunctionCallsSupported implements BooleanSupplier {
46+
@Override
47+
public boolean getAsBoolean() {
48+
return SubstrateOptions.ForeignAPISupport.getValue() && ForeignFunctionsRuntime.areFunctionCallsSupported();
49+
}
50+
}
51+
52+
public static final class FunctionCallsUnsupported implements BooleanSupplier {
53+
@Override
54+
public boolean getAsBoolean() {
55+
return SubstrateOptions.ForeignAPISupport.getValue() && !ForeignFunctionsRuntime.areFunctionCallsSupported();
56+
}
3557
}
3658
}

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/ForeignFunctionsRuntime.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@
2929
import java.lang.constant.DirectMethodHandleDesc;
3030
import java.lang.invoke.MethodHandle;
3131
import java.util.HashMap;
32+
import java.util.Locale;
3233
import java.util.Map;
3334
import java.util.function.BiConsumer;
3435

35-
import jdk.graal.compiler.word.Word;
3636
import org.graalvm.collections.EconomicMap;
3737
import org.graalvm.nativeimage.ImageSingletons;
3838
import org.graalvm.nativeimage.Platform;
@@ -44,6 +44,8 @@
4444

4545
import com.oracle.svm.core.FunctionPointerHolder;
4646
import com.oracle.svm.core.OS;
47+
import com.oracle.svm.core.SubstrateOptions;
48+
import com.oracle.svm.core.SubstrateUtil;
4749
import com.oracle.svm.core.Uninterruptible;
4850
import com.oracle.svm.core.headers.LibC;
4951
import com.oracle.svm.core.headers.WindowsAPIs;
@@ -53,6 +55,8 @@
5355
import com.oracle.svm.core.util.VMError;
5456

5557
import jdk.graal.compiler.api.replacements.Fold;
58+
import jdk.graal.compiler.word.Word;
59+
import jdk.internal.foreign.CABI;
5660
import jdk.internal.foreign.abi.CapturableState;
5761

5862
public class ForeignFunctionsRuntime {
@@ -76,6 +80,21 @@ public static ForeignFunctionsRuntime singleton() {
7680
public ForeignFunctionsRuntime() {
7781
}
7882

83+
public static boolean areFunctionCallsSupported() {
84+
return switch (CABI.current()) {
85+
case CABI.SYS_V -> !OS.DARWIN.isCurrent(); // GR-63074: code emit failures on
86+
// darwin-amd64
87+
case CABI.WIN_64, CABI.MAC_OS_AARCH_64, CABI.LINUX_AARCH_64 -> true;
88+
default -> false;
89+
};
90+
}
91+
92+
public static RuntimeException functionCallsUnsupported() {
93+
assert SubstrateOptions.ForeignAPISupport.getValue();
94+
throw VMError.unsupportedFeature("Calling foreign functions is currently not supported on platform: " +
95+
(OS.getCurrent().className + "-" + SubstrateUtil.getArchitectureName()).toLowerCase(Locale.ROOT));
96+
}
97+
7998
@Platforms(Platform.HOSTED_ONLY.class)
8099
public void addDowncallStubPointer(NativeEntryPointInfo nep, CFunctionPointer ptr) {
81100
VMError.guarantee(!downcallStubs.containsKey(nep), "Seems like multiple stubs were generated for %s", nep);
@@ -117,6 +136,9 @@ CFunctionPointer getUpcallStubPointer(JavaEntryPointInfo jep) {
117136
}
118137

119138
Pointer registerForUpcall(MethodHandle methodHandle, JavaEntryPointInfo jep) {
139+
if (!areFunctionCallsSupported()) {
140+
throw functionCallsUnsupported();
141+
}
120142
/*
121143
* Look up the upcall stub pointer first to avoid unnecessary allocation and synchronization
122144
* if it doesn't exist.

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_java_lang_foreign_SymbolLookup.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -67,7 +67,7 @@
6767
* succeed. See
6868
* {@link com.oracle.svm.core.jdk.Target_java_lang_ClassLoader#loadLibrary(java.lang.Class, java.lang.String)}
6969
*/
70-
@TargetClass(className = "java.lang.foreign.SymbolLookup", onlyWith = ForeignFunctionsEnabled.class)
70+
@TargetClass(className = "java.lang.foreign.SymbolLookup", onlyWith = ForeignAPIPredicates.Enabled.class)
7171
public final class Target_java_lang_foreign_SymbolLookup {
7272

7373
@Substitute

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_SystemLookup.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,7 @@
3535
* libraries. The provided libraries are not really defined in the documentation, so the best we can
3636
* do is load the exact same libraries as HotSpot.
3737
*/
38-
@TargetClass(className = "jdk.internal.foreign.SystemLookup", onlyWith = ForeignFunctionsEnabled.class)
38+
@TargetClass(className = "jdk.internal.foreign.SystemLookup", onlyWith = ForeignAPIPredicates.Enabled.class)
3939
public final class Target_jdk_internal_foreign_SystemLookup {
4040
@Substitute
4141
public Optional<MemorySegment> find(String name) {
@@ -48,6 +48,6 @@ public Optional<MemorySegment> find(String name) {
4848
* 'jdk.internal.foreign.SystemLookup$WindowsFallbackSymbols') changes, ensure that the enum values
4949
* are still in sync with 'com.oracle.svm.native.libchelper/src/syslookup.c'.
5050
*/
51-
@TargetClass(className = "jdk.internal.foreign.SystemLookup", innerClass = "WindowsFallbackSymbols", onlyWith = ForeignFunctionsEnabled.class)
51+
@TargetClass(className = "jdk.internal.foreign.SystemLookup", innerClass = "WindowsFallbackSymbols", onlyWith = ForeignAPIPredicates.Enabled.class)
5252
final class Target_jdk_internal_foreign_SystemLookup_WindowsFallbackSymbols {
5353
}

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_Utils_BaseAndScale.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.svm.core.foreign;
2626

27-
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
2827
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
2928

3029
import com.oracle.svm.core.annotate.Alias;
@@ -35,17 +34,18 @@
3534
import com.oracle.svm.core.jdk.JDKLatest;
3635
import com.oracle.svm.core.util.VMError;
3736

37+
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
3838
import jdk.internal.foreign.Utils;
3939
import jdk.vm.ci.meta.JavaKind;
4040

41-
@TargetClass(className = "jdk.internal.foreign.Utils", innerClass = "BaseAndScale", onlyWith = {ForeignFunctionsEnabled.class, JDKLatest.class})
41+
@TargetClass(className = "jdk.internal.foreign.Utils", innerClass = "BaseAndScale", onlyWith = {ForeignAPIPredicates.Enabled.class, JDKLatest.class})
4242
final class Target_jdk_internal_foreign_Utils_BaseAndScale {
4343
@Alias //
4444
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Custom, declClass = BaseFieldRecomputer.class) //
4545
long base;
4646
}
4747

48-
@TargetClass(className = "jdk.internal.foreign.Utils", innerClass = "BaseAndScale", onlyWith = {ForeignFunctionsEnabled.class, JDK21OrEarlier.class})
48+
@TargetClass(className = "jdk.internal.foreign.Utils", innerClass = "BaseAndScale", onlyWith = {ForeignAPIPredicates.Enabled.class, JDK21OrEarlier.class})
4949
final class Target_jdk_internal_foreign_Utils_BaseAndScale_JDK21 {
5050
@Alias //
5151
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Custom, declClass = BaseFieldRecomputer.class) //

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_abi_AbstractLinker.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
4747
import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
4848

49-
@TargetClass(AbstractLinker.class)
49+
@TargetClass(value = AbstractLinker.class, onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
5050
public final class Target_jdk_internal_foreign_abi_AbstractLinker {
5151
// Checkstyle: stop
5252
@Alias //
@@ -59,7 +59,7 @@ public final class Target_jdk_internal_foreign_abi_AbstractLinker {
5959
// Checkstyle: resume
6060
}
6161

62-
@TargetClass(className = "jdk.internal.foreign.abi.SoftReferenceCache")
62+
@TargetClass(className = "jdk.internal.foreign.abi.SoftReferenceCache", onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
6363
final class Target_jdk_internal_foreign_abi_SoftReferenceCache {
6464
}
6565

@@ -92,7 +92,7 @@ public MemorySegment makeStub(MethodHandle target, Arena arena) {
9292
}
9393
}
9494

95-
@TargetClass(value = SysVx64Linker.class, onlyWith = ForeignFunctionsEnabled.class)
95+
@TargetClass(value = SysVx64Linker.class, onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
9696
final class Target_jdk_internal_foreign_abi_x64_sysv_SysVx64Linker {
9797

9898
@Substitute
@@ -101,7 +101,7 @@ UpcallStubFactory arrangeUpcall(MethodType targetType, FunctionDescriptor functi
101101
}
102102
}
103103

104-
@TargetClass(value = Windowsx64Linker.class, onlyWith = ForeignFunctionsEnabled.class)
104+
@TargetClass(value = Windowsx64Linker.class, onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
105105
final class Target_jdk_internal_foreign_abi_x64_windows_Windowsx64Linker {
106106

107107
@Substitute
@@ -110,7 +110,7 @@ UpcallStubFactory arrangeUpcall(MethodType targetType, FunctionDescriptor functi
110110
}
111111
}
112112

113-
@TargetClass(value = MacOsAArch64Linker.class, onlyWith = ForeignFunctionsEnabled.class)
113+
@TargetClass(value = MacOsAArch64Linker.class, onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
114114
final class Target_jdk_internal_foreign_abi_aarch64_macos_MacOsAArch64Linker {
115115

116116
@Substitute
@@ -119,7 +119,7 @@ UpcallStubFactory arrangeUpcall(MethodType targetType, FunctionDescriptor functi
119119
}
120120
}
121121

122-
@TargetClass(value = LinuxAArch64Linker.class, onlyWith = ForeignFunctionsEnabled.class)
122+
@TargetClass(value = LinuxAArch64Linker.class, onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
123123
final class Target_jdk_internal_foreign_abi_aarch64_linux_LinuxAArch64Linker {
124124

125125
@Substitute

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_abi_NativeEntryPoint.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@
3838
* Packs the address of a {@link com.oracle.svm.hosted.foreign.DowncallStub} with some extra
3939
* information.
4040
*/
41-
@TargetClass(className = "jdk.internal.foreign.abi.NativeEntryPoint", onlyWith = ForeignFunctionsEnabled.class)
41+
@TargetClass(className = "jdk.internal.foreign.abi.NativeEntryPoint", onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
4242
@Substitute
4343
public final class Target_jdk_internal_foreign_abi_NativeEntryPoint {
4444

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_abi_UpcallLinker.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,7 @@
3333
import jdk.internal.foreign.abi.ABIDescriptor;
3434
import jdk.internal.foreign.abi.VMStorage;
3535

36-
@TargetClass(className = "jdk.internal.foreign.abi.UpcallLinker", onlyWith = ForeignFunctionsEnabled.class)
36+
@TargetClass(className = "jdk.internal.foreign.abi.UpcallLinker", onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
3737
final class Target_jdk_internal_foreign_abi_UpcallLinker {
3838

3939
@Substitute
@@ -48,7 +48,7 @@ private static void registerNatives() {
4848
}
4949
}
5050

51-
@TargetClass(className = "jdk.internal.foreign.abi.UpcallLinker", innerClass = "CallRegs", onlyWith = ForeignFunctionsEnabled.class)
51+
@TargetClass(className = "jdk.internal.foreign.abi.UpcallLinker", innerClass = "CallRegs", onlyWith = ForeignAPIPredicates.FunctionCallsSupported.class)
5252
final class Target_jdk_internal_foreign_abi_UpcallLinker_CallRegs {
5353
@Alias private VMStorage[] argRegs;
5454
@Alias private VMStorage[] retRegs;

0 commit comments

Comments
 (0)