< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java
Print this page
*** 25,38 ****
import static jdk.vm.ci.common.InitTimer.timer;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
- import java.lang.reflect.Array;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
--- 25,34 ----
*** 46,57 ****
import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.common.InitTimer;
import jdk.vm.ci.common.JVMCIError;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory;
- import jdk.vm.ci.hotspot.services.HotSpotVMEventListener;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory.CompilationLevel;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.JavaType;
import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.runtime.JVMCI;
import jdk.vm.ci.runtime.JVMCIBackend;
--- 42,53 ----
import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.common.InitTimer;
import jdk.vm.ci.common.JVMCIError;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory.CompilationLevel;
+ import jdk.vm.ci.hotspot.services.HotSpotVMEventListener;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.JavaType;
import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.runtime.JVMCI;
import jdk.vm.ci.runtime.JVMCIBackend;
*** 93,105 ****
/**
* A list of all supported JVMCI options.
*/
public enum Option {
Compiler(String.class, null, "Selects the system compiler."),
! // Note: The following one is not used (see InitTimer.ENABLED).
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, "");
/**
--- 89,102 ----
/**
* A list of all supported JVMCI options.
*/
public enum Option {
Compiler(String.class, null, "Selects the system compiler."),
! // Note: The following one is not used (see InitTimer.ENABLED). It is added here
! // so that -Djvmci.PrintFlags=true shows the option.
InitTimer(boolean.class, false, "Specifies if initialization timing is enabled."),
! PrintConfig(boolean.class, false, "Prints VM configuration available via JVMCI and exits."),
PrintFlags(boolean.class, false, "Prints all JVMCI flags and exits."),
ShowFlags(boolean.class, false, "Prints all JVMCI flags and continues."),
TraceMethodDataFilter(String.class, null, "");
/**
*** 240,249 ****
--- 237,247 ----
* be read from the VM.
*/
@SuppressWarnings("unused") private final String[] trivialPrefixes;
@SuppressWarnings("try")
+ @SuppressFBWarnings(value = "DM_EXIT", justification = "PrintFlags is meant to exit the VM")
private HotSpotJVMCIRuntime() {
compilerToVm = new CompilerToVM();
try (InitTimer t = timer("HotSpotVMConfig<init>")) {
configStore = new HotSpotVMConfigStore(compilerToVm);
*** 271,281 ****
System.exit(0);
}
}
if (Option.PrintConfig.getBoolean()) {
! printConfig(config, compilerToVm);
}
compilerFactory = HotSpotJVMCICompilerConfig.getCompilerFactory();
if (compilerFactory instanceof HotSpotJVMCICompilerFactory) {
hsCompilerFactory = (HotSpotJVMCICompilerFactory) compilerFactory;
--- 269,280 ----
System.exit(0);
}
}
if (Option.PrintConfig.getBoolean()) {
! printConfig(configStore, compilerToVm);
! System.exit(0);
}
compilerFactory = HotSpotJVMCICompilerConfig.getCompilerFactory();
if (compilerFactory instanceof HotSpotJVMCICompilerFactory) {
hsCompilerFactory = (HotSpotJVMCICompilerFactory) compilerFactory;
*** 462,536 ****
for (HotSpotVMEventListener vmEventListener : getVmEventListeners()) {
vmEventListener.notifyInstall(hotSpotCodeCacheProvider, installedCode, compiledCode);
}
}
! private static void printConfig(HotSpotVMConfig config, CompilerToVM vm) {
! Field[] fields = config.getClass().getDeclaredFields();
! Map<String, Field> sortedFields = new TreeMap<>();
! for (Field f : fields) {
! if (!f.isSynthetic() && !Modifier.isStatic(f.getModifiers())) {
! f.setAccessible(true);
! sortedFields.put(f.getName(), f);
! }
! }
! for (Field f : sortedFields.values()) {
! try {
! String line = String.format("%9s %-40s = %s%n", f.getType().getSimpleName(), f.getName(), pretty(f.get(config)));
byte[] lineBytes = line.getBytes();
vm.writeDebugOutput(lineBytes, 0, lineBytes.length);
vm.flushDebugOutput();
- } catch (Exception e) {
- }
- }
- }
-
- private static String pretty(Object value) {
- if (value == null) {
- return "null";
}
! Class<?> klass = value.getClass();
! if (value instanceof String) {
! return "\"" + value + "\"";
! } else if (value instanceof Method) {
! return "method \"" + ((Method) value).getName() + "\"";
! } else if (value instanceof Class<?>) {
! return "class \"" + ((Class<?>) value).getSimpleName() + "\"";
! } else if (value instanceof Integer) {
! if ((Integer) value < 10) {
! return value.toString();
! }
! return value + " (0x" + Integer.toHexString((Integer) value) + ")";
! } else if (value instanceof Long) {
! if ((Long) value < 10 && (Long) value > -10) {
! return value + "l";
}
- return value + "l (0x" + Long.toHexString((Long) value) + "l)";
- } else if (klass.isArray()) {
- StringBuilder str = new StringBuilder();
- int dimensions = 0;
- while (klass.isArray()) {
- dimensions++;
- klass = klass.getComponentType();
}
! int length = Array.getLength(value);
! str.append(klass.getSimpleName()).append('[').append(length).append(']');
! for (int i = 1; i < dimensions; i++) {
! str.append("[]");
}
! str.append(" {");
! for (int i = 0; i < length; i++) {
! str.append(pretty(Array.get(value, i)));
! if (i < length - 1) {
! str.append(", ");
}
}
! str.append('}');
! return str.toString();
}
- return value.toString();
}
public OutputStream getLogStream() {
return new OutputStream() {
--- 461,504 ----
for (HotSpotVMEventListener vmEventListener : getVmEventListeners()) {
vmEventListener.notifyInstall(hotSpotCodeCacheProvider, installedCode, compiledCode);
}
}
! @SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "no localization here please!")
! private static void printConfigLine(CompilerToVM vm, String format, Object... args) {
! String line = String.format(format, args);
byte[] lineBytes = line.getBytes();
vm.writeDebugOutput(lineBytes, 0, lineBytes.length);
vm.flushDebugOutput();
}
! private static void printConfig(HotSpotVMConfigStore store, CompilerToVM vm) {
! TreeMap<String, VMField> fields = new TreeMap<>(store.getFields());
! for (VMField field : fields.values()) {
! if (!field.isStatic()) {
! printConfigLine(vm, "[vmconfig:instance field] %s %s {offset=%d[0x%x]}%n", field.type, field.name, field.offset, field.offset);
! } else {
! String value = field.value == null ? "null" : String.format("%d[0x%x]", field.value, field.value);
! printConfigLine(vm, "[vmconfig:static field] %s %s = %s {address=0x%x}%n", field.type, field.name, value, field.address);
}
}
! TreeMap<String, VMFlag> flags = new TreeMap<>(store.getFlags());
! for (VMFlag flag : flags.values()) {
! printConfigLine(vm, "[vmconfig:flag] %s %s = %s%n", flag.type, flag.name, flag.value);
}
! TreeMap<String, Long> addresses = new TreeMap<>(store.getAddresses());
! for (Map.Entry<String, Long> e : addresses.entrySet()) {
! printConfigLine(vm, "[vmconfig:address] %s = %d[0x%x]%n", e.getKey(), e.getValue(), e.getValue());
}
+ TreeMap<String, Long> constants = new TreeMap<>(store.getConstants());
+ for (Map.Entry<String, Long> e : constants.entrySet()) {
+ printConfigLine(vm, "[vmconfig:constant] %s = %d[0x%x]%n", e.getKey(), e.getValue(), e.getValue());
}
! TreeMap<String, Long> typeSizes = new TreeMap<>(store.getTypeSizes());
! for (Map.Entry<String, Long> e : typeSizes.entrySet()) {
! printConfigLine(vm, "[vmconfig:type size] %s = %d%n", e.getKey(), e.getValue());
}
}
public OutputStream getLogStream() {
return new OutputStream() {
< prev index next >