8213347: [JVMCI] remove use of reflection in JVMCI

Reviewed-by: kvn
This commit is contained in:
Doug Simon 2018-11-07 09:39:39 +01:00
parent 968f65c036
commit b0a9871463
10 changed files with 67 additions and 118 deletions

View File

@ -43,6 +43,9 @@ suite = {
"jdk.vm.ci.services" : {
"subDir" : "../jdk.internal.vm.ci/share/classes",
"sourceDirs" : ["src"],
"imports" : [
"jdk.internal.misc"
],
"javaCompliance" : "9+",
"checkstyleVersion" : "8.8",
"workingSets" : "API,JVMCI",

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, 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
@ -58,6 +58,7 @@ class AArch64HotSpotVMConfig extends HotSpotVMConfigAccess {
/*
* These flags are set if the corresponding support is in the hardware.
*/
// Checkstyle: stop
final long aarch64FP = getConstant("VM_Version::CPU_FP", Long.class);
final long aarch64ASIMD = getConstant("VM_Version::CPU_ASIMD", Long.class);
final long aarch64EVTSTRM = getConstant("VM_Version::CPU_EVTSTRM", Long.class);
@ -70,4 +71,5 @@ class AArch64HotSpotVMConfig extends HotSpotVMConfigAccess {
final long aarch64STXR_PREFETCH = getConstant("VM_Version::CPU_STXR_PREFETCH", Long.class);
final long aarch64A53MAC = getConstant("VM_Version::CPU_A53MAC", Long.class);
final long aarch64DMB_ATOMICS = getConstant("VM_Version::CPU_DMB_ATOMICS", Long.class);
// Checkstyle: resume
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, 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
@ -38,12 +38,14 @@ class SPARCHotSpotVMConfig extends HotSpotVMConfigAccess {
final boolean useCompressedOops = getFlag("UseCompressedOops", Boolean.class);
// @formatter:off
// CPU capabilities:
//
// FIXME: Using a 64-bit value is insufficient to support future capability
// sets (including co-processor capabilities such as DAX).
final long vmVersionFeatures = getFieldValue("Abstract_VM_Version::_features", Long.class, "uint64_t");
//
// SPARC specific values:
//
// NOTE: Values changed into an enumeration (that do indeed fit within a
@ -97,4 +99,5 @@ class SPARCHotSpotVMConfig extends HotSpotVMConfigAccess {
final boolean useBlockZeroing = getFlag("UseBlockZeroing", Boolean.class);
final int blockZeroingLowLimit = getFlag("BlockZeroingLowLimit", Integer.class);
// @formatter:on
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, 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
@ -22,6 +22,8 @@
*/
package jdk.vm.ci.hotspot;
import java.util.Set;
import jdk.vm.ci.code.CompilationRequest;
import jdk.vm.ci.common.JVMCIError;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
@ -30,7 +32,6 @@ import jdk.vm.ci.runtime.JVMCICompilerFactory;
import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.services.JVMCIPermission;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.internal.ReflectionAccessJDK;
final class HotSpotJVMCICompilerConfig {
@ -90,7 +91,7 @@ final class HotSpotJVMCICompilerConfig {
// Auto select a single available compiler
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
if (factory == null) {
ReflectionAccessJDK.openJVMCITo(f.getClass());
openJVMCITo(f.getClass().getModule());
factory = f;
} else {
// Multiple factories seen - cancel auto selection
@ -107,4 +108,20 @@ final class HotSpotJVMCICompilerConfig {
}
return compilerFactory;
}
/**
* Opens all JVMCI packages to {@code otherModule}.
*/
private static void openJVMCITo(Module otherModule) {
Module jvmci = HotSpotJVMCICompilerConfig.class.getModule();
if (jvmci != otherModule) {
Set<String> packages = jvmci.getPackages();
for (String pkg : packages) {
boolean opened = jvmci.isOpen(pkg, otherModule);
if (!opened) {
jvmci.addOpens(pkg, otherModule);
}
}
}
}
}

View File

@ -147,9 +147,9 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField {
}
/**
* Checks if this field has the {@link Stable} annotation.
* Checks if this field has the {@code Stable} annotation.
*
* @return true if field has {@link Stable} annotation, false otherwise
* @return true if field has {@code Stable} annotation, false otherwise
*/
@Override
public boolean isStable() {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2018, 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
@ -98,7 +98,7 @@ public final class Assumptions implements Iterable<Assumptions.Assumption> {
}
/**
* An assumption that a given class has no subclasses implementing {@link Object#finalize()}).
* An assumption that a given class has no subclasses implementing {@code Object#finalize()}).
*/
public static final class NoFinalizableSubclass extends Assumption {

View File

@ -191,6 +191,16 @@
<property name="onCommentFormat" value="CheckStyle: stop generated"/>
<property name="checkFormat" value=".*Name|.*LineLength|.*Header"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="Checkstyle: stop"/>
<property name="onCommentFormat" value="Checkstyle: resume"/>
<property name="checkFormat" value=".*"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="@formatter:off"/>
<property name="onCommentFormat" value="@formatter:on"/>
<property name="checkFormat" value=".*"/>
</module>
</module>
<module name="RegexpHeader">
<property name="header" value="/\*\n \* Copyright \(c\) (20[0-9][0-9], )?20[0-9][0-9], Oracle and/or its affiliates. All rights reserved.\n \* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.\n \*\n \* This code is free software; you can redistribute it and/or modify it\n \* under the terms of the GNU General Public License version 2 only, as\n \* published by the Free Software Foundation.\n \*\n \* This code is distributed in the hope that it will be useful, but WITHOUT\n \* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n \* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n \* version 2 for more details \(a copy is included in the LICENSE file that\n \* accompanied this code\).\n \*\n \* You should have received a copy of the GNU General Public License version\n \* 2 along with this work; if not, write to the Free Software Foundation,\n \* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n \*\n \* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA\n \* or visit www.oracle.com if you need additional information or have any\n \* questions.\n \*/\n"/>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, 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
@ -26,8 +26,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
import jdk.vm.ci.services.internal.ReflectionAccessJDK;
/**
* Service-provider class for the runtime to locate providers of JVMCI services where the latter are
* not in packages exported by the JVMCI module. As part of instantiating a
@ -61,7 +59,7 @@ public abstract class JVMCIServiceLocator {
protected JVMCIServiceLocator() {
this(checkPermission());
Services.checkJVMCIEnabled();
ReflectionAccessJDK.openJVMCITo(getClass());
Services.openJVMCITo(getClass().getModule());
}
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2018, 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
@ -22,8 +22,10 @@
*/
package jdk.vm.ci.services;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
import jdk.internal.misc.VM;
/**
* Provides utilities needed by JVMCI clients.
@ -61,18 +63,7 @@ public final class Services {
private Services() {
}
@SuppressWarnings("unchecked")
private static Map<String, String> initSavedProperties() throws InternalError {
try {
Class<?> vmClass = Class.forName("jdk.internal.misc.VM");
Method m = vmClass.getMethod("getSavedProperties");
return (Map<String, String>) m.invoke(null);
} catch (Exception e) {
throw new InternalError(e);
}
}
static final Map<String, String> SAVED_PROPERTIES = initSavedProperties();
static final Map<String, String> SAVED_PROPERTIES = VM.getSavedProperties();
static final boolean JVMCI_ENABLED = Boolean.parseBoolean(SAVED_PROPERTIES.get("jdk.internal.vm.ci.enabled"));
/**
@ -107,4 +98,20 @@ public final class Services {
throw new InternalError(e);
}
}
/**
* Opens all JVMCI packages to {@code otherModule}.
*/
static void openJVMCITo(Module otherModule) {
Module jvmci = Services.class.getModule();
if (jvmci != otherModule) {
Set<String> packages = jvmci.getPackages();
for (String pkg : packages) {
boolean opened = jvmci.isOpen(pkg, otherModule);
if (!opened) {
jvmci.addOpens(pkg, otherModule);
}
}
}
}
}

View File

@ -1,91 +0,0 @@
/*
* Copyright (c) 2017, 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.
*
* 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 jdk.vm.ci.services.internal;
import java.lang.reflect.Method;
import java.util.Set;
import jdk.vm.ci.services.Services;
/**
* Reflection based access to API introduced in JDK 9. This allows the API to be used in code that
* must be compiled (but not executed) on JDK 8.
*/
public final class ReflectionAccessJDK {
/**
* {@code Class.getModule()}.
*/
private static final Method getModule;
/**
* {@code java.lang.Module.addOpens(String, Module)}.
*/
private static final Method addOpens;
/**
* {@code java.lang.Module.getPackages(Module, String, Module)}.
*/
private static final Method getPackages;
/**
* {@code java.lang.Module.isOpen(String, Module)}.
*/
private static final Method isOpenTo;
/**
* Opens all JVMCI packages to the module of a given class.
*
* @param other all JVMCI packages will be opened to the module of this class
*/
@SuppressWarnings("unchecked")
public static void openJVMCITo(Class<?> other) {
try {
Object jvmci = getModule.invoke(Services.class);
Object otherModule = getModule.invoke(other);
if (jvmci != otherModule) {
Set<String> packages = (Set<String>) getPackages.invoke(jvmci);
for (String pkg : packages) {
boolean opened = (Boolean) isOpenTo.invoke(jvmci, pkg, otherModule);
if (!opened) {
addOpens.invoke(jvmci, pkg, otherModule);
}
}
}
} catch (Exception e) {
throw new InternalError(e);
}
}
static {
try {
getModule = Class.class.getMethod("getModule");
Class<?> moduleClass = getModule.getReturnType();
getPackages = moduleClass.getMethod("getPackages");
isOpenTo = moduleClass.getMethod("isOpen", String.class, moduleClass);
addOpens = moduleClass.getDeclaredMethod("addOpens", String.class, moduleClass);
} catch (NoSuchMethodException | SecurityException e) {
throw new InternalError(e);
}
}
}