Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9dfaf58
Initialize JDK classes before looking into the spec
vjovanov May 5, 2019
9512dc0
Initialization of packages is just a default
vjovanov Jun 28, 2020
8722808
Initialize the JDK through a package list
vjovanov Jan 17, 2020
6983a3a
Initialize XML at build time for Sulong
vjovanov Jun 29, 2020
a5eb783
java.beans.Introspector gets initialized through jmx
vjovanov Jun 29, 2020
2cd0876
Remove java.sql
vjovanov Jul 2, 2020
7fb79a2
Initialize JFR as our substitutions need it
vjovanov Jul 2, 2020
fe4e6aa
Fix the required modules in native-image-configure
vjovanov Jul 3, 2020
a3f9535
Canonicalize the list of initializations
vjovanov Jul 4, 2020
761ffb3
Getting rid of all XML
vjovanov Jul 5, 2020
7c4a9d8
Remove jmx from initialization list
vjovanov Jul 5, 2020
f3cfec1
Adding exceptions to the agent
vjovanov Jul 5, 2020
44cb96a
Reducing the agent list to a minimum
vjovanov Jul 5, 2020
d351cc3
Fix initialization in benchmarks
vjovanov Jul 5, 2020
7f91b8f
No need to rerun in javax.management
vjovanov Jul 6, 2020
dba499d
Fix reflection issues with java beans
vjovanov Jul 6, 2020
819494d
Fix eager initialization of SWITCH_TABLES declaring class
vjovanov Jul 6, 2020
eb843c6
Remove initialization of jndi
vjovanov Jul 8, 2020
430c32a
Initialize java.security at run time
vjovanov Jul 9, 2020
3d90126
Initialize org.ietf.jgss at run time
vjovanov Jul 9, 2020
947cb55
Cleanups
vjovanov Jul 9, 2020
88efdbf
Accomodate rules for security substitutions
vjovanov Jul 9, 2020
444813c
Revert java.security initialization at build time
vjovanov Jul 9, 2020
e2b4741
Cleanup for java.security init
vjovanov Jul 9, 2020
bca5a79
Add jdk.vm to exceptions for the agent
vjovanov Jul 10, 2020
f970d11
Reverting back to a feature for ni initialization
vjovanov Jul 10, 2020
22e3406
Address review comments
vjovanov Jul 10, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/mx.compiler/mx_compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,7 @@ def compiler_gate_benchmark_runner(tasks, extraVMarguments=None, prefix=''):
'scalariform':1,
'scalatest': 1,
'scalaxb': 1,
'specs': 1,
'tmt': 1,
'actors': 1,
}
Expand Down
8 changes: 4 additions & 4 deletions substratevm/mx.substratevm/mx_substratevm.py
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,7 @@ def _native_image_launcher_extra_jvm_args():
def _native_image_configure_extra_jvm_args():
if svm_java8():
return []
packages = ['jdk.internal.vm.compiler/org.graalvm.compiler.phases.common', 'jdk.internal.vm.ci/jdk.vm.ci.meta']
packages = ['jdk.internal.vm.compiler/org.graalvm.compiler.phases.common', 'jdk.internal.vm.ci/jdk.vm.ci.meta', 'org.graalvm.compiler.core.common.util']
args = ['--add-exports=' + packageName + '=ALL-UNNAMED' for packageName in packages]
if not mx_sdk_vm.jdk_enables_jvmci_by_default(mx.get_jdk(tag='default')):
args.extend(['-XX:+UnlockExperimentalVMOptions', '-XX:+EnableJVMCI'])
Expand Down Expand Up @@ -1151,10 +1151,10 @@ def build_and_test_clinittest_image(native_image, args=None):
mx.run([join(build_dir, 'clinittest')])

# Check the reports for initialized classes
def check_class_initialization(classes_file_name, marker):
def check_class_initialization(classes_file_name, marker, prefix=''):
classes_file = os.path.join(build_dir, 'reports', classes_file_name)
with open(classes_file) as f:
wrongly_initialized_classes = [line.strip() for line in f if marker not in line.strip()]
wrongly_initialized_classes = [line.strip() for line in f if line.strip().startswith(prefix) and marker not in line.strip()]
if len(wrongly_initialized_classes) > 0:
mx.abort("Only classes with marker " + marker + " must be in file " + classes_file + ". Found:\n" +
str(wrongly_initialized_classes))
Expand All @@ -1163,7 +1163,7 @@ def check_class_initialization(classes_file_name, marker):
delayed_classes = next(report for report in reports if report.startswith('run_time_classes'))
safe_classes = next(report for report in reports if report.startswith('safe_classes'))

check_class_initialization(delayed_classes, 'MustBeDelayed')
check_class_initialization(delayed_classes, 'MustBeDelayed', prefix='com.oracle.svm.test')
check_class_initialization(safe_classes, 'MustBeSafe')

native_image_context_run(build_and_test_clinittest_image, args, build_if_missing=True)
Expand Down
31 changes: 8 additions & 23 deletions substratevm/mx.substratevm/mx_substratevm_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -539,19 +539,11 @@ def collect_unique_dependencies(self, path, benchmark, exclude_libs):


_DACAPO_EXTRA_VM_ARGS = {
'avrora': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.apache.derby.jdbc.ClientDriver,'
'org.h2.Driver,org.apache.derby.jdbc.AutoloadedDriver,'
'org.apache.derby.client.am.Configuration,org.apache.derby.iapi.services.info.ProductVersionHolder'],
'h2': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-run-time=java.sql.DriverManager,org.apache.derby.jdbc.AutoloadedDriver,org.h2.Driver,org.apache.derby.jdbc.ClientDriver',
'-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'pmd': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-run-time=org.apache.derby.jdbc.ClientDriver,org.h2.Driver,java.sql.DriverManager,org.apache.derby.jdbc.AutoloadedDriver,'
'org.apache.derby.iapi.services.info.ProductVersionHolder', '-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'xalan': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.apache.xml.utils.res.CharArrayWrapper', '-Dnative-image.benchmark.extra-image-build-argument=--report-unsupported-elements-at-runtime'],
'sunflow': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-run-time=sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher'],
'fop': ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=com.sun.proxy.$Proxy188,com.sun.proxy.$Proxy187',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.apache.fop.render.RendererEventProducer,org.apache.fop.layoutmgr.BlockLevelEventProducer',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-run-time=sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher',
'-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'h2': ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'pmd': ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath', '-Dnative-image.benchmark.skip-agent-assertions=true'],
'sunflow': ['-Dnative-image.benchmark.skip-agent-assertions=true'],
'xalan': ['-Dnative-image.benchmark.extra-image-build-argument=--report-unsupported-elements-at-runtime'],
'fop': ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath', '-Dnative-image.benchmark.skip-agent-assertions=true', '-Dnative-image.benchmark.extra-image-build-argument=--report-unsupported-elements-at-runtime'],
# GR-19371
'batik': ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath']
}
Expand Down Expand Up @@ -699,23 +691,16 @@ def successPatterns(self):
'scalaxb' : 60,
'kiama' : 40,
'factorie' : 6, # GR-21543
'specs' : -1, # depends on awt
'specs' : 4,
'apparat' : 5,
'tmt' : 12,
}

_SCALA_DACAPO_EXTRA_VM_ARGS = {
'scalac' : ['-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-run-time=sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher'],
'scalariform' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'scalatest' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'specs' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.builder.AbstractXmlDocumentBuilder',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder$ElementInfo',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder$SpanType',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder',
'-Dnative-image.benchmark.extra-image-build-argument=--initialize-at-build-time=org.eclipse.mylyn.wikitext.core.parser.ImageAttributes$Align'],
'tmt' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath']
'specs' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
'tmt' : ['-Dnative-image.benchmark.extra-image-build-argument=--allow-incomplete-classpath'],
}

_scala_daCapo_exclude_lib = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,39 @@ public final class AccessAdvisor {
static {
internalCallerFilter = RuleNode.createRoot();
internalCallerFilter.addOrGetChildren("**", RuleNode.Inclusion.Include);
internalCallerFilter.addOrGetChildren("java.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.security.auth.**", RuleNode.Inclusion.Include);
internalCallerFilter.addOrGetChildren("sun.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.**", RuleNode.Inclusion.Exclude);

internalCallerFilter.addOrGetChildren("com.sun.crypto.provider.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.java.util.jar.pack.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.net.ssl.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.nio.file.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.nio.sctp.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("com.sun.nio.zipfs.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.io.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.lang.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.math.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.net.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.nio.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.text.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.time.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("java.util.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.crypto.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.lang.model.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.net.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("javax.tools.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.internal.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.jfr.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.net.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.nio.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("jdk.vm.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.invoke.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.launcher.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.misc.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.net.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.nio.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.reflect.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.text.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("sun.util.**", RuleNode.Inclusion.Exclude);

internalCallerFilter.addOrGetChildren("org.graalvm.compiler.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.addOrGetChildren("org.graalvm.libgraal.**", RuleNode.Inclusion.Exclude);
internalCallerFilter.removeRedundantNodes();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public void afterRegistration(AfterRegistrationAccess access) {
* for security we spell it out explicitly.
*/
RuntimeClassInitialization.initializeAtBuildTime(sun.security.util.UntrustedCertificates.class);
RuntimeClassInitialization.initializeAtBuildTime(org.jcp.xml.dsig.internal.dom.XMLDSigRI.class);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@

import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.hosted.Feature;
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
import org.graalvm.nativeimage.hosted.RuntimeReflection;

import com.oracle.svm.core.annotate.AutomaticFeature;
Expand All @@ -71,16 +72,6 @@ public void afterRegistration(AfterRegistrationAccess access) {

@Override
public void duringSetup(DuringSetupAccess access) {
/*
* These classes have global caches of bean interfaces and attributes. Re-initializing them
* ensures no hosted objects are available at run time.
*/
rerunClassInit(access, "com.sun.jmx.mbeanserver.MXBeanLookup",
"javax.management.MBeanServerFactory",
"com.sun.jmx.mbeanserver.MBeanIntrospector",
"com.sun.jmx.mbeanserver.StandardMBeanIntrospector",
"com.sun.jmx.mbeanserver.MXBeanIntrospector");

platformManagedObjectReplacements = new IdentityHashMap<>();
for (Class<? extends PlatformManagedObject> clazz : Arrays.asList(ClassLoadingMXBean.class, CompilationMXBean.class, RuntimeMXBean.class,
ThreadMXBean.class, OperatingSystemMXBean.class, MemoryMXBean.class)) {
Expand All @@ -91,6 +82,8 @@ public void duringSetup(DuringSetupAccess access) {
}
}
access.registerObjectReplacer(this::replaceHostedPlatformManagedObject);

RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory", "Avoids unnecessary reflection in the image");
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,12 @@ public void run() {
}

private static void unhookCustomClassLoaders() {
NativeImageSystemClassLoader customSystemClassLoader = (NativeImageSystemClassLoader) ClassLoader.getSystemClassLoader();
customSystemClassLoader.setDelegate(null);
Thread.currentThread().setContextClassLoader(customSystemClassLoader.getDefaultSystemClassLoader());
ClassLoader loader = ClassLoader.getSystemClassLoader();
if (loader instanceof NativeImageSystemClassLoader) {
NativeImageSystemClassLoader customSystemClassLoader = (NativeImageSystemClassLoader) ClassLoader.getSystemClassLoader();
customSystemClassLoader.setDelegate(null);
Thread.currentThread().setContextClassLoader(customSystemClassLoader.getDefaultSystemClassLoader());
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,54 +95,54 @@ public boolean isInConfiguration(IsInConfigurationAccess access) {

@Override
public void duringSetup(DuringSetupAccess access) {
RuntimeClassInitializationSupport rci = ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
/*
* The SecureRandom implementations open the /dev/random and /dev/urandom files which are
* used as sources for entropy. These files are opened in the static initializers. That's
* why we rerun the static initializers at runtime. We cannot completely delay the static
* initializers execution to runtime because the SecureRandom classes are needed by the
* native image generator too, e.g., by Files.createTempDirectory().
*/
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(NativePRNG.class, "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(NativePRNG.Blocking.class, "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(NativePRNG.NonBlocking.class, "for substitutions");
rci.rerunInitialization(NativePRNG.class, "for substitutions");
rci.rerunInitialization(NativePRNG.Blocking.class, "for substitutions");
rci.rerunInitialization(NativePRNG.NonBlocking.class, "for substitutions");

ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.provider.SeedGenerator"), "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.provider.SeedGenerator"), "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions");

if (JavaVersionUtil.JAVA_SPEC >= 11) {
/*
* sun.security.provider.AbstractDrbg$SeederHolder has a static final EntropySource
* seeder field that needs to be re-initialized at run time because it captures the
* result of SeedGenerator.getSystemEntropy().
*/
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions");
}

if (JavaVersionUtil.JAVA_SPEC > 8) {
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.provider.FileInputStreamPool"), "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.provider.FileInputStreamPool"), "for substitutions");
}

/* java.util.UUID$Holder has a static final SecureRandom field. */
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "java.util.UUID$Holder"), "for substitutions");
rci.rerunInitialization(clazz(access, "java.util.UUID$Holder"), "for substitutions");

/*
* The classes bellow have a static final SecureRandom field. Note that if the classes are
* not found as reachable by the analysis registering them form class initialization rerun
* doesn't have any effect.
*/
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.krb5.Confounder"), "for substitutions");
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(javax.net.ssl.SSLContext.class, "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions");
rci.rerunInitialization(clazz(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions");
rci.rerunInitialization(clazz(access, "sun.security.krb5.Confounder"), "for substitutions");
rci.rerunInitialization(javax.net.ssl.SSLContext.class, "for substitutions");

/*
* When SSLContextImpl$DefaultManagersHolder sets-up the TrustManager in its initializer it
* gets the value of the -Djavax.net.ssl.trustStore and -Djavax.net.ssl.trustStorePassword
* properties from the build machine. Re-runing its initialization at run time is required
* to use the run time provided values.
*/
ImageSingletons.lookup(RuntimeClassInitializationSupport.class).rerunInitialization(clazz(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"),
"for reading properties at run time");
rci.rerunInitialization(clazz(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"), "for reading properties at run time");

if (SubstrateOptions.EnableAllSecurityServices.getValue()) {
/* Prepare SunEC native library access. */
Expand Down
Loading