diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/feature/InternalFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/feature/InternalFeature.java index ff179df398b7..bed3f04b0b78 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/feature/InternalFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/feature/InternalFeature.java @@ -40,6 +40,8 @@ import jdk.graal.compiler.options.OptionValues; import jdk.graal.compiler.phases.tiers.Suites; import jdk.graal.compiler.phases.util.Providers; +import jdk.vm.ci.meta.MetaAccessProvider; +import jdk.vm.ci.meta.ResolvedJavaType; public interface InternalFeature extends Feature { @@ -135,4 +137,11 @@ interface AfterAbstractImageCreationAccess extends FeatureAccess { */ default void afterAbstractImageCreation(AfterAbstractImageCreationAccess access) { } + + @Platforms(Platform.HOSTED_ONLY.class) + interface InternalFeatureAccess extends FeatureAccess { + ResolvedJavaType findTypeByName(String className); + + MetaAccessProvider getMetaAccess(); + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JNIRegistrationUtil.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JNIRegistrationUtil.java index 11602da35182..9365745a64c6 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JNIRegistrationUtil.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JNIRegistrationUtil.java @@ -24,27 +24,28 @@ */ package com.oracle.svm.core.jdk; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.Collections; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; -import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.hosted.Feature.AfterAnalysisAccess; import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess; import org.graalvm.nativeimage.hosted.Feature.FeatureAccess; -import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; -import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.InternalPlatform; -import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; +import com.oracle.svm.core.feature.InternalFeature.InternalFeatureAccess; import com.oracle.svm.core.util.ConcurrentIdentityHashMap; import com.oracle.svm.core.util.VMError; -import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.JVMCIReflectionUtil; +import com.oracle.svm.util.JVMCIRuntimeClassInitializationSupport; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeReflection; + +import jdk.vm.ci.meta.ResolvedJavaField; +import jdk.vm.ci.meta.ResolvedJavaMethod; +import jdk.vm.ci.meta.ResolvedJavaType; /** * Utility methods used by features that perform JNI registration. @@ -72,52 +73,55 @@ protected static boolean isWindows() { } protected static void initializeAtRunTime(FeatureAccess access, String... classNames) { - RuntimeClassInitializationSupport classInitSupport = ImageSingletons.lookup(RuntimeClassInitializationSupport.class); + InternalFeatureAccess internalAccess = (InternalFeatureAccess) access; + JVMCIRuntimeClassInitializationSupport classInitSupport = JVMCIRuntimeClassInitializationSupport.singleton(); for (String className : classNames) { - classInitSupport.initializeAtRunTime(clazz(access, className), "for JDK native code support via JNI"); + classInitSupport.initializeAtRunTime(type(internalAccess, className), "for JDK native code support via JNI"); } } - protected static Class clazz(FeatureAccess access, String className) { - Class classByName = access.findClassByName(className); - VMError.guarantee(classByName != null, "class %s not found", className); - return classByName; + protected static ResolvedJavaType type(FeatureAccess access, String className) { + ResolvedJavaType typeByName = ((InternalFeatureAccess) access).findTypeByName(className); + VMError.guarantee(typeByName != null, "class %s not found", className); + return typeByName; } - protected static Optional> optionalClazz(FeatureAccess access, String className) { - Class classByName = access.findClassByName(className); - return Optional.ofNullable(classByName); + protected static Optional optionalType(FeatureAccess access, String className) { + ResolvedJavaType typeByName = ((InternalFeatureAccess) access).findTypeByName(className); + return Optional.ofNullable(typeByName); } - protected static Optional optionalMethod(FeatureAccess access, String className, String methodName, Class... parameterTypes) { - return optionalClazz(access, className) - .flatMap(clazz -> Optional.ofNullable(ReflectionUtil.lookupMethod(true, clazz, methodName, parameterTypes))); + protected static Optional optionalMethod(FeatureAccess access, String className, String methodName, Class... parameterTypes) { + InternalFeatureAccess internalAccess = (InternalFeatureAccess) access; + return optionalType(access, className) + .flatMap(clazz -> Optional.ofNullable(JVMCIReflectionUtil.getUniqueDeclaredMethod(true, internalAccess.getMetaAccess(), clazz, methodName, parameterTypes))); } - protected static Method method(FeatureAccess access, String className, String methodName, Class... parameterTypes) { - return ReflectionUtil.lookupMethod(clazz(access, className), methodName, parameterTypes); + protected static ResolvedJavaMethod method(FeatureAccess access, String className, String methodName, Class... parameterTypes) { + return JVMCIReflectionUtil.getUniqueDeclaredMethod(((InternalFeatureAccess) access).getMetaAccess(), type(access, className), methodName, parameterTypes); } - protected static Constructor constructor(FeatureAccess access, String className, Class... parameterTypes) { - return ReflectionUtil.lookupConstructor(clazz(access, className), parameterTypes); + protected static ResolvedJavaMethod constructor(FeatureAccess access, String className, Class... parameterTypes) { + return JVMCIReflectionUtil.getDeclaredConstructor(((InternalFeatureAccess) access).getMetaAccess(), type(access, className), parameterTypes); } - protected static Field[] fields(FeatureAccess access, String className, String... fieldNames) { - Class clazz = clazz(access, className); - Field[] result = new Field[fieldNames.length]; + protected static ResolvedJavaField[] fields(FeatureAccess access, String className, String... fieldNames) { + ResolvedJavaType type = type(access, className); + ResolvedJavaField[] result = new ResolvedJavaField[fieldNames.length]; for (int i = 0; i < fieldNames.length; i++) { - result[i] = ReflectionUtil.lookupField(clazz, fieldNames[i]); + result[i] = JVMCIReflectionUtil.getUniqueDeclaredField(type, fieldNames[i]); } return result; } protected static void registerForThrowNew(FeatureAccess access, String... exceptionClassNames) { + InternalFeatureAccess internalAccess = (InternalFeatureAccess) access; for (String exceptionClassName : exceptionClassNames) { - RuntimeJNIAccess.register(clazz(access, exceptionClassName)); - RuntimeJNIAccess.register(constructor(access, exceptionClassName, String.class)); + JVMCIRuntimeJNIAccess.register(type(internalAccess, exceptionClassName)); + JVMCIRuntimeJNIAccess.register(constructor(internalAccess, exceptionClassName, String.class)); - RuntimeReflection.register(clazz(access, exceptionClassName)); - RuntimeReflection.register(constructor(access, exceptionClassName, String.class)); + JVMCIRuntimeReflection.register(type(internalAccess, exceptionClassName)); + JVMCIRuntimeReflection.register(constructor(internalAccess, exceptionClassName, String.class)); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureHandler.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureHandler.java index 29153152db00..ffb50843680d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureHandler.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureHandler.java @@ -64,6 +64,7 @@ import jdk.graal.compiler.debug.DebugContext; import jdk.graal.compiler.options.Option; +import jdk.vm.ci.meta.MetaAccessProvider; /** * Handles the registration and iterations of {@link Feature features}. @@ -115,8 +116,8 @@ public boolean containsFeature(Class c) { } @SuppressWarnings("unchecked") - public void registerFeatures(ImageClassLoader loader, DebugContext debug) { - IsInConfigurationAccessImpl access = new IsInConfigurationAccessImpl(this, loader, debug); + public void registerFeatures(ImageClassLoader loader, MetaAccessProvider originalMetaAccess, DebugContext debug) { + IsInConfigurationAccessImpl access = new IsInConfigurationAccessImpl(this, loader, originalMetaAccess, debug); LinkedHashSet> automaticFeatures = new LinkedHashSet<>(); NativeImageSystemClassLoader nativeImageSystemClassLoader = NativeImageSystemClassLoader.singleton(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java index eec56d855885..7fa6ebfe27d3 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java @@ -98,6 +98,7 @@ import com.oracle.svm.hosted.meta.HostedField; import com.oracle.svm.hosted.meta.HostedMetaAccess; import com.oracle.svm.hosted.meta.HostedMethod; +import com.oracle.svm.hosted.meta.HostedType; import com.oracle.svm.hosted.meta.HostedUniverse; import com.oracle.svm.hosted.option.HostedOptionProvider; import com.oracle.svm.util.AnnotationUtil; @@ -108,11 +109,12 @@ import jdk.graal.compiler.phases.util.Providers; import jdk.internal.vm.annotation.Stable; import jdk.vm.ci.meta.MetaAccessProvider; +import jdk.vm.ci.meta.ResolvedJavaType; @SuppressWarnings("deprecation") public class FeatureImpl { - public abstract static class FeatureAccessImpl implements Feature.FeatureAccess { + public abstract static class FeatureAccessImpl implements InternalFeature.InternalFeatureAccess { protected final FeatureHandler featureHandler; protected final ImageClassLoader imageClassLoader; @@ -174,8 +176,25 @@ public ClassLoader getApplicationClassLoader() { } public static class IsInConfigurationAccessImpl extends FeatureAccessImpl implements Feature.IsInConfigurationAccess { - IsInConfigurationAccessImpl(FeatureHandler featureHandler, ImageClassLoader imageClassLoader, DebugContext debugContext) { + private final MetaAccessProvider metaAccess; + + IsInConfigurationAccessImpl(FeatureHandler featureHandler, ImageClassLoader imageClassLoader, MetaAccessProvider metaAccess, DebugContext debugContext) { super(featureHandler, imageClassLoader, debugContext); + this.metaAccess = metaAccess; + } + + @Override + public ResolvedJavaType findTypeByName(String className) { + Class clazz = findClassByName(className); + if (clazz == null) { + return null; + } + return getMetaAccess().lookupJavaType(clazz); + } + + @Override + public MetaAccessProvider getMetaAccess() { + return metaAccess; } } @@ -190,6 +209,7 @@ public AfterRegistrationAccessImpl(FeatureHandler featureHandler, ImageClassLoad this.mainEntryPoint = mainEntryPoint; } + @Override public MetaAccessProvider getMetaAccess() { return metaAccess; } @@ -221,6 +241,15 @@ public JNIAccess getJNIAccess() { public ForeignAccess getForeignAccess() { return ForeignAccessImpl.singleton(); } + + @Override + public ResolvedJavaType findTypeByName(String className) { + Class clazz = findClassByName(className); + if (clazz == null) { + return null; + } + return getMetaAccess().lookupJavaType(clazz); + } } abstract static class AnalysisAccessBase extends FeatureAccessImpl { @@ -240,10 +269,12 @@ public AnalysisUniverse getUniverse() { return bb.getUniverse(); } + @Override public AnalysisMetaAccess getMetaAccess() { return bb.getMetaAccess(); } + @Override public AnalysisType findTypeByName(String className) { Class clazz = findClassByName(className); if (clazz == null) { @@ -692,7 +723,31 @@ public OnAnalysisExitAccessImpl(FeatureHandler featureHandler, ImageClassLoader } } - public static class BeforeUniverseBuildingAccessImpl extends FeatureAccessImpl implements Feature.BeforeUniverseBuildingAccess { + public abstract static class HostedFeatureAccessImpl extends FeatureAccessImpl { + + HostedFeatureAccessImpl(FeatureHandler featureHandler, ImageClassLoader imageClassLoader, DebugContext debugContext) { + super(featureHandler, imageClassLoader, debugContext); + } + + @Override + public abstract HostedMetaAccess getMetaAccess(); + + @Override + public HostedType findTypeByName(String className) { + Class clazz = findClassByName(className); + if (clazz == null) { + return null; + } + try { + return getMetaAccess().lookupJavaType(clazz); + } catch (AnalysisError.TypeNotFoundError e) { + // Type not found during analysis + return null; + } + } + } + + public static class BeforeUniverseBuildingAccessImpl extends HostedFeatureAccessImpl implements Feature.BeforeUniverseBuildingAccess { protected final HostedMetaAccess hMetaAccess; BeforeUniverseBuildingAccessImpl(FeatureHandler featureHandler, ImageClassLoader imageClassLoader, DebugContext debugContext, HostedMetaAccess hMetaAccess) { @@ -700,12 +755,13 @@ public static class BeforeUniverseBuildingAccessImpl extends FeatureAccessImpl i this.hMetaAccess = hMetaAccess; } + @Override public HostedMetaAccess getMetaAccess() { return hMetaAccess; } } - public static class CompilationAccessImpl extends FeatureAccessImpl implements Feature.CompilationAccess { + public static class CompilationAccessImpl extends HostedFeatureAccessImpl implements Feature.CompilationAccess { protected final AnalysisUniverse aUniverse; protected final HostedUniverse hUniverse; @@ -748,6 +804,7 @@ public void registerAsImmutable(Object root, Predicate includeObject) { heap.registerAsImmutable(root, includeObject); } + @Override public HostedMetaAccess getMetaAccess() { return (HostedMetaAccess) getProviders().getMetaAccess(); } @@ -825,7 +882,7 @@ public BeforeHeapLayoutAccessImpl(FeatureHandler featureHandler, ImageClassLoade } } - public static class AfterHeapLayoutAccessImpl extends FeatureAccessImpl implements Feature.AfterHeapLayoutAccess { + public static class AfterHeapLayoutAccessImpl extends HostedFeatureAccessImpl implements Feature.AfterHeapLayoutAccess { protected final HostedMetaAccess hMetaAccess; protected final NativeImageHeap heap; @@ -835,6 +892,7 @@ public AfterHeapLayoutAccessImpl(FeatureHandler featureHandler, ImageClassLoader this.hMetaAccess = hMetaAccess; } + @Override public HostedMetaAccess getMetaAccess() { return hMetaAccess; } @@ -844,7 +902,7 @@ public NativeImageHeap getHeap() { } } - public static class BeforeImageWriteAccessImpl extends FeatureAccessImpl implements Feature.BeforeImageWriteAccess { + public static class BeforeImageWriteAccessImpl extends HostedFeatureAccessImpl implements Feature.BeforeImageWriteAccess { private List> linkerInvocationTransformers = null; protected final String imageName; @@ -887,7 +945,8 @@ public HostedUniverse getHostedUniverse() { return hUniverse; } - public HostedMetaAccess getHostedMetaAccess() { + @Override + public HostedMetaAccess getMetaAccess() { return hMetaAccess; } @@ -906,15 +965,17 @@ public void registerLinkerInvocationTransformer(Function getImageSymbols(boolean onlyGlobal) { return linkerInvocation.getImageSymbols(onlyGlobal); } + + @Override + public HostedMetaAccess getMetaAccess() { + return hMetaAcces; + } } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java index 611118815aff..101ee186e9f7 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java @@ -113,7 +113,7 @@ public ImageHeapPartition[] getAllImageHeapPartitions() { protected void calculate(BeforeImageWriteAccessImpl access, boolean resourcesAreReachable) { allImageHeapPartitions = access.getImage().getHeap().getLayouter().getPartitions(); - HostedMetaAccess metaAccess = access.getHostedMetaAccess(); + HostedMetaAccess metaAccess = access.getMetaAccess(); ObjectLayout objectLayout = ImageSingletons.lookup(ObjectLayout.class); Map classToDataMap = new HashMap<>(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java index 1d9fbb128c5a..7272fcfcc851 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java @@ -702,7 +702,7 @@ protected void doRun(Map entryPoints, JavaMainSupport j createAbstractImage(k, hostedEntryPoints, heap, hMetaAccess, codeCache); - FeatureImpl.AfterAbstractImageCreationAccessImpl access = new FeatureImpl.AfterAbstractImageCreationAccessImpl(featureHandler, loader, debug, image, + FeatureImpl.AfterAbstractImageCreationAccessImpl access = new FeatureImpl.AfterAbstractImageCreationAccessImpl(featureHandler, loader, hMetaAccess, debug, image, runtimeConfiguration.getBackendForNormalMethod()); featureHandler.forEachGraalFeature(feature -> feature.afterAbstractImageCreation(access)); @@ -750,7 +750,7 @@ protected void doRun(Map entryPoints, JavaMainSupport j return; } - AfterImageWriteAccessImpl afterConfig = new AfterImageWriteAccessImpl(featureHandler, loader, hUniverse, inv, tmpDir, image.getImageKind(), debug); + AfterImageWriteAccessImpl afterConfig = new AfterImageWriteAccessImpl(featureHandler, loader, hUniverse, inv, tmpDir, image.getImageKind(), hMetaAccess, debug); featureHandler.forEachFeature(feature -> feature.afterImageWrite(afterConfig)); try { // size changes during linking and afterConfig phase @@ -977,7 +977,7 @@ protected void setupNativeImage(OptionValues options, Map sunECConstructor = constructor(a, "sun.security.ec.SunEC"); - support.setSunECConstructor(sunECConstructor); + ResolvedJavaMethod sunECConstructor = constructor(a, "sun.security.ec.SunEC"); + support.setSunECConstructor((Constructor) OriginalMethodProvider.getJavaMethod(sunECConstructor)); Properties securityProperties = SharedSecrets.getJavaSecurityPropertiesAccess().getInitialProperties(); support.setSavedInitialSecurityProperties(securityProperties); @@ -306,30 +309,30 @@ public void duringSetup(DuringSetupAccess a) { rci.initializeAtRunTime(NativePRNG.Blocking.class, "for substitutions"); rci.initializeAtRunTime(NativePRNG.NonBlocking.class, "for substitutions"); - rci.initializeAtRunTime(clazz(access, "sun.security.provider.SeedGenerator"), "for substitutions"); - rci.initializeAtRunTime(clazz(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions"); + rci.initializeAtRunTime(type(access, "sun.security.provider.SeedGenerator"), "for substitutions"); + rci.initializeAtRunTime(type(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions"); /* * sun.security.provider.AbstractDrbg$SeederHolder has a static final EntropySource seeder * field that needs to be initialized at run time because it captures the result of * SeedGenerator.getSystemEntropy(). */ - rci.initializeAtRunTime(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions"); + rci.initializeAtRunTime(type(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions"); if (isMscapiModulePresent) { /* PRNG. creates a Cleaner (see JDK-8210476), which starts its thread. */ - rci.initializeAtRunTime(clazz(access, "sun.security.mscapi.PRNG"), "for substitutions"); + rci.initializeAtRunTime(type(access, "sun.security.mscapi.PRNG"), "for substitutions"); } - rci.initializeAtRunTime(clazz(access, "sun.security.provider.FileInputStreamPool"), "for substitutions"); + rci.initializeAtRunTime(type(access, "sun.security.provider.FileInputStreamPool"), "for substitutions"); /* java.util.UUID$Holder has a static final SecureRandom field. */ - rci.initializeAtRunTime(clazz(access, "java.util.UUID$Holder"), "for substitutions"); + rci.initializeAtRunTime(type(access, "java.util.UUID$Holder"), "for substitutions"); /* The classes below have a static final SecureRandom field. */ - rci.initializeAtRunTime(clazz(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions"); - rci.initializeAtRunTime(clazz(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions"); - optionalClazz(access, "sun.security.krb5.Confounder").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "for substitutions")); - optionalClazz(access, "sun.security.krb5.Config").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "Reset the value of lazily initialized field sun.security.krb5.Config#singleton")); + rci.initializeAtRunTime(type(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions"); + rci.initializeAtRunTime(type(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions"); + optionalType(access, "sun.security.krb5.Confounder").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "for substitutions")); + optionalType(access, "sun.security.krb5.Config").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "Reset the value of lazily initialized field sun.security.krb5.Config#singleton")); - rci.initializeAtRunTime(clazz(access, "sun.security.jca.JCAUtil"), "JCAUtil.def holds a SecureRandom."); + rci.initializeAtRunTime(type(access, "sun.security.jca.JCAUtil"), "JCAUtil.def holds a SecureRandom."); /* * When SSLContextImpl$DefaultManagersHolder sets-up the TrustManager in its initializer it @@ -337,13 +340,13 @@ public void duringSetup(DuringSetupAccess a) { * properties from the build machine. Running its initialization at run time is required to * use the run time provided values. */ - rci.initializeAtRunTime(clazz(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"), "for reading properties at run time"); + rci.initializeAtRunTime(type(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"), "for reading properties at run time"); /* * SSL debug logging enabled by javax.net.debug system property is set up during the class * initialization. */ - rci.initializeAtRunTime(clazz(access, "sun.security.ssl.SSLLogger"), "for reading properties at run time"); + rci.initializeAtRunTime(type(access, "sun.security.ssl.SSLLogger"), "for reading properties at run time"); } @Override @@ -381,7 +384,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { } if (isPosix()) { - Optional optMethodGetUnixInfo = optionalMethod(access, "com.sun.security.auth.module.UnixSystem", "getUnixInfo"); + Optional optMethodGetUnixInfo = optionalMethod(access, "com.sun.security.auth.module.UnixSystem", "getUnixInfo"); optMethodGetUnixInfo.ifPresent(m -> { access.registerReachabilityHandler(SecurityServicesFeature::linkJaas, m); /* Resolve calls to com_sun_security_auth_module_UnixSystem* as builtIn. */ @@ -390,7 +393,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { } if (isMscapiModulePresent) { - access.registerReachabilityHandler(SecurityServicesFeature::registerSunMSCAPIConfig, clazz(access, "sun.security.mscapi.SunMSCAPI")); + access.registerReachabilityHandler(SecurityServicesFeature::registerSunMSCAPIConfig, type(access, "sun.security.mscapi.SunMSCAPI")); /* Resolve calls to sun_security_mscapi* as builtIn. */ PlatformNativeLibrarySupport.singleton().addBuiltinPkgNativePrefix("sun_security_mscapi"); } @@ -544,26 +547,26 @@ private static void registerSunMSCAPIConfig(BeforeAnalysisAccess a) { } private static void registerLoadKeysOrCertificateChains(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(constructor(a, "java.util.ArrayList")); - RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificate", byte[].class, Collection.class)); - RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificateChain", String.class, Collection.class)); - RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateKeyAndCertificateChain", boolean.class, String.class, long.class, long.class, int.class, Collection.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.util.ArrayList")); + JVMCIRuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificate", byte[].class, Collection.class)); + JVMCIRuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificateChain", String.class, Collection.class)); + JVMCIRuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateKeyAndCertificateChain", boolean.class, String.class, long.class, long.class, int.class, Collection.class)); } private static void registerGenerateCKeyPair(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(constructor(a, "sun.security.mscapi.CKeyPair", String.class, long.class, long.class, int.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.security.mscapi.CKeyPair", String.class, long.class, long.class, int.class)); } private static void registerCPrivateKeyOf(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPrivateKey", "of", String.class, long.class, long.class, int.class)); + JVMCIRuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPrivateKey", "of", String.class, long.class, long.class, int.class)); } private static void registerCPublicKeyOf(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPublicKey", "of", String.class, long.class, long.class, int.class)); + JVMCIRuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPublicKey", "of", String.class, long.class, long.class, int.class)); } private static void linkJaas(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(fields(a, "com.sun.security.auth.module.UnixSystem", "username", "uid", "gid", "groups")); + JVMCIRuntimeJNIAccess.register(fields(a, "com.sun.security.auth.module.UnixSystem", "username", "uid", "gid", "groups")); NativeLibraries nativeLibraries = ((DuringAnalysisAccessImpl) a).getNativeLibraries(); /* We can statically link jaas, thus we classify it as builtIn library */ @@ -657,8 +660,8 @@ private void registerServiceReachabilityHandlers(BeforeAnalysisAccess access) { * java.security.Provider.Service.newInstance() directly. On Open JDK * SecureRandom.getInstance() is used instead. */ - Optional defaultSecureRandomService = optionalMethod(access, "java.security.Provider", "getDefaultSecureRandomService"); - defaultSecureRandomService.ifPresent(m -> access.registerMethodOverrideReachabilityHandler((a, t) -> registerServices(a, t, SECURE_RANDOM_SERVICE), m)); + Optional defaultSecureRandomService = optionalMethod(access, "java.security.Provider", "getDefaultSecureRandomService"); + defaultSecureRandomService.ifPresent(m -> access.registerMethodOverrideReachabilityHandler((a, t) -> registerServices(a, t, SECURE_RANDOM_SERVICE), OriginalMethodProvider.getJavaMethod(m))); } private void registerServices(DuringAnalysisAccess access, Object trigger, Class serviceClass) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/classinitialization/ClassInitializationSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/classinitialization/ClassInitializationSupport.java index 20a0a745f563..43f6f7176883 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/classinitialization/ClassInitializationSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/classinitialization/ClassInitializationSupport.java @@ -61,6 +61,7 @@ import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.hosted.LinkAtBuildTimeSupport; +import com.oracle.svm.util.JVMCIRuntimeClassInitializationSupport; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ModuleSupport; import com.oracle.svm.util.OriginalClassProvider; @@ -107,7 +108,7 @@ * build-time initialized class reference image heap values that were copied from the corresponding * fields in the hosting VM. */ -public class ClassInitializationSupport implements RuntimeClassInitializationSupport { +public class ClassInitializationSupport implements JVMCIRuntimeClassInitializationSupport { /** * Setup for class initialization: configured through features and command line input. It @@ -345,6 +346,12 @@ public void initializeAtRunTime(Class clazz, String reason) { classInitializationConfiguration.insert(clazz.getTypeName(), InitKind.RUN_TIME, reason, true); } + @Override + public void initializeAtRunTime(ResolvedJavaType aType, String reason) { + // GR-71807: reverse this so that the Class variant calls the ResolvedJavaType version + initializeAtRunTime(OriginalClassProvider.getJavaClass(aType), reason); + } + @Override public void initializeAtRunTime(String name, String reason) { UserError.guarantee(!configurationSealed, "The class initialization configuration can be changed only before the phase analysis."); @@ -357,6 +364,12 @@ public void initializeAtRunTime(String name, String reason) { } } + @Override + public void initializeAtBuildTime(ResolvedJavaType aType, String reason) { + // GR-71807: reverse this so that the Class variant calls the ResolvedJavaType version + initializeAtBuildTime(OriginalClassProvider.getJavaClass(aType), reason); + } + @Override public void initializeAtBuildTime(Class aClass, String reason) { UserError.guarantee(!configurationSealed, "The class initialization configuration can be changed only before the phase analysis."); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoFeature.java index b35732f520d1..79a4234743fb 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoFeature.java @@ -259,7 +259,7 @@ public void beforeImageWrite(BeforeImageWriteAccess access) { var accessImpl = (FeatureImpl.BeforeImageWriteAccessImpl) access; var image = accessImpl.getImage(); var debugContext = new DebugContext.Builder(HostedOptionValues.singleton(), new GraalDebugHandlersFactory(GraalAccess.getOriginalSnippetReflection())).build(); - DebugInfoProvider provider = new NativeImageDebugInfoProvider(debugContext, image.getCodeCache(), image.getHeap(), image.getNativeLibs(), accessImpl.getHostedMetaAccess(), + DebugInfoProvider provider = new NativeImageDebugInfoProvider(debugContext, image.getCodeCache(), image.getHeap(), image.getNativeLibs(), accessImpl.getMetaAccess(), accessImpl.getRuntimeConfiguration()); var objectFile = image.getObjectFile(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java index 1504800451da..84086d512733 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java @@ -186,7 +186,7 @@ public void beforeImageWrite(BeforeImageWriteAccess access) { */ constantCandidates.entrySet().stream().filter(e -> !(e.getValue() instanceof FutureConstantCandidateInfo)).forEach(entry -> { Object object = entry.getValue(); - var optional = config.getHostedMetaAccess().optionalLookupJavaType(object.getClass()); + var optional = config.getMetaAccess().optionalLookupJavaType(object.getClass()); if (optional.isPresent()) { var constant = (ImageHeapConstant) snippetReflection.forObject(object); var objectInfo = heap.getConstantInfo(constant); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJava.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJava.java index 605de8fb1418..ef8c931e91f0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJava.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJava.java @@ -24,7 +24,6 @@ */ package com.oracle.svm.hosted.jdk; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -43,6 +42,9 @@ import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.FeatureImpl; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; + +import jdk.vm.ci.meta.ResolvedJavaMethod; /** * Registration of classes, methods, and fields accessed via JNI by C code of the JDK. @@ -71,16 +73,16 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { "java.lang.InstantiationException", "java.lang.UnsupportedOperationException", "java.io.IOException", "java.io.FileNotFoundException", "java.io.SyncFailedException", "java.io.InterruptedIOException", "java.util.zip.DataFormatException", "java.lang.IndexOutOfBoundsException"); - RuntimeJNIAccess.register(constructor(a, "java.io.FileNotFoundException", String.class, String.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.io.FileNotFoundException", String.class, String.class)); /* Unconditional Integer and Boolean JNI registration (cheap) */ - RuntimeJNIAccess.register(clazz(a, "java.lang.Integer")); - RuntimeJNIAccess.register(constructor(a, "java.lang.Integer", int.class)); - RuntimeJNIAccess.register(fields(a, "java.lang.Integer", "value")); - RuntimeJNIAccess.register(clazz(a, "java.lang.Boolean")); - RuntimeJNIAccess.register(constructor(a, "java.lang.Boolean", boolean.class)); - RuntimeJNIAccess.register(fields(a, "java.lang.Boolean", "value")); - RuntimeJNIAccess.register(method(a, "java.lang.Boolean", "getBoolean", String.class)); + JVMCIRuntimeJNIAccess.register(type(a, "java.lang.Integer")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.lang.Integer", int.class)); + JVMCIRuntimeJNIAccess.register(fields(a, "java.lang.Integer", "value")); + JVMCIRuntimeJNIAccess.register(type(a, "java.lang.Boolean")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.lang.Boolean", boolean.class)); + JVMCIRuntimeJNIAccess.register(fields(a, "java.lang.Boolean", "value")); + JVMCIRuntimeJNIAccess.register(method(a, "java.lang.Boolean", "getBoolean", String.class)); /* * Core JDK elements accessed from many places all around the JDK. They can be registered @@ -88,19 +90,19 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { */ RuntimeJNIAccess.register(java.io.FileDescriptor.class); - RuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "fd")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "fd")); if (isWindows()) { - RuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "handle")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "handle")); } - RuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "append")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.FileDescriptor", "append")); /* Used by FileOutputStream.initIDs, which is called unconditionally during startup. */ - RuntimeJNIAccess.register(fields(a, "java.io.FileOutputStream", "fd")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.FileOutputStream", "fd")); /* Used by FileInputStream.initIDs, which is called unconditionally during startup. */ - RuntimeJNIAccess.register(fields(a, "java.io.FileInputStream", "fd")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.FileInputStream", "fd")); /* Used by UnixFileSystem/WinNTFileSystem.initIDs, called unconditionally during startup. */ RuntimeJNIAccess.register(java.io.File.class); - RuntimeJNIAccess.register(fields(a, "java.io.File", "path")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.File", "path")); // TODO classify the remaining registrations @@ -109,15 +111,15 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { RuntimeJNIAccess.register(String.class); RuntimeJNIAccess.register(System.class); - RuntimeJNIAccess.register(method(a, "java.lang.System", "getProperty", String.class)); + JVMCIRuntimeJNIAccess.register(method(a, "java.lang.System", "getProperty", String.class)); RuntimeJNIAccess.register(java.nio.charset.Charset.class); - RuntimeJNIAccess.register(constructor(a, "java.lang.String", byte[].class)); - RuntimeJNIAccess.register(method(a, "java.lang.String", "getBytes")); - RuntimeJNIAccess.register(method(a, "java.nio.charset.Charset", "forName", String.class)); - RuntimeJNIAccess.register(constructor(a, "java.lang.String", byte[].class, java.nio.charset.Charset.class)); - RuntimeJNIAccess.register(method(a, "java.lang.String", "getBytes", java.nio.charset.Charset.class)); - RuntimeJNIAccess.register(method(a, "java.lang.String", "concat", String.class)); - RuntimeJNIAccess.register(fields(a, "java.lang.String", "coder", "value")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.lang.String", byte[].class)); + JVMCIRuntimeJNIAccess.register(method(a, "java.lang.String", "getBytes")); + JVMCIRuntimeJNIAccess.register(method(a, "java.nio.charset.Charset", "forName", String.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.lang.String", byte[].class, java.nio.charset.Charset.class)); + JVMCIRuntimeJNIAccess.register(method(a, "java.lang.String", "getBytes", java.nio.charset.Charset.class)); + JVMCIRuntimeJNIAccess.register(method(a, "java.lang.String", "concat", String.class)); + JVMCIRuntimeJNIAccess.register(fields(a, "java.lang.String", "coder", "value")); a.registerReachabilityHandler(JNIRegistrationJava::registerRandomAccessFileInitIDs, method(a, "java.io.RandomAccessFile", "initIDs")); if (isWindows()) { @@ -125,7 +127,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { PlatformNativeLibrarySupport.singleton().addBuiltinPkgNativePrefix("sun_security_provider_NativeSeedGenerator"); } if (isDarwin()) { - List darwinMethods = Arrays.asList( + List darwinMethods = Arrays.asList( method(a, "apple.security.KeychainStore", "_scanKeychain", String.class), // JDK-8320362 method(a, "apple.security.KeychainStore", "_releaseKeychainItemRef", long.class), method(a, "apple.security.KeychainStore", "_addItemToKeychain", String.class, boolean.class, byte[].class, char[].class), @@ -136,7 +138,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { * classes sun.nio.fs.MacOXFileSystemProvider (9+), sun.net.spi.DefaultProxySelector * (9+) */ - ArrayList methods = new ArrayList<>(darwinMethods); + ArrayList methods = new ArrayList<>(darwinMethods); methods.addAll(Arrays.asList(method(a, "sun.nio.fs.MacOSXFileSystemProvider", "getFileTypeDetector"), method(a, "sun.net.spi.DefaultProxySelector", "getSystemProxies", String.class, String.class), method(a, "sun.net.spi.DefaultProxySelector", "init"))); @@ -148,10 +150,10 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { } private static void registerProcessHandleImplInfoInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(fields(a, "java.lang.ProcessHandleImpl$Info", "command", "commandLine", "arguments", "startTime", "totalTime", "user")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.lang.ProcessHandleImpl$Info", "command", "commandLine", "arguments", "startTime", "totalTime", "user")); } private static void registerRandomAccessFileInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(fields(a, "java.io.RandomAccessFile", "fd")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.io.RandomAccessFile", "fd")); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNet.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNet.java index d4bbcd964970..207f5cd36187 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNet.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNet.java @@ -28,8 +28,6 @@ import java.net.SocketAddress; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; -import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.InternalPlatform; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; @@ -41,6 +39,8 @@ import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.FeatureImpl.DuringAnalysisAccessImpl; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeReflection; /** * Registration of classes, methods, and fields accessed via JNI by C code of the JDK. @@ -123,19 +123,19 @@ static void registerInitInetAddressIDs(DuringAnalysisAccess a) { } /* Java_java_net_InetAddress_init */ - RuntimeJNIAccess.register(fields(a, "java.net.InetAddress", "holder")); - RuntimeJNIAccess.register(fields(a, "java.net.InetAddress$InetAddressHolder", "address", "family", "hostName", "originalHostName")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.InetAddress", "holder")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.InetAddress$InetAddressHolder", "address", "family", "hostName", "originalHostName")); /* Java_java_net_Inet4Address_init */ - RuntimeJNIAccess.register(constructor(a, "java.net.Inet4Address")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.Inet4Address")); /* Java_java_net_Inet6Address_init */ - RuntimeJNIAccess.register(constructor(a, "java.net.Inet6Address")); - RuntimeJNIAccess.register(fields(a, "java.net.Inet6Address", "holder6")); - RuntimeJNIAccess.register(fields(a, "java.net.Inet6Address$Inet6AddressHolder", "ipaddress", "scope_id", "scope_id_set", "scope_ifname")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.Inet6Address")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.Inet6Address", "holder6")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.Inet6Address$Inet6AddressHolder", "ipaddress", "scope_id", "scope_id_set", "scope_ifname")); /* Used by getEnhancedExceptionsAllowed() in net_util.c (JDK-8348986) */ - RuntimeJNIAccess.register(fields(a, "jdk.internal.util.Exceptions", "enhancedNonSocketExceptionText")); + JVMCIRuntimeJNIAccess.register(fields(a, "jdk.internal.util.Exceptions", "enhancedNonSocketExceptionText")); } private static void registerNetworkInterfaceInit(DuringAnalysisAccess a) { @@ -143,14 +143,14 @@ private static void registerNetworkInterfaceInit(DuringAnalysisAccess a) { return; /* Already registered. */ } - RuntimeJNIAccess.register(constructor(a, "java.net.NetworkInterface")); - RuntimeJNIAccess.register(fields(a, "java.net.NetworkInterface", "name", "displayName", "index", "addrs", "bindings", "childs")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.NetworkInterface")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.NetworkInterface", "name", "displayName", "index", "addrs", "bindings", "childs")); if (isPosix()) { - RuntimeJNIAccess.register(fields(a, "java.net.NetworkInterface", "virtual", "parent")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.NetworkInterface", "virtual", "parent")); } - RuntimeJNIAccess.register(constructor(a, "java.net.InterfaceAddress")); - RuntimeJNIAccess.register(fields(a, "java.net.InterfaceAddress", "address", "broadcast", "maskLength")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.InterfaceAddress")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.InterfaceAddress", "address", "broadcast", "maskLength")); registerInitInetAddressIDs(a); } @@ -165,8 +165,8 @@ private static void registerPlatformSocketOptionsCreate(DuringAnalysisAccess a) VMError.guarantee(isWindows(), "Unexpected platform"); implClassName = "jdk.net.WindowsSocketOptions"; } - RuntimeReflection.register(clazz(a, implClassName)); - RuntimeReflection.register(constructor(a, implClassName)); + JVMCIRuntimeReflection.register(type(a, implClassName)); + JVMCIRuntimeReflection.register(constructor(a, implClassName)); } private static void registerDefaultProxySelectorInit(DuringAnalysisAccess a) { @@ -175,15 +175,15 @@ private static void registerDefaultProxySelectorInit(DuringAnalysisAccess a) { access.getNativeLibraries().addDynamicNonJniLibrary("winhttp"); } - RuntimeJNIAccess.register(constructor(a, "java.net.Proxy", Proxy.Type.class, SocketAddress.class)); - RuntimeJNIAccess.register(fields(a, "java.net.Proxy", "NO_PROXY")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.Proxy", Proxy.Type.class, SocketAddress.class)); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.Proxy", "NO_PROXY")); - RuntimeJNIAccess.register(fields(a, "java.net.Proxy$Type", "HTTP", "SOCKS")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.net.Proxy$Type", "HTTP", "SOCKS")); - RuntimeJNIAccess.register(method(a, "java.net.InetSocketAddress", "createUnresolved", String.class, int.class)); + JVMCIRuntimeJNIAccess.register(method(a, "java.net.InetSocketAddress", "createUnresolved", String.class, int.class)); } private static void registerResolverConfigurationImplInit0(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(fields(a, "sun.net.dns.ResolverConfigurationImpl", "os_searchlist", "os_nameservers")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.net.dns.ResolverConfigurationImpl", "os_searchlist", "os_nameservers")); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNio.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNio.java index 084bba56aa68..ef236a1064bc 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNio.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationJavaNio.java @@ -30,8 +30,6 @@ import java.util.function.Consumer; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; -import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.InternalPlatform; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; @@ -43,6 +41,8 @@ import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.util.HostModuleUtil; import com.oracle.svm.util.JVMCIReflectionUtil; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeReflection; /** * Registration of classes, methods, and fields accessed via JNI by C code of the JDK. @@ -102,10 +102,10 @@ public void duringSetup(DuringSetupAccess a) { public void beforeAnalysis(BeforeAnalysisAccess a) { if (isPosix()) { registerForThrowNew(a, "sun.nio.fs.UnixException"); - RuntimeJNIAccess.register(constructor(a, "sun.nio.fs.UnixException", int.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.fs.UnixException", int.class)); } else if (isWindows()) { registerForThrowNew(a, "sun.nio.fs.WindowsException"); - RuntimeJNIAccess.register(constructor(a, "sun.nio.fs.WindowsException", int.class)); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.fs.WindowsException", int.class)); } // JDK-8220738 @@ -132,77 +132,77 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { } private static void registerNetInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(clazz(a, "java.net.InetSocketAddress")); - RuntimeJNIAccess.register(constructor(a, "java.net.InetSocketAddress", InetAddress.class, int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "java.net.InetSocketAddress")); + JVMCIRuntimeJNIAccess.register(constructor(a, "java.net.InetSocketAddress", InetAddress.class, int.class)); } private static void registerUnixNativeDispatcherInit(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.UnixFileAttributes")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.UnixFileAttributes")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "st_mode", "st_ino", "st_dev", "st_rdev", "st_nlink", "st_uid", "st_gid", "st_size", "st_atime_sec", "st_atime_nsec", "st_mtime_sec", "st_mtime_nsec", "st_ctime_sec", "st_ctime_nsec")); if (isDarwin() || isLinux()) { - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "st_birthtime_sec")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "birthtime_available")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "st_birthtime_sec")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "birthtime_available")); } if (isLinux()) { - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "st_birthtime_nsec")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileAttributes", "st_birthtime_nsec")); } - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.UnixFileStoreAttributes")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileStoreAttributes", "f_frsize", "f_blocks", "f_bfree", "f_bavail")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.UnixMountEntry")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixMountEntry", "name", "dir", "fstype", "opts", "dev")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.UnixFileStoreAttributes")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixFileStoreAttributes", "f_frsize", "f_blocks", "f_bfree", "f_bavail")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.UnixMountEntry")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixMountEntry", "name", "dir", "fstype", "opts", "dev")); /* * Registrations shared between all OS-specific subclasses of UnixNativeDispatcher, * therefore we factor it out here. */ - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.UnixMountEntry")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixMountEntry", "name", "dir", "fstype", "opts")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.UnixMountEntry")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.UnixMountEntry", "name", "dir", "fstype", "opts")); } private static void registerSctpChannelImplInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.MessageInfoImpl")); - RuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.MessageInfoImpl", int.class, SocketAddress.class, int.class, int.class, boolean.class, boolean.class, int.class)); - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.ResultContainer")); - RuntimeJNIAccess.register(fields(a, "sun.nio.ch.sctp.ResultContainer", "value", "type")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.SendFailed")); - RuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.SendFailed", int.class, SocketAddress.class, ByteBuffer.class, int.class, int.class)); - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.AssociationChange")); - RuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.AssociationChange", int.class, int.class, int.class, int.class)); - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.PeerAddrChange")); - RuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.PeerAddrChange", int.class, SocketAddress.class, int.class)); - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.sctp.Shutdown")); - RuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.Shutdown", int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.MessageInfoImpl")); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.MessageInfoImpl", int.class, SocketAddress.class, int.class, int.class, boolean.class, boolean.class, int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.ResultContainer")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.ch.sctp.ResultContainer", "value", "type")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.SendFailed")); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.SendFailed", int.class, SocketAddress.class, ByteBuffer.class, int.class, int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.AssociationChange")); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.AssociationChange", int.class, int.class, int.class, int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.PeerAddrChange")); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.PeerAddrChange", int.class, SocketAddress.class, int.class)); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.sctp.Shutdown")); + JVMCIRuntimeJNIAccess.register(constructor(a, "sun.nio.ch.sctp.Shutdown", int.class)); } private static void registerWindowsNativeDispatcherInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$FirstFile")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$FirstFile", "handle", "name", "attributes")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$FirstStream")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$FirstStream", "handle", "name")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$VolumeInformation")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$VolumeInformation", "fileSystemName", "volumeName", "volumeSerialNumber", "flags")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace", "freeBytesAvailable", "totalNumberOfBytes", "totalNumberOfFreeBytes")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace", "bytesPerSector")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$Account")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$Account", "domain", "name", "use")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$AclInformation")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$AclInformation", "aceCount")); - RuntimeJNIAccess.register(clazz(a, "sun.nio.fs.WindowsNativeDispatcher$CompletionStatus")); - RuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$CompletionStatus", "error", "bytesTransferred", "completionKey")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$FirstFile")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$FirstFile", "handle", "name", "attributes")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$FirstStream")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$FirstStream", "handle", "name")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$VolumeInformation")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$VolumeInformation", "fileSystemName", "volumeName", "volumeSerialNumber", "flags")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace", "freeBytesAvailable", "totalNumberOfBytes", "totalNumberOfFreeBytes")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$DiskFreeSpace", "bytesPerSector")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$Account")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$Account", "domain", "name", "use")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$AclInformation")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$AclInformation", "aceCount")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.fs.WindowsNativeDispatcher$CompletionStatus")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.fs.WindowsNativeDispatcher$CompletionStatus", "error", "bytesTransferred", "completionKey")); } private static void registerIocpInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(clazz(a, "sun.nio.ch.Iocp$CompletionStatus")); - RuntimeJNIAccess.register(fields(a, "sun.nio.ch.Iocp$CompletionStatus", "error", "bytesTransferred", "completionKey", "overlapped")); + JVMCIRuntimeJNIAccess.register(type(a, "sun.nio.ch.Iocp$CompletionStatus")); + JVMCIRuntimeJNIAccess.register(fields(a, "sun.nio.ch.Iocp$CompletionStatus", "error", "bytesTransferred", "completionKey", "overlapped")); } private static void registerConnectionCreateInetSocketAddress(DuringAnalysisAccess a) { - RuntimeReflection.register(clazz(a, "java.net.InetSocketAddress")); - RuntimeReflection.register(constructor(a, "java.net.InetSocketAddress", InetAddress.class, int.class)); + JVMCIRuntimeReflection.register(type(a, "java.net.InetSocketAddress")); + JVMCIRuntimeReflection.register(constructor(a, "java.net.InetSocketAddress", InetAddress.class, int.class)); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationManagementExt.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationManagementExt.java index f6cf8f18bee2..13a5c10ce3e9 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationManagementExt.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationManagementExt.java @@ -43,7 +43,7 @@ public class JNIRegistrationManagementExt extends JNIRegistrationUtil implements public void beforeAnalysis(BeforeAnalysisAccess access) { initializeAtRunTime(access, "com.sun.management.internal.OperatingSystemImpl"); - access.registerReachabilityHandler(this::linkManagementExt, clazz(access, "com.sun.management.internal.OperatingSystemImpl")); + access.registerReachabilityHandler(this::linkManagementExt, type(access, "com.sun.management.internal.OperatingSystemImpl")); PlatformNativeLibrarySupport.singleton().addBuiltinPkgNativePrefix("com_sun_management_internal_OperatingSystemImpl"); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationPrefs.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationPrefs.java index b29f1557ac49..e929b4344bd7 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationPrefs.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationPrefs.java @@ -46,6 +46,9 @@ import com.oracle.svm.hosted.c.NativeLibraries; import com.oracle.svm.util.HostModuleUtil; import com.oracle.svm.util.JVMCIReflectionUtil; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; + +import jdk.vm.ci.meta.ResolvedJavaType; @Platforms({InternalPlatform.PLATFORM_JNI.class}) @SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class, other = PartiallyLayerAware.class) @@ -75,15 +78,15 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { */ String preferencesImplementation = getPlatformPreferencesClassName(); initializeAtRunTime(access, preferencesImplementation); - ArrayList> triggers = new ArrayList<>(); - triggers.add(clazz(access, preferencesImplementation)); + ArrayList triggers = new ArrayList<>(); + triggers.add(type(access, preferencesImplementation)); if (isDarwin()) { String darwinSpecificClass = "java.util.prefs.MacOSXPreferencesFile"; initializeAtRunTime(access, darwinSpecificClass); /* present on Darwin in the JDK */ initializeAtRunTime(access, "java.util.prefs.FileSystemPreferences"); - triggers.add(clazz(access, darwinSpecificClass)); + triggers.add(type(access, darwinSpecificClass)); } access.registerReachabilityHandler(JNIRegistrationPrefs::handlePreferencesClassReachable, triggers.toArray()); @@ -109,7 +112,7 @@ private static void handlePreferencesClassReachable(@SuppressWarnings("unused") /* Darwin allocates a string array from native code */ RuntimeJNIAccess.register(String[].class); /* Called by libprefs on Darwin */ - RuntimeJNIAccess.register(method(access, "java.lang.System", "arraycopy", Object.class, int.class, Object.class, int.class, int.class)); + JVMCIRuntimeJNIAccess.register(method(access, "java.lang.System", "arraycopy", Object.class, int.class, Object.class, int.class, int.class)); } } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java index 7b93422708d6..0d8629240810 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java @@ -45,6 +45,7 @@ import org.graalvm.nativeimage.Platforms; import org.graalvm.nativeimage.impl.InternalPlatform; +import com.oracle.graal.pointsto.meta.AnalysisType; import com.oracle.svm.core.BuildArtifacts; import com.oracle.svm.core.ParsingReason; import com.oracle.svm.core.SubstrateOptions; @@ -68,6 +69,7 @@ import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.InterruptImageBuilding; import com.oracle.svm.core.util.VMError; +import com.oracle.svm.hosted.FeatureImpl.AfterAnalysisAccessImpl; import com.oracle.svm.hosted.FeatureImpl.AfterImageWriteAccessImpl; import com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl; import com.oracle.svm.hosted.FeatureImpl.BeforeImageWriteAccessImpl; @@ -125,8 +127,9 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { @Override public void afterAnalysis(AfterAnalysisAccess access) { if (isWindows()) { - var optSunMSCAPIClass = optionalClazz(access, "sun.security.mscapi.SunMSCAPI"); - isSunMSCAPIProviderReachable = optSunMSCAPIClass.isPresent() && access.isReachable(optSunMSCAPIClass.get()); + AfterAnalysisAccessImpl afterAnalysisAccessImpl = (AfterAnalysisAccessImpl) access; + var optSunMSCAPIClass = optionalType(access, "sun.security.mscapi.SunMSCAPI").map(AnalysisType.class::cast); + isSunMSCAPIProviderReachable = optSunMSCAPIClass.isPresent() && afterAnalysisAccessImpl.isReachable(optSunMSCAPIClass.get()); } if (ImageLayerBuildingSupport.buildingExtensionLayer()) { for (String library : jniRegistrationSupportSingleton.prevLayerRegisteredLibraries) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationsJavaZip.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationsJavaZip.java index 3fd489478088..ef1abc4b9d4e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationsJavaZip.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationsJavaZip.java @@ -25,7 +25,6 @@ package com.oracle.svm.hosted.jdk; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; import org.graalvm.nativeimage.impl.InternalPlatform; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; @@ -38,6 +37,7 @@ import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.c.NativeLibraries; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeJNIAccess; @Platforms(InternalPlatform.PLATFORM_JNI.class) @SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class, other = PartiallyLayerAware.class) @@ -59,7 +59,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { } private static void registerInflaterInitIDs(DuringAnalysisAccess a) { - RuntimeJNIAccess.register(fields(a, "java.util.zip.Inflater", "inputConsumed", "outputConsumed")); + JVMCIRuntimeJNIAccess.register(fields(a, "java.util.zip.Inflater", "inputConsumed", "outputConsumed")); } private static void registerAndLinkZip(@SuppressWarnings("unused") DuringAnalysisAccess a) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/management/ManagementFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/management/ManagementFeature.java index 08f4812e39ab..5f3594c9e7b8 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/management/ManagementFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/management/ManagementFeature.java @@ -75,6 +75,7 @@ import com.oracle.svm.hosted.FeatureImpl; import com.oracle.svm.hosted.imagelayer.HostedImageLayerBuildingSupport; import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeReflection; import jdk.vm.ci.code.BytecodeFrame; import jdk.vm.ci.code.BytecodePosition; @@ -186,7 +187,8 @@ public void duringSetup(DuringSetupAccess access) { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { access.registerReachabilityHandler(ManagementFeature::registerMBeanServerFactoryNewBuilder, method(access, "javax.management.MBeanServerFactory", "newBuilder", Class.class)); - access.registerReachabilityHandler(ManagementFeature::registerMXBeanMappingMakeOpenClass, method(access, "com.sun.jmx.mbeanserver.MXBeanMapping", "makeOpenClass", Type.class, OpenType.class)); + access.registerReachabilityHandler(ManagementFeature::registerMXBeanMappingMakeOpenClass, + method(access, "com.sun.jmx.mbeanserver.MXBeanMapping", "makeOpenClass", Type.class, OpenType.class)); if (ImageLayerBuildingSupport.firstImageBuild()) { assert verifyMemoryManagerBeans(); @@ -266,8 +268,8 @@ private static void registerMXBeanMappingMakeOpenClass(DuringAnalysisAccess acce * Registering the one-dimensional array classes capture the common use cases. */ for (String className : OpenType.ALLOWED_CLASSNAMES_LIST) { - RuntimeReflection.register(clazz(access, className)); - RuntimeReflection.register(clazz(access, "[L" + className + ";")); + JVMCIRuntimeReflection.register(type(access, className)); + JVMCIRuntimeReflection.register(type(access, "[L" + className + ";")); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java index 9462c311247a..2d4c30fbabbe 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java @@ -32,13 +32,13 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.dynamicaccess.AccessCondition; import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.core.jdk.JNIRegistrationUtil; import com.oracle.svm.hosted.FeatureImpl; import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport; +import com.oracle.svm.util.dynamicaccess.JVMCIRuntimeReflection; public abstract class XMLParsersRegistration extends JNIRegistrationUtil { @@ -56,8 +56,8 @@ void registerResources() { private static void registerReflectionClasses(FeatureImpl.DuringAnalysisAccessImpl access, List parserClasses) { for (String className : parserClasses) { - RuntimeReflection.register(clazz(access, className)); - RuntimeReflection.register(constructor(access, className)); + JVMCIRuntimeReflection.register(type(access, className)); + JVMCIRuntimeReflection.register(constructor(access, className)); } } diff --git a/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/JVMCIRuntimeClassInitializationSupport.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/JVMCIRuntimeClassInitializationSupport.java new file mode 100644 index 000000000000..c464d5566af1 --- /dev/null +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/JVMCIRuntimeClassInitializationSupport.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.svm.util; + +import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; + +import jdk.vm.ci.meta.ResolvedJavaType; + +public interface JVMCIRuntimeClassInitializationSupport extends RuntimeClassInitializationSupport { + + static JVMCIRuntimeClassInitializationSupport singleton() { + return (JVMCIRuntimeClassInitializationSupport) ImageSingletons.lookup(RuntimeClassInitializationSupport.class); + } + + void initializeAtRunTime(ResolvedJavaType aType, String reason); + + void initializeAtBuildTime(ResolvedJavaType aType, String reason); +}