comparison src/share/vm/runtime/globals.cpp @ 1768:6ee479178066

6979444: add command line option to print command line flags descriptions Summary: Implementation of a nonproduct boolean flag XX:PrintFlagsWithComments Reviewed-by: kamg, dholmes, dsamersoff
author ikrylov
date Tue, 31 Aug 2010 03:14:00 -0700
parents d2ede61b7a12
children f95d63e2154a
comparison
equal deleted inserted replaced
1752:8397081c7ac1 1768:6ee479178066
66 } 66 }
67 67
68 // Length of format string (e.g. "%.1234s") for printing ccstr below 68 // Length of format string (e.g. "%.1234s") for printing ccstr below
69 #define FORMAT_BUFFER_LEN 16 69 #define FORMAT_BUFFER_LEN 16
70 70
71 void Flag::print_on(outputStream* st) { 71 void Flag::print_on(outputStream* st, bool withComments) {
72 st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' ')); 72 st->print("%9s %-40s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
73 if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false"); 73 if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
74 if (is_intx()) st->print("%-16ld", get_intx()); 74 if (is_intx()) st->print("%-16ld", get_intx());
75 if (is_uintx()) st->print("%-16lu", get_uintx()); 75 if (is_uintx()) st->print("%-16lu", get_uintx());
76 if (is_uint64_t()) st->print("%-16lu", get_uint64_t()); 76 if (is_uint64_t()) st->print("%-16lu", get_uint64_t());
77 if (is_double()) st->print("%-16f", get_double());
78
77 if (is_ccstr()) { 79 if (is_ccstr()) {
78 const char* cp = get_ccstr(); 80 const char* cp = get_ccstr();
79 if (cp != NULL) { 81 if (cp != NULL) {
80 const char* eol; 82 const char* eol;
81 while ((eol = strchr(cp, '\n')) != NULL) { 83 while ((eol = strchr(cp, '\n')) != NULL) {
82 char format_buffer[FORMAT_BUFFER_LEN]; 84 char format_buffer[FORMAT_BUFFER_LEN];
83 size_t llen = pointer_delta(eol, cp, sizeof(char)); 85 size_t llen = pointer_delta(eol, cp, sizeof(char));
84 jio_snprintf(format_buffer, FORMAT_BUFFER_LEN, 86 jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
85 "%%." SIZE_FORMAT "s", llen); 87 "%%." SIZE_FORMAT "s", llen);
86 st->print(format_buffer, cp); 88 st->print(format_buffer, cp);
87 st->cr(); 89 st->cr();
88 cp = eol+1; 90 cp = eol+1;
89 st->print("%5s %-35s += ", "", name); 91 st->print("%5s %-35s += ", "", name);
90 } 92 }
91 st->print("%-16s", cp); 93 st->print("%-16s", cp);
92 } 94 }
93 } 95 else st->print("%-16s", "");
94 st->print(" %s", kind); 96 }
97 st->print("%-20s", kind);
98 if (withComments) {
99 #ifndef PRODUCT
100 st->print("%s", doc );
101 #endif
102 }
95 st->cr(); 103 st->cr();
96 } 104 }
97 105
98 void Flag::print_as_flag(outputStream* st) { 106 void Flag::print_as_flag(outputStream* st) {
99 if (is_bool()) { 107 if (is_bool()) {
129 } 137 }
130 138
131 // 4991491 do not "optimize out" the was_set false values: omitting them 139 // 4991491 do not "optimize out" the was_set false values: omitting them
132 // tickles a Microsoft compiler bug causing flagTable to be malformed 140 // tickles a Microsoft compiler bug causing flagTable to be malformed
133 141
134 #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT }, 142 #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product}", DEFAULT },
135 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT }, 143 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{pd product}", DEFAULT },
136 #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{diagnostic}", DEFAULT }, 144 #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{diagnostic}", DEFAULT },
137 #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{experimental}", DEFAULT }, 145 #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{experimental}", DEFAULT },
138 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT }, 146 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{manageable}", DEFAULT },
139 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT }, 147 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product rw}", DEFAULT },
140 148
141 #ifdef PRODUCT 149 #ifdef PRODUCT
142 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 150 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
143 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 151 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
144 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 152 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
145 #else 153 #else
146 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT }, 154 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "", DEFAULT },
147 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT }, 155 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{pd}", DEFAULT },
148 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT }, 156 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{notproduct}", DEFAULT },
149 #endif 157 #endif
150 158
151 #ifdef _LP64 159 #ifdef _LP64
152 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{lp64_product}", DEFAULT }, 160 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{lp64_product}", DEFAULT },
153 #else 161 #else
154 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 162 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
155 #endif // _LP64 163 #endif // _LP64
156 164
157 #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT }, 165 #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 product}", DEFAULT },
158 #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT }, 166 #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 pd product}", DEFAULT },
159 #ifdef PRODUCT 167 #ifdef PRODUCT
160 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 168 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
161 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 169 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
162 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 170 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
163 #else 171 #else
164 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT }, 172 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1}", DEFAULT },
165 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT }, 173 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C1 pd}", DEFAULT },
166 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT }, 174 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1 notproduct}", DEFAULT },
167 #endif 175 #endif
168 176
169 177
170 #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT }, 178 #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 product}", DEFAULT },
171 #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT }, 179 #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 pd product}", DEFAULT },
172 #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT }, 180 #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 diagnostic}", DEFAULT },
173 #define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 experimental}", DEFAULT }, 181 #define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 experimental}", DEFAULT },
174 #ifdef PRODUCT 182 #ifdef PRODUCT
175 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 183 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
176 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 184 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
177 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 185 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
178 #else 186 #else
179 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT }, 187 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2}", DEFAULT },
180 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT }, 188 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C2 pd}", DEFAULT },
181 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT }, 189 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2 notproduct}", DEFAULT },
182 #endif 190 #endif
183 191
184 #define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark product}", DEFAULT }, 192 #define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark product}", DEFAULT },
185 #define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{Shark pd product}", DEFAULT }, 193 #define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark pd product}", DEFAULT },
186 #define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark diagnostic}", DEFAULT }, 194 #define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark diagnostic}", DEFAULT },
187 #ifdef PRODUCT 195 #ifdef PRODUCT
188 #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 196 #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
189 #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 197 #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
190 #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 198 #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
191 #else 199 #else
192 #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark}", DEFAULT }, 200 #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark}", DEFAULT },
193 #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{Shark pd}", DEFAULT }, 201 #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{Shark pd}", DEFAULT },
194 #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark notproduct}", DEFAULT }, 202 #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark notproduct}", DEFAULT },
195 #endif 203 #endif
196 204
197 static Flag flagTable[] = { 205 static Flag flagTable[] = {
198 RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_EXPERIMENTAL_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT, RUNTIME_LP64_PRODUCT_FLAG_STRUCT) 206 RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_EXPERIMENTAL_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT, RUNTIME_LP64_PRODUCT_FLAG_STRUCT)
199 RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT) 207 RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT)
483 assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict"); 491 assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict");
484 } 492 }
485 493
486 #endif // PRODUCT 494 #endif // PRODUCT
487 495
488 void CommandLineFlags::printFlags() { 496 void CommandLineFlags::printFlags(bool withComments) {
489 // Print the flags sorted by name 497 // Print the flags sorted by name
490 // note: this method is called before the thread structure is in place 498 // note: this method is called before the thread structure is in place
491 // which means resource allocation cannot be used. 499 // which means resource allocation cannot be used.
492 500
493 // Compute size 501 // Compute size
503 511
504 // Print 512 // Print
505 tty->print_cr("[Global flags]"); 513 tty->print_cr("[Global flags]");
506 for (int i = 0; i < length; i++) { 514 for (int i = 0; i < length; i++) {
507 if (array[i]->is_unlocked()) { 515 if (array[i]->is_unlocked()) {
508 array[i]->print_on(tty); 516 array[i]->print_on(tty, withComments);
509 } 517 }
510 } 518 }
511 FREE_C_HEAP_ARRAY(Flag*, array); 519 FREE_C_HEAP_ARRAY(Flag*, array);
512 } 520 }