< prev index next >
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2020, 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.
@@ -150,17 +150,17 @@
// command line flags supplied to VM - see struct JVMFlag in jvmFlag.hpp
public static final class Flag {
private String type;
private String name;
private Address addr;
- private int flags;
+ private int attr;
- private Flag(String type, String name, Address addr, int flags) {
+ private Flag(String type, String name, Address addr, int attr) {
this.type = type;
this.name = name;
this.addr = addr;
- this.flags = flags;
+ this.attr = attr;
}
public String getType() {
return type;
}
@@ -172,16 +172,16 @@
public Address getAddress() {
return addr;
}
public int getOrigin() {
- return flags & Flags_VALUE_ORIGIN_MASK;
+ return attr & Flags_VALUE_ORIGIN_MASK;
}
// See JVMFlag::print_origin() in HotSpot
public String getOriginString() {
- var origin = flags & Flags_VALUE_ORIGIN_MASK;
+ var origin = attr & Flags_VALUE_ORIGIN_MASK;
if (origin == Flags_DEFAULT) {
return "default";
} else if (origin == Flags_COMMAND_LINE) {
return "command line";
} else if (origin == Flags_ENVIRON_VAR) {
@@ -190,11 +190,11 @@
return "config file";
} else if (origin == Flags_MANAGEMENT) {
return "management";
} else if (origin == Flags_ERGONOMIC) {
String result = "";
- if ((flags & Flags_ORIG_COMMAND_LINE) == Flags_ORIG_COMMAND_LINE) {
+ if ((attr & Flags_ORIG_COMMAND_LINE) == Flags_ORIG_COMMAND_LINE) {
result = "command line, ";
}
return result + "ergonomic";
} else if (origin == Flags_ATTACH_ON_DEMAND) {
return "attach";
@@ -1005,37 +1005,49 @@
}
}
return (Flag) flagsMap.get(name);
}
+ private static final String cmdFlagTypes[] = {
+ "bool",
+ "int",
+ "uint",
+ "intx",
+ "uintx",
+ "uint64_t",
+ "size_t",
+ "double",
+ "ccstr",
+ "ccstrlist"
+ };
+
private void readCommandLineFlags() {
// get command line flags
TypeDataBase db = getTypeDataBase();
Type flagType = db.lookupType("JVMFlag");
- int numFlags = (int) flagType.getCIntegerField("numFlags").getValue();
- // NOTE: last flag contains null values.
- commandLineFlags = new Flag[numFlags - 1];
-
- Address flagAddr = flagType.getAddressField("flags").getValue();
+ Address head = flagType.getAddressField("_head").getValue();
+ ArrayList<Flag> flags = new ArrayList<>();
- AddressField typeFld = flagType.getAddressField("_type");
+ CIntegerType shortType = (CIntegerType) db.lookupType("short");
+ CIntegerField typeFld = flagType.getCIntegerField("_type");
AddressField nameFld = flagType.getAddressField("_name");
- AddressField addrFld = flagType.getAddressField("_addr");
- CIntField flagsFld = new CIntField(flagType.getCIntegerField("_flags"), 0);
-
- long flagSize = flagType.getSize(); // sizeof(Flag)
-
- // NOTE: last flag contains null values.
- for (int f = 0; f < numFlags - 1; f++) {
- String type = CStringUtilities.getString(typeFld.getValue(flagAddr));
- String name = CStringUtilities.getString(nameFld.getValue(flagAddr));
- Address addr = addrFld.getValue(flagAddr);
- int flags = (int)flagsFld.getValue(flagAddr);
- commandLineFlags[f] = new Flag(type, name, addr, flags);
- flagAddr = flagAddr.addOffsetTo(flagSize);
+ AddressField addrFld = flagType.getAddressField("_value_addr");
+ AddressField nextFld = flagType.getAddressField("_next");
+ CIntField attrsFld = new CIntField(flagType.getCIntegerField("_attr"), 0);
+
+ for (Address flag = head; flag != null; flag = nextFld.getValue(flag)) {
+ int typeIndex = (int)typeFld.getCInteger(flag, shortType);
+ String type = (0 <= typeIndex && typeIndex < cmdFlagTypes.length) ? cmdFlagTypes[typeIndex] : "unknown";
+ String name = CStringUtilities.getString(nameFld.getValue(flag));
+ Address addr = addrFld.getValue(flag);
+ int attr = (int)attrsFld.getValue(flag);
+ flags.add(new Flag(type, name, addr, attr));
}
+ commandLineFlags = new Flag[flags.size()];
+ flags.toArray(commandLineFlags);
+
// sort flags by name
Arrays.sort(commandLineFlags, new Comparator() {
public int compare(Object o1, Object o2) {
Flag f1 = (Flag) o1;
Flag f2 = (Flag) o2;
< prev index next >