src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java Tue Sep 24 08:54:08 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java Tue Sep 24 12:47:15 2019 -0400
@@ -77,6 +77,8 @@
import org.graalvm.compiler.phases.util.Providers;
import org.graalvm.compiler.runtime.RuntimeProvider;
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
+import org.graalvm.compiler.test.AddExports;
+import org.graalvm.compiler.test.ModuleSupport;
import jdk.internal.vm.compiler.word.LocationIdentity;
import org.junit.Assert;
import org.junit.Assume;
@@ -98,8 +100,15 @@
* global invariants such as using {@link Object#equals(Object)} to compare certain types instead of
* identity comparisons.
*/
+@AddExports("jdk.internal.vm.ci/*=jdk.aot")
public class CheckGraalInvariants extends GraalCompilerTest {
+ /**
+ * Magic token to denote the classes in the Java runtime image (i.e. in the {@code jrt:/} file
+ * system).
+ */
+ public static final String JRT_CLASS_PATH_ENTRY = "<jrt>";
+
private static boolean shouldVerifyEquals(ResolvedJavaMethod m) {
if (m.getName().equals("identityEquals")) {
ResolvedJavaType c = m.getDeclaringClass();
@@ -119,6 +128,9 @@
public static class InvariantsTool {
protected boolean shouldProcess(String classpathEntry) {
+ if (classpathEntry.equals(JRT_CLASS_PATH_ENTRY)) {
+ return true;
+ }
if (classpathEntry.endsWith(".jar")) {
String name = new File(classpathEntry).getName();
return name.contains("jvmci") || name.contains("graal") || name.contains("jdk.internal.vm.compiler");
@@ -131,7 +143,7 @@
if (JavaVersionUtil.JAVA_SPEC <= 8) {
bootclasspath = System.getProperty("sun.boot.class.path");
} else {
- bootclasspath = System.getProperty("jdk.module.path") + File.pathSeparatorChar + System.getProperty("jdk.module.upgrade.path");
+ bootclasspath = JRT_CLASS_PATH_ENTRY;
}
return bootclasspath;
}
@@ -208,19 +220,8 @@
for (String path : bootclasspath.split(File.pathSeparator)) {
if (tool.shouldProcess(path)) {
try {
- final ZipFile zipFile = new ZipFile(new File(path));
- for (final Enumeration<? extends ZipEntry> entry = zipFile.entries(); entry.hasMoreElements();) {
- final ZipEntry zipEntry = entry.nextElement();
- String name = zipEntry.getName();
- if (name.endsWith(".class") && !name.startsWith("META-INF/versions/")) {
- String className = name.substring(0, name.length() - ".class".length()).replace('/', '.');
- if (isInNativeImage(className)) {
- /*
- * Native Image is an external tool and does not need to follow the
- * Graal invariants.
- */
- continue;
- }
+ if (path.equals(JRT_CLASS_PATH_ENTRY)) {
+ for (String className : ModuleSupport.getJRTGraalClassNames()) {
if (isGSON(className)) {
/*
* GSON classes are compiled with old JDK
@@ -229,6 +230,29 @@
}
classNames.add(className);
}
+ } else {
+ final ZipFile zipFile = new ZipFile(new File(path));
+ for (final Enumeration<? extends ZipEntry> entry = zipFile.entries(); entry.hasMoreElements();) {
+ final ZipEntry zipEntry = entry.nextElement();
+ String name = zipEntry.getName();
+ if (name.endsWith(".class") && !name.startsWith("META-INF/versions/")) {
+ String className = name.substring(0, name.length() - ".class".length()).replace('/', '.');
+ if (isInNativeImage(className)) {
+ /*
+ * Native Image is an external tool and does not need to follow
+ * the Graal invariants.
+ */
+ continue;
+ }
+ if (isGSON(className)) {
+ /*
+ * GSON classes are compiled with old JDK
+ */
+ continue;
+ }
+ classNames.add(className);
+ }
+ }
}
} catch (IOException ex) {
Assert.fail(ex.toString());
@@ -314,8 +338,12 @@
ResolvedJavaType type = metaAccess.lookupJavaType(c);
List<ResolvedJavaMethod> methods = new ArrayList<>();
- methods.addAll(Arrays.asList(type.getDeclaredMethods()));
- methods.addAll(Arrays.asList(type.getDeclaredConstructors()));
+ try {
+ methods.addAll(Arrays.asList(type.getDeclaredMethods()));
+ methods.addAll(Arrays.asList(type.getDeclaredConstructors()));
+ } catch (Throwable e) {
+ errors.add(String.format("Error while checking %s:%n%s", className, printStackTraceToString(e)));
+ }
ResolvedJavaMethod clinit = type.getClassInitializer();
if (clinit != null) {
methods.add(clinit);