8213347: [JVMCI] remove use of reflection in JVMCI
Reviewed-by: kvn
This commit is contained in:
parent
968f65c036
commit
b0a9871463
@ -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",
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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"/>
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user