< 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 >