mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-16 00:54:38 +02:00
8146820: JVMCI options should not use System.getProperty directly
Reviewed-by: kvn, dnsimon
This commit is contained in:
parent
22de0c428d
commit
01f58aa4da
5 changed files with 109 additions and 30 deletions
|
@ -27,6 +27,7 @@ import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
|
|
||||||
|
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
|
||||||
import jdk.vm.ci.meta.Constant;
|
import jdk.vm.ci.meta.Constant;
|
||||||
import jdk.vm.ci.meta.ConstantReflectionProvider;
|
import jdk.vm.ci.meta.ConstantReflectionProvider;
|
||||||
import jdk.vm.ci.meta.JavaConstant;
|
import jdk.vm.ci.meta.JavaConstant;
|
||||||
|
@ -42,11 +43,6 @@ import jdk.vm.ci.meta.ResolvedJavaType;
|
||||||
*/
|
*/
|
||||||
public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
|
public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines whether to treat {@code final} fields with default values as constant.
|
|
||||||
*/
|
|
||||||
private static final boolean TrustFinalDefaultFields = HotSpotJVMCIRuntime.getBooleanProperty("TrustFinalDefaultFields", true);
|
|
||||||
|
|
||||||
protected final HotSpotJVMCIRuntimeProvider runtime;
|
protected final HotSpotJVMCIRuntimeProvider runtime;
|
||||||
protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
|
protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
|
||||||
protected final HotSpotMemoryAccessProviderImpl memoryAccess;
|
protected final HotSpotMemoryAccessProviderImpl memoryAccess;
|
||||||
|
@ -249,14 +245,14 @@ public class HotSpotConstantReflectionProvider implements ConstantReflectionProv
|
||||||
* Determines if a value read from a {@code final} instance field is considered constant. The
|
* Determines if a value read from a {@code final} instance field is considered constant. The
|
||||||
* implementation in {@link HotSpotConstantReflectionProvider} returns true if {@code value} is
|
* implementation in {@link HotSpotConstantReflectionProvider} returns true if {@code value} is
|
||||||
* not the {@link JavaConstant#isDefaultForKind default value} for its kind or if
|
* not the {@link JavaConstant#isDefaultForKind default value} for its kind or if
|
||||||
* {@link #TrustFinalDefaultFields} is true.
|
* {@link Option#TrustFinalDefaultFields} is true.
|
||||||
*
|
*
|
||||||
* @param value a value read from a {@code final} instance field
|
* @param value a value read from a {@code final} instance field
|
||||||
* @param receiverClass the {@link Object#getClass() class} of object from which the
|
* @param receiverClass the {@link Object#getClass() class} of object from which the
|
||||||
* {@code value} was read
|
* {@code value} was read
|
||||||
*/
|
*/
|
||||||
protected boolean isFinalInstanceFieldValueConstant(JavaConstant value, Class<?> receiverClass) {
|
protected boolean isFinalInstanceFieldValueConstant(JavaConstant value, Class<?> receiverClass) {
|
||||||
return !value.isDefaultForKind() || TrustFinalDefaultFields;
|
return !value.isDefaultForKind() || Option.TrustFinalDefaultFields.getBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,6 +26,7 @@ import static jdk.vm.ci.inittimer.InitTimer.timer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
@ -85,19 +86,95 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider, H
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a boolean value based on a system property {@linkplain VM#getSavedProperty(String)
|
* A list of all supported JVMCI options.
|
||||||
* saved} at system initialization time. The property name is prefixed with "{@code jvmci.}".
|
|
||||||
*
|
|
||||||
* @param name the name of the system property to derive a boolean value from using
|
|
||||||
* {@link Boolean#parseBoolean(String)}
|
|
||||||
* @param def the value to return if there is no system property corresponding to {@code name}
|
|
||||||
*/
|
*/
|
||||||
public static boolean getBooleanProperty(String name, boolean def) {
|
public enum Option {
|
||||||
String value = VM.getSavedProperty("jvmci." + name);
|
ImplicitStableValues(boolean.class, true, "Mark well-known stable fields as such."),
|
||||||
if (value == null) {
|
// Note: The following one is not used (see InitTimer.ENABLED).
|
||||||
return def;
|
InitTimer(boolean.class, false, "Specifies if initialization timing is enabled."),
|
||||||
|
PrintConfig(boolean.class, false, "Prints all HotSpotVMConfig fields."),
|
||||||
|
PrintFlags(boolean.class, false, "Prints all JVMCI flags and exits."),
|
||||||
|
ShowFlags(boolean.class, false, "Prints all JVMCI flags and continues."),
|
||||||
|
TraceMethodDataFilter(String.class, null, ""),
|
||||||
|
TrustFinalDefaultFields(boolean.class, true, "Determines whether to treat final fields with default values as constant.");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The prefix for system properties that are JVMCI options.
|
||||||
|
*/
|
||||||
|
private static final String JVMCI_OPTION_PROPERTY_PREFIX = "jvmci.";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marker for uninitialized flags.
|
||||||
|
*/
|
||||||
|
private static final String UNINITIALIZED = "UNINITIALIZED";
|
||||||
|
|
||||||
|
private final Class<?> type;
|
||||||
|
private Object value;
|
||||||
|
private final Object defaultValue;
|
||||||
|
private boolean isDefault;
|
||||||
|
private final String help;
|
||||||
|
|
||||||
|
private Option(Class<?> type, Object defaultValue, String help) {
|
||||||
|
assert Character.isUpperCase(name().charAt(0)) : "Option name must start with upper-case letter: " + name();
|
||||||
|
this.type = type;
|
||||||
|
this.value = UNINITIALIZED;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
this.help = help;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getValue() {
|
||||||
|
if (value == UNINITIALIZED) {
|
||||||
|
String propertyValue = VM.getSavedProperty(JVMCI_OPTION_PROPERTY_PREFIX + name());
|
||||||
|
if (propertyValue == null) {
|
||||||
|
this.value = defaultValue;
|
||||||
|
this.isDefault = true;
|
||||||
|
} else {
|
||||||
|
if (type == boolean.class) {
|
||||||
|
this.value = Boolean.parseBoolean(propertyValue);
|
||||||
|
} else if (type == String.class) {
|
||||||
|
this.value = propertyValue;
|
||||||
|
} else {
|
||||||
|
throw new JVMCIError("Unexpected option type " + type);
|
||||||
|
}
|
||||||
|
this.isDefault = false;
|
||||||
|
}
|
||||||
|
// Saved properties should not be interned - let's be sure
|
||||||
|
assert value != UNINITIALIZED;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the option's value as boolean.
|
||||||
|
*
|
||||||
|
* @return option's value
|
||||||
|
*/
|
||||||
|
public boolean getBoolean() {
|
||||||
|
return (boolean) getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the option's value as String.
|
||||||
|
*
|
||||||
|
* @return option's value
|
||||||
|
*/
|
||||||
|
public String getString() {
|
||||||
|
return (String) getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints all option flags to {@code out}.
|
||||||
|
*
|
||||||
|
* @param out stream to print to
|
||||||
|
*/
|
||||||
|
public static void printFlags(PrintStream out) {
|
||||||
|
out.println("[List of JVMCI options]");
|
||||||
|
for (Option option : values()) {
|
||||||
|
Object value = option.getValue();
|
||||||
|
String assign = option.isDefault ? ":=" : " =";
|
||||||
|
out.printf("%9s %-40s %s %-14s %s%n", option.type.getSimpleName(), option, assign, value, option.help);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Boolean.parseBoolean(value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HotSpotJVMCIBackendFactory findFactory(String architecture) {
|
public static HotSpotJVMCIBackendFactory findFactory(String architecture) {
|
||||||
|
@ -164,7 +241,16 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider, H
|
||||||
}
|
}
|
||||||
metaAccessContext = context;
|
metaAccessContext = context;
|
||||||
|
|
||||||
if (Boolean.valueOf(System.getProperty("jvmci.printconfig"))) {
|
boolean printFlags = Option.PrintFlags.getBoolean();
|
||||||
|
boolean showFlags = Option.ShowFlags.getBoolean();
|
||||||
|
if (printFlags || showFlags) {
|
||||||
|
Option.printFlags(System.out);
|
||||||
|
if (printFlags) {
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Option.PrintConfig.getBoolean()) {
|
||||||
printConfig(config, compilerToVm);
|
printConfig(config, compilerToVm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import jdk.vm.ci.common.JVMCIError;
|
import jdk.vm.ci.common.JVMCIError;
|
||||||
|
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
|
||||||
import jdk.vm.ci.meta.JavaType;
|
import jdk.vm.ci.meta.JavaType;
|
||||||
import jdk.vm.ci.meta.LocationIdentity;
|
import jdk.vm.ci.meta.LocationIdentity;
|
||||||
import jdk.vm.ci.meta.MetaAccessProvider;
|
import jdk.vm.ci.meta.MetaAccessProvider;
|
||||||
|
@ -41,11 +42,6 @@ import jdk.vm.ci.meta.ResolvedJavaType;
|
||||||
*/
|
*/
|
||||||
class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField, HotSpotProxified {
|
class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField, HotSpotProxified {
|
||||||
|
|
||||||
/**
|
|
||||||
* Mark well-known stable fields as such.
|
|
||||||
*/
|
|
||||||
private static final boolean ImplicitStableValues = HotSpotJVMCIRuntime.getBooleanProperty("ImplicitStableValues", true);
|
|
||||||
|
|
||||||
private final HotSpotResolvedObjectTypeImpl holder;
|
private final HotSpotResolvedObjectTypeImpl holder;
|
||||||
private final String name;
|
private final String name;
|
||||||
private JavaType type;
|
private JavaType type;
|
||||||
|
@ -198,7 +194,7 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField, HotSpotP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
assert getAnnotation(Stable.class) == null;
|
assert getAnnotation(Stable.class) == null;
|
||||||
if (ImplicitStableValues && isImplicitStableField()) {
|
if (Option.ImplicitStableValues.getBoolean() && isImplicitStableField()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -37,6 +37,7 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import jdk.vm.ci.common.JVMCIError;
|
import jdk.vm.ci.common.JVMCIError;
|
||||||
|
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
|
||||||
import jdk.vm.ci.meta.Constant;
|
import jdk.vm.ci.meta.Constant;
|
||||||
import jdk.vm.ci.meta.ConstantPool;
|
import jdk.vm.ci.meta.ConstantPool;
|
||||||
import jdk.vm.ci.meta.DefaultProfilingInfo;
|
import jdk.vm.ci.meta.DefaultProfilingInfo;
|
||||||
|
@ -417,8 +418,6 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String TraceMethodDataFilter = System.getProperty("jvmci.traceMethodDataFilter");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProfilingInfo getProfilingInfo(boolean includeNormal, boolean includeOSR) {
|
public ProfilingInfo getProfilingInfo(boolean includeNormal, boolean includeOSR) {
|
||||||
ProfilingInfo info;
|
ProfilingInfo info;
|
||||||
|
@ -427,7 +426,8 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||||
long metaspaceMethodData = UNSAFE.getAddress(metaspaceMethod + config().methodDataOffset);
|
long metaspaceMethodData = UNSAFE.getAddress(metaspaceMethod + config().methodDataOffset);
|
||||||
if (metaspaceMethodData != 0) {
|
if (metaspaceMethodData != 0) {
|
||||||
methodData = new HotSpotMethodData(metaspaceMethodData, this);
|
methodData = new HotSpotMethodData(metaspaceMethodData, this);
|
||||||
if (TraceMethodDataFilter != null && this.format("%H.%n").contains(TraceMethodDataFilter)) {
|
String methodDataFilter = Option.TraceMethodDataFilter.getString();
|
||||||
|
if (methodDataFilter != null && this.format("%H.%n").contains(methodDataFilter)) {
|
||||||
System.out.println("Raw method data for " + this.format("%H.%n(%p)") + ":");
|
System.out.println("Raw method data for " + this.format("%H.%n(%p)") + ":");
|
||||||
System.out.println(methodData.toString());
|
System.out.println(methodData.toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,9 +65,10 @@ public final class InitTimer implements AutoCloseable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies if initialization timing is enabled.
|
* Specifies if initialization timing is enabled. Note: This property cannot use
|
||||||
|
* {@code HotSpotJVMCIRuntime.Option} since that class is not visible from this package.
|
||||||
*/
|
*/
|
||||||
private static final boolean ENABLED = Boolean.getBoolean("jvmci.inittimer") || Boolean.getBoolean("jvmci.runtime.TimeInit");
|
private static final boolean ENABLED = Boolean.getBoolean("jvmci.InitTimer");
|
||||||
|
|
||||||
public static final AtomicInteger nesting = ENABLED ? new AtomicInteger() : null;
|
public static final AtomicInteger nesting = ENABLED ? new AtomicInteger() : null;
|
||||||
public static final String SPACES = " ";
|
public static final String SPACES = " ";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue