--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java 2020-04-05 21:35:29.827396264 -0700 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java 2020-04-05 21:35:29.467382713 -0700 @@ -1,5 +1,5 @@ /* - * 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 @@ -152,13 +152,13 @@ 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() { @@ -174,12 +174,12 @@ } 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) { @@ -192,7 +192,7 @@ 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"; @@ -1007,33 +1007,45 @@ 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 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) {