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, |
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("[ ... ]"); |