src/hotspot/share/runtime/flags/jvmFlagRangeList.cpp
changeset 57876 30db6422848b
parent 57811 947252a54b98
child 58044 3277a7454dc5
equal deleted inserted replaced
57875:427b38332f20 57876:30db6422848b
    31 #include "runtime/arguments.hpp"
    31 #include "runtime/arguments.hpp"
    32 #include "runtime/flags/jvmFlag.hpp"
    32 #include "runtime/flags/jvmFlag.hpp"
    33 #include "runtime/flags/jvmFlagConstraintList.hpp"
    33 #include "runtime/flags/jvmFlagConstraintList.hpp"
    34 #include "runtime/flags/jvmFlagRangeList.hpp"
    34 #include "runtime/flags/jvmFlagRangeList.hpp"
    35 #include "runtime/globals.hpp"
    35 #include "runtime/globals.hpp"
       
    36 #include "runtime/globals_extension.hpp"
    36 #include "runtime/os.hpp"
    37 #include "runtime/os.hpp"
    37 #include "runtime/task.hpp"
    38 #include "runtime/task.hpp"
    38 #include "utilities/macros.hpp"
    39 #include "utilities/macros.hpp"
    39 
    40 
    40 class JVMFlagRange_int : public JVMFlagRange {
    41 class JVMFlagRange_int : public JVMFlagRange {
    41   int _min;
    42   int _min;
    42   int _max;
    43   int _max;
    43   const int* _ptr;
    44 
    44 
    45 public:
    45 public:
    46   JVMFlagRange_int(const JVMFlag* flag, int min, int max)
    46   // the "name" argument must be a string literal
    47     : JVMFlagRange(flag), _min(min), _max(max) {}
    47   JVMFlagRange_int(const char* name, const int* ptr, int min, int max)
    48 
    48     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
    49   JVMFlag::Error check(bool verbose = true) {
    49 
    50     return check_int(_flag->get_int(), verbose);
    50   JVMFlag::Error check(bool verbose = true) {
       
    51     return check_int(*_ptr, verbose);
       
    52   }
    51   }
    53 
    52 
    54   JVMFlag::Error check_int(int value, bool verbose = true) {
    53   JVMFlag::Error check_int(int value, bool verbose = true) {
    55     if ((value < _min) || (value > _max)) {
    54     if ((value < _min) || (value > _max)) {
    56       JVMFlag::printError(verbose,
    55       JVMFlag::printError(verbose,
    69 };
    68 };
    70 
    69 
    71 class JVMFlagRange_intx : public JVMFlagRange {
    70 class JVMFlagRange_intx : public JVMFlagRange {
    72   intx _min;
    71   intx _min;
    73   intx _max;
    72   intx _max;
    74   const intx* _ptr;
    73 
    75 public:
    74 public:
    76   // the "name" argument must be a string literal
    75   JVMFlagRange_intx(const JVMFlag* flag, intx min, intx max)
    77   JVMFlagRange_intx(const char* name, const intx* ptr, intx min, intx max)
    76     : JVMFlagRange(flag), _min(min), _max(max) {}
    78     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
    77 
    79 
    78   JVMFlag::Error check(bool verbose = true) {
    80   JVMFlag::Error check(bool verbose = true) {
    79     return check_intx(_flag->get_intx(), verbose);
    81     return check_intx(*_ptr, verbose);
       
    82   }
    80   }
    83 
    81 
    84   JVMFlag::Error check_intx(intx value, bool verbose = true) {
    82   JVMFlag::Error check_intx(intx value, bool verbose = true) {
    85     if ((value < _min) || (value > _max)) {
    83     if ((value < _min) || (value > _max)) {
    86       JVMFlag::printError(verbose,
    84       JVMFlag::printError(verbose,
    99 };
    97 };
   100 
    98 
   101 class JVMFlagRange_uint : public JVMFlagRange {
    99 class JVMFlagRange_uint : public JVMFlagRange {
   102   uint _min;
   100   uint _min;
   103   uint _max;
   101   uint _max;
   104   const uint* _ptr;
   102 
   105 
   103 public:
   106 public:
   104   JVMFlagRange_uint(const JVMFlag* flag, uint min, uint max)
   107   // the "name" argument must be a string literal
   105     : JVMFlagRange(flag), _min(min), _max(max) {}
   108   JVMFlagRange_uint(const char* name, const uint* ptr, uint min, uint max)
   106 
   109     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
   107   JVMFlag::Error check(bool verbose = true) {
   110 
   108     return check_uint(_flag->get_uint(), verbose);
   111   JVMFlag::Error check(bool verbose = true) {
       
   112     return check_uint(*_ptr, verbose);
       
   113   }
   109   }
   114 
   110 
   115   JVMFlag::Error check_uint(uint value, bool verbose = true) {
   111   JVMFlag::Error check_uint(uint value, bool verbose = true) {
   116     if ((value < _min) || (value > _max)) {
   112     if ((value < _min) || (value > _max)) {
   117       JVMFlag::printError(verbose,
   113       JVMFlag::printError(verbose,
   130 };
   126 };
   131 
   127 
   132 class JVMFlagRange_uintx : public JVMFlagRange {
   128 class JVMFlagRange_uintx : public JVMFlagRange {
   133   uintx _min;
   129   uintx _min;
   134   uintx _max;
   130   uintx _max;
   135   const uintx* _ptr;
   131 
   136 
   132 public:
   137 public:
   133   JVMFlagRange_uintx(const JVMFlag* flag, uintx min, uintx max)
   138   // the "name" argument must be a string literal
   134     : JVMFlagRange(flag), _min(min), _max(max) {}
   139   JVMFlagRange_uintx(const char* name, const uintx* ptr, uintx min, uintx max)
   135 
   140     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
   136   JVMFlag::Error check(bool verbose = true) {
   141 
   137     return check_uintx(_flag->get_uintx(), verbose);
   142   JVMFlag::Error check(bool verbose = true) {
       
   143     return check_uintx(*_ptr, verbose);
       
   144   }
   138   }
   145 
   139 
   146   JVMFlag::Error check_uintx(uintx value, bool verbose = true) {
   140   JVMFlag::Error check_uintx(uintx value, bool verbose = true) {
   147     if ((value < _min) || (value > _max)) {
   141     if ((value < _min) || (value > _max)) {
   148       JVMFlag::printError(verbose,
   142       JVMFlag::printError(verbose,
   161 };
   155 };
   162 
   156 
   163 class JVMFlagRange_uint64_t : public JVMFlagRange {
   157 class JVMFlagRange_uint64_t : public JVMFlagRange {
   164   uint64_t _min;
   158   uint64_t _min;
   165   uint64_t _max;
   159   uint64_t _max;
   166   const uint64_t* _ptr;
   160 
   167 
   161 public:
   168 public:
   162   JVMFlagRange_uint64_t(const JVMFlag* flag, uint64_t min, uint64_t max)
   169   // the "name" argument must be a string literal
   163     : JVMFlagRange(flag), _min(min), _max(max) {}
   170   JVMFlagRange_uint64_t(const char* name, const uint64_t* ptr, uint64_t min, uint64_t max)
   164 
   171     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
   165   JVMFlag::Error check(bool verbose = true) {
   172 
   166     return check_uint64_t(_flag->get_uintx(), verbose);
   173   JVMFlag::Error check(bool verbose = true) {
       
   174     return check_uint64_t(*_ptr, verbose);
       
   175   }
   167   }
   176 
   168 
   177   JVMFlag::Error check_uint64_t(uint64_t value, bool verbose = true) {
   169   JVMFlag::Error check_uint64_t(uint64_t value, bool verbose = true) {
   178     if ((value < _min) || (value > _max)) {
   170     if ((value < _min) || (value > _max)) {
   179       JVMFlag::printError(verbose,
   171       JVMFlag::printError(verbose,
   192 };
   184 };
   193 
   185 
   194 class JVMFlagRange_size_t : public JVMFlagRange {
   186 class JVMFlagRange_size_t : public JVMFlagRange {
   195   size_t _min;
   187   size_t _min;
   196   size_t _max;
   188   size_t _max;
   197   const size_t* _ptr;
   189 
   198 
   190 public:
   199 public:
   191   JVMFlagRange_size_t(const JVMFlag* flag, size_t min, size_t max)
   200   // the "name" argument must be a string literal
   192     : JVMFlagRange(flag), _min(min), _max(max) {}
   201   JVMFlagRange_size_t(const char* name, const size_t* ptr, size_t min, size_t max)
   193 
   202     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
   194   JVMFlag::Error check(bool verbose = true) {
   203 
   195     return check_size_t(_flag->get_size_t(), verbose);
   204   JVMFlag::Error check(bool verbose = true) {
       
   205     return check_size_t(*_ptr, verbose);
       
   206   }
   196   }
   207 
   197 
   208   JVMFlag::Error check_size_t(size_t value, bool verbose = true) {
   198   JVMFlag::Error check_size_t(size_t value, bool verbose = true) {
   209     if ((value < _min) || (value > _max)) {
   199     if ((value < _min) || (value > _max)) {
   210       JVMFlag::printError(verbose,
   200       JVMFlag::printError(verbose,
   223 };
   213 };
   224 
   214 
   225 class JVMFlagRange_double : public JVMFlagRange {
   215 class JVMFlagRange_double : public JVMFlagRange {
   226   double _min;
   216   double _min;
   227   double _max;
   217   double _max;
   228   const double* _ptr;
   218 
   229 
   219 public:
   230 public:
   220   JVMFlagRange_double(const JVMFlag* flag, double min, double max)
   231   // the "name" argument must be a string literal
   221     : JVMFlagRange(flag), _min(min), _max(max) {}
   232   JVMFlagRange_double(const char* name, const double* ptr, double min, double max)
   222 
   233     : JVMFlagRange(name), _min(min), _max(max), _ptr(ptr) {}
   223   JVMFlag::Error check(bool verbose = true) {
   234 
   224     return check_double(_flag->get_double(), verbose);
   235   JVMFlag::Error check(bool verbose = true) {
       
   236     return check_double(*_ptr, verbose);
       
   237   }
   225   }
   238 
   226 
   239   JVMFlag::Error check_double(double value, bool verbose = true) {
   227   JVMFlag::Error check_double(double value, bool verbose = true) {
   240     if ((value < _min) || (value > _max)) {
   228     if ((value < _min) || (value > _max)) {
   241       JVMFlag::printError(verbose,
   229       JVMFlag::printError(verbose,
   255 
   243 
   256 // No constraint emitting
   244 // No constraint emitting
   257 void emit_range_no(...)                         { /* NOP */ }
   245 void emit_range_no(...)                         { /* NOP */ }
   258 
   246 
   259 // No constraint emitting if function argument is NOT provided
   247 // No constraint emitting if function argument is NOT provided
   260 void emit_range_bool(const char* /*name*/, const bool* /*value*/)            { /* NOP */ }
   248 void emit_range_bool(const JVMFlag* /*flag*/)      { /* NOP */ }
   261 void emit_range_ccstr(const char* /*name*/, const ccstr* /*value*/)          { /* NOP */ }
   249 void emit_range_ccstr(const JVMFlag* /*flag*/)     { /* NOP */ }
   262 void emit_range_ccstrlist(const char* /*name*/, const ccstrlist* /*value*/)  { /* NOP */ }
   250 void emit_range_ccstrlist(const JVMFlag* /*flag*/) { /* NOP */ }
   263 void emit_range_int(const char* /*name*/, const int* /*value*/)              { /* NOP */ }
   251 void emit_range_int(const JVMFlag* /*flag*/)       { /* NOP */ }
   264 void emit_range_intx(const char* /*name*/, const intx* /*value*/)            { /* NOP */ }
   252 void emit_range_intx(const JVMFlag* /*flag*/)      { /* NOP */ }
   265 void emit_range_uint(const char* /*name*/, const uint* /*value*/)            { /* NOP */ }
   253 void emit_range_uint(const JVMFlag* /*flag*/)      { /* NOP */ }
   266 void emit_range_uintx(const char* /*name*/, const uintx* /*value*/)          { /* NOP */ }
   254 void emit_range_uintx(const JVMFlag* /*flag*/)     { /* NOP */ }
   267 void emit_range_uint64_t(const char* /*name*/, const uint64_t* /*value*/)    { /* NOP */ }
   255 void emit_range_uint64_t(const JVMFlag* /*flag*/)  { /* NOP */ }
   268 void emit_range_size_t(const char* /*name*/, const size_t* /*value*/)        { /* NOP */ }
   256 void emit_range_size_t(const JVMFlag* /*flag*/)    { /* NOP */ }
   269 void emit_range_double(const char* /*name*/, const double* /*value*/)        { /* NOP */ }
   257 void emit_range_double(const JVMFlag* /*flag*/)    { /* NOP */ }
   270 
   258 
   271 // JVMFlagRange emitting code functions if range arguments are provided
   259 // JVMFlagRange emitting code functions if range arguments are provided
   272 void emit_range_int(const char* name, const int* ptr, int min, int max)       {
   260 void emit_range_int(const JVMFlag* flag, int min, int max)       {
   273   JVMFlagRangeList::add(new JVMFlagRange_int(name, ptr, min, max));
   261   JVMFlagRangeList::add(new JVMFlagRange_int(flag, min, max));
   274 }
   262 }
   275 void emit_range_intx(const char* name, const intx* ptr, intx min, intx max) {
   263 void emit_range_intx(const JVMFlag* flag, intx min, intx max) {
   276   JVMFlagRangeList::add(new JVMFlagRange_intx(name, ptr, min, max));
   264   JVMFlagRangeList::add(new JVMFlagRange_intx(flag, min, max));
   277 }
   265 }
   278 void emit_range_uint(const char* name, const uint* ptr, uint min, uint max) {
   266 void emit_range_uint(const JVMFlag* flag, uint min, uint max) {
   279   JVMFlagRangeList::add(new JVMFlagRange_uint(name, ptr, min, max));
   267   JVMFlagRangeList::add(new JVMFlagRange_uint(flag, min, max));
   280 }
   268 }
   281 void emit_range_uintx(const char* name, const uintx* ptr, uintx min, uintx max) {
   269 void emit_range_uintx(const JVMFlag* flag, uintx min, uintx max) {
   282   JVMFlagRangeList::add(new JVMFlagRange_uintx(name, ptr, min, max));
   270   JVMFlagRangeList::add(new JVMFlagRange_uintx(flag, min, max));
   283 }
   271 }
   284 void emit_range_uint64_t(const char* name, const uint64_t* ptr, uint64_t min, uint64_t max) {
   272 void emit_range_uint64_t(const JVMFlag* flag, uint64_t min, uint64_t max) {
   285   JVMFlagRangeList::add(new JVMFlagRange_uint64_t(name, ptr, min, max));
   273   JVMFlagRangeList::add(new JVMFlagRange_uint64_t(flag, min, max));
   286 }
   274 }
   287 void emit_range_size_t(const char* name, const size_t* ptr, size_t min, size_t max) {
   275 void emit_range_size_t(const JVMFlag* flag, size_t min, size_t max) {
   288   JVMFlagRangeList::add(new JVMFlagRange_size_t(name, ptr, min, max));
   276   JVMFlagRangeList::add(new JVMFlagRange_size_t(flag, min, max));
   289 }
   277 }
   290 void emit_range_double(const char* name, const double* ptr, double min, double max) {
   278 void emit_range_double(const JVMFlag* flag, double min, double max) {
   291   JVMFlagRangeList::add(new JVMFlagRange_double(name, ptr, min, max));
   279   JVMFlagRangeList::add(new JVMFlagRange_double(flag, min, max));
   292 }
   280 }
   293 
   281 
   294 // Generate code to call emit_range_xxx function
   282 // Generate code to call emit_range_xxx function
   295 #define EMIT_RANGE_START       (void)(0
   283 #define EMIT_RANGE_START       (void)(0
   296 #define EMIT_RANGE(type, name) ); emit_range_##type(#name, &name
   284 #define EMIT_RANGE(type, name) ); emit_range_##type(JVMFlagEx::flag_from_enum(FLAG_MEMBER_ENUM(name))
   297 #define EMIT_RANGE_NO          ); emit_range_no(0
   285 #define EMIT_RANGE_NO          ); emit_range_no(0
   298 #define EMIT_RANGE_PRODUCT_FLAG(type, name, value, doc)      EMIT_RANGE(type, name)
   286 #define EMIT_RANGE_PRODUCT_FLAG(type, name, value, doc)      EMIT_RANGE(type, name)
   299 #define EMIT_RANGE_DIAGNOSTIC_FLAG(type, name, value, doc)   EMIT_RANGE(type, name)
   287 #define EMIT_RANGE_DIAGNOSTIC_FLAG(type, name, value, doc)   EMIT_RANGE(type, name)
   300 #define EMIT_RANGE_EXPERIMENTAL_FLAG(type, name, value, doc) EMIT_RANGE(type, name)
   288 #define EMIT_RANGE_EXPERIMENTAL_FLAG(type, name, value, doc) EMIT_RANGE(type, name)
   301 #define EMIT_RANGE_MANAGEABLE_FLAG(type, name, value, doc)   EMIT_RANGE(type, name)
   289 #define EMIT_RANGE_MANAGEABLE_FLAG(type, name, value, doc)   EMIT_RANGE(type, name)
   349   EMIT_RANGES_FOR_GLOBALS_EXT
   337   EMIT_RANGES_FOR_GLOBALS_EXT
   350 
   338 
   351   EMIT_RANGE_END
   339   EMIT_RANGE_END
   352 }
   340 }
   353 
   341 
   354 JVMFlagRange* JVMFlagRangeList::find(const char* name) {
   342 JVMFlagRange* JVMFlagRangeList::find(const JVMFlag* flag) {
   355   JVMFlagRange* found = NULL;
   343   JVMFlagRange* found = NULL;
   356   for (int i=0; i<length(); i++) {
   344   for (int i=0; i<length(); i++) {
   357     JVMFlagRange* range = at(i);
   345     JVMFlagRange* range = at(i);
   358     if (strcmp(range->name(), name) == 0) {
   346     if (range->flag() == flag) {
   359       found = range;
   347       found = range;
   360       break;
   348       break;
   361     }
   349     }
   362   }
   350   }
   363   return found;
   351   return found;
   364 }
   352 }
   365 
   353 
   366 void JVMFlagRangeList::print(outputStream* st, const char* name, RangeStrFunc default_range_str_func) {
   354 void JVMFlagRangeList::print(outputStream* st, const JVMFlag* flag, RangeStrFunc default_range_str_func) {
   367   JVMFlagRange* range = JVMFlagRangeList::find(name);
   355   JVMFlagRange* range = JVMFlagRangeList::find(flag);
   368   if (range != NULL) {
   356   if (range != NULL) {
   369     range->print(st);
   357     range->print(st);
   370   } else {
   358   } else {
   371     JVMFlagConstraint* constraint = JVMFlagConstraintList::find(name);
   359     JVMFlagConstraint* constraint = JVMFlagConstraintList::find(flag);
   372     if (constraint != NULL) {
   360     if (constraint != NULL) {
   373       assert(default_range_str_func!=NULL, "default_range_str_func must be provided");
   361       assert(default_range_str_func!=NULL, "default_range_str_func must be provided");
   374       st->print("%s", default_range_str_func());
   362       st->print("%s", default_range_str_func());
   375     } else {
   363     } else {
   376       st->print("[                           ...                           ]");
   364       st->print("[                           ...                           ]");