1.1 --- a/src/share/vm/runtime/globals.cpp Wed Oct 16 10:52:41 2013 +0200 1.2 +++ b/src/share/vm/runtime/globals.cpp Tue Nov 05 17:38:04 2013 -0800 1.3 @@ -62,26 +62,174 @@ 1.4 MATERIALIZE_FLAGS_EXT 1.5 1.6 1.7 +void Flag::check_writable() { 1.8 + if (is_constant_in_binary()) { 1.9 + fatal(err_msg("flag is constant: %s", _name)); 1.10 + } 1.11 +} 1.12 + 1.13 +bool Flag::is_bool() const { 1.14 + return strcmp(_type, "bool") == 0; 1.15 +} 1.16 + 1.17 +bool Flag::get_bool() const { 1.18 + return *((bool*) _addr); 1.19 +} 1.20 + 1.21 +void Flag::set_bool(bool value) { 1.22 + check_writable(); 1.23 + *((bool*) _addr) = value; 1.24 +} 1.25 + 1.26 +bool Flag::is_intx() const { 1.27 + return strcmp(_type, "intx") == 0; 1.28 +} 1.29 + 1.30 +intx Flag::get_intx() const { 1.31 + return *((intx*) _addr); 1.32 +} 1.33 + 1.34 +void Flag::set_intx(intx value) { 1.35 + check_writable(); 1.36 + *((intx*) _addr) = value; 1.37 +} 1.38 + 1.39 +bool Flag::is_uintx() const { 1.40 + return strcmp(_type, "uintx") == 0; 1.41 +} 1.42 + 1.43 +uintx Flag::get_uintx() const { 1.44 + return *((uintx*) _addr); 1.45 +} 1.46 + 1.47 +void Flag::set_uintx(uintx value) { 1.48 + check_writable(); 1.49 + *((uintx*) _addr) = value; 1.50 +} 1.51 + 1.52 +bool Flag::is_uint64_t() const { 1.53 + return strcmp(_type, "uint64_t") == 0; 1.54 +} 1.55 + 1.56 +uint64_t Flag::get_uint64_t() const { 1.57 + return *((uint64_t*) _addr); 1.58 +} 1.59 + 1.60 +void Flag::set_uint64_t(uint64_t value) { 1.61 + check_writable(); 1.62 + *((uint64_t*) _addr) = value; 1.63 +} 1.64 + 1.65 +bool Flag::is_double() const { 1.66 + return strcmp(_type, "double") == 0; 1.67 +} 1.68 + 1.69 +double Flag::get_double() const { 1.70 + return *((double*) _addr); 1.71 +} 1.72 + 1.73 +void Flag::set_double(double value) { 1.74 + check_writable(); 1.75 + *((double*) _addr) = value; 1.76 +} 1.77 + 1.78 +bool Flag::is_ccstr() const { 1.79 + return strcmp(_type, "ccstr") == 0 || strcmp(_type, "ccstrlist") == 0; 1.80 +} 1.81 + 1.82 +bool Flag::ccstr_accumulates() const { 1.83 + return strcmp(_type, "ccstrlist") == 0; 1.84 +} 1.85 + 1.86 +ccstr Flag::get_ccstr() const { 1.87 + return *((ccstr*) _addr); 1.88 +} 1.89 + 1.90 +void Flag::set_ccstr(ccstr value) { 1.91 + check_writable(); 1.92 + *((ccstr*) _addr) = value; 1.93 +} 1.94 + 1.95 + 1.96 +Flag::Flags Flag::get_origin() { 1.97 + return Flags(_flags & VALUE_ORIGIN_MASK); 1.98 +} 1.99 + 1.100 +void Flag::set_origin(Flags origin) { 1.101 + assert((origin & VALUE_ORIGIN_MASK) == origin, "sanity"); 1.102 + _flags = Flags((_flags & ~VALUE_ORIGIN_MASK) | origin); 1.103 +} 1.104 + 1.105 +bool Flag::is_default() { 1.106 + return (get_origin() == DEFAULT); 1.107 +} 1.108 + 1.109 +bool Flag::is_ergonomic() { 1.110 + return (get_origin() == ERGONOMIC); 1.111 +} 1.112 + 1.113 +bool Flag::is_command_line() { 1.114 + return (get_origin() == COMMAND_LINE); 1.115 +} 1.116 + 1.117 +bool Flag::is_product() const { 1.118 + return (_flags & KIND_PRODUCT) != 0; 1.119 +} 1.120 + 1.121 +bool Flag::is_manageable() const { 1.122 + return (_flags & KIND_MANAGEABLE) != 0; 1.123 +} 1.124 + 1.125 +bool Flag::is_diagnostic() const { 1.126 + return (_flags & KIND_DIAGNOSTIC) != 0; 1.127 +} 1.128 + 1.129 +bool Flag::is_experimental() const { 1.130 + return (_flags & KIND_EXPERIMENTAL) != 0; 1.131 +} 1.132 + 1.133 +bool Flag::is_notproduct() const { 1.134 + return (_flags & KIND_NOT_PRODUCT) != 0; 1.135 +} 1.136 + 1.137 +bool Flag::is_develop() const { 1.138 + return (_flags & KIND_DEVELOP) != 0; 1.139 +} 1.140 + 1.141 +bool Flag::is_read_write() const { 1.142 + return (_flags & KIND_READ_WRITE) != 0; 1.143 +} 1.144 + 1.145 +bool Flag::is_commercial() const { 1.146 + return (_flags & KIND_COMMERCIAL) != 0; 1.147 +} 1.148 + 1.149 +/** 1.150 + * Returns if this flag is a constant in the binary. Right now this is 1.151 + * true for notproduct and develop flags in product builds. 1.152 + */ 1.153 +bool Flag::is_constant_in_binary() const { 1.154 +#ifdef PRODUCT 1.155 + return is_notproduct() || is_develop(); 1.156 +#else 1.157 + return false; 1.158 +#endif 1.159 +} 1.160 + 1.161 bool Flag::is_unlocker() const { 1.162 - return strcmp(name, "UnlockDiagnosticVMOptions") == 0 || 1.163 - strcmp(name, "UnlockExperimentalVMOptions") == 0 || 1.164 + return strcmp(_name, "UnlockDiagnosticVMOptions") == 0 || 1.165 + strcmp(_name, "UnlockExperimentalVMOptions") == 0 || 1.166 is_unlocker_ext(); 1.167 } 1.168 1.169 bool Flag::is_unlocked() const { 1.170 - if (strcmp(kind, "{diagnostic}") == 0 || 1.171 - strcmp(kind, "{C2 diagnostic}") == 0 || 1.172 - strcmp(kind, "{ARCH diagnostic}") == 0 || 1.173 - strcmp(kind, "{Shark diagnostic}") == 0) { 1.174 + if (is_diagnostic()) { 1.175 return UnlockDiagnosticVMOptions; 1.176 - } else if (strcmp(kind, "{experimental}") == 0 || 1.177 - strcmp(kind, "{C2 experimental}") == 0 || 1.178 - strcmp(kind, "{ARCH experimental}") == 0 || 1.179 - strcmp(kind, "{Shark experimental}") == 0) { 1.180 + } 1.181 + if (is_experimental()) { 1.182 return UnlockExperimentalVMOptions; 1.183 - } else { 1.184 - return is_unlocked_ext(); 1.185 } 1.186 + return is_unlocked_ext(); 1.187 } 1.188 1.189 // Get custom message for this locked flag, or return NULL if 1.190 @@ -91,16 +239,14 @@ 1.191 } 1.192 1.193 bool Flag::is_writeable() const { 1.194 - return strcmp(kind, "{manageable}") == 0 || 1.195 - strcmp(kind, "{product rw}") == 0 || 1.196 - is_writeable_ext(); 1.197 + return is_manageable() || (is_product() && is_read_write()) || is_writeable_ext(); 1.198 } 1.199 1.200 // All flags except "manageable" are assumed to be internal flags. 1.201 // Long term, we need to define a mechanism to specify which flags 1.202 // are external/stable and change this function accordingly. 1.203 bool Flag::is_external() const { 1.204 - return strcmp(kind, "{manageable}") == 0 || is_external_ext(); 1.205 + return is_manageable() || is_external_ext(); 1.206 } 1.207 1.208 1.209 @@ -108,53 +254,113 @@ 1.210 #define FORMAT_BUFFER_LEN 16 1.211 1.212 void Flag::print_on(outputStream* st, bool withComments) { 1.213 - st->print("%9s %-40s %c= ", type, name, (origin != DEFAULT ? ':' : ' ')); 1.214 - if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false"); 1.215 - if (is_intx()) st->print("%-16ld", get_intx()); 1.216 - if (is_uintx()) st->print("%-16lu", get_uintx()); 1.217 - if (is_uint64_t()) st->print("%-16lu", get_uint64_t()); 1.218 - if (is_double()) st->print("%-16f", get_double()); 1.219 + // Don't print notproduct and develop flags in a product build. 1.220 + if (is_constant_in_binary()) { 1.221 + return; 1.222 + } 1.223 1.224 + st->print("%9s %-40s %c= ", _type, _name, (!is_default() ? ':' : ' ')); 1.225 + 1.226 + if (is_bool()) { 1.227 + st->print("%-16s", get_bool() ? "true" : "false"); 1.228 + } 1.229 + if (is_intx()) { 1.230 + st->print("%-16ld", get_intx()); 1.231 + } 1.232 + if (is_uintx()) { 1.233 + st->print("%-16lu", get_uintx()); 1.234 + } 1.235 + if (is_uint64_t()) { 1.236 + st->print("%-16lu", get_uint64_t()); 1.237 + } 1.238 + if (is_double()) { 1.239 + st->print("%-16f", get_double()); 1.240 + } 1.241 if (is_ccstr()) { 1.242 - const char* cp = get_ccstr(); 1.243 - if (cp != NULL) { 1.244 - const char* eol; 1.245 - while ((eol = strchr(cp, '\n')) != NULL) { 1.246 - char format_buffer[FORMAT_BUFFER_LEN]; 1.247 - size_t llen = pointer_delta(eol, cp, sizeof(char)); 1.248 - jio_snprintf(format_buffer, FORMAT_BUFFER_LEN, 1.249 - "%%." SIZE_FORMAT "s", llen); 1.250 - st->print(format_buffer, cp); 1.251 - st->cr(); 1.252 - cp = eol+1; 1.253 - st->print("%5s %-35s += ", "", name); 1.254 - } 1.255 - st->print("%-16s", cp); 1.256 - } 1.257 - else st->print("%-16s", ""); 1.258 + const char* cp = get_ccstr(); 1.259 + if (cp != NULL) { 1.260 + const char* eol; 1.261 + while ((eol = strchr(cp, '\n')) != NULL) { 1.262 + char format_buffer[FORMAT_BUFFER_LEN]; 1.263 + size_t llen = pointer_delta(eol, cp, sizeof(char)); 1.264 + jio_snprintf(format_buffer, FORMAT_BUFFER_LEN, 1.265 + "%%." SIZE_FORMAT "s", llen); 1.266 + st->print(format_buffer, cp); 1.267 + st->cr(); 1.268 + cp = eol+1; 1.269 + st->print("%5s %-35s += ", "", _name); 1.270 + } 1.271 + st->print("%-16s", cp); 1.272 + } 1.273 + else st->print("%-16s", ""); 1.274 } 1.275 - st->print("%-20s", kind); 1.276 + 1.277 + st->print("%-20"); 1.278 + print_kind(st); 1.279 + 1.280 if (withComments) { 1.281 #ifndef PRODUCT 1.282 - st->print("%s", doc ); 1.283 + st->print("%s", _doc); 1.284 #endif 1.285 } 1.286 st->cr(); 1.287 } 1.288 1.289 +void Flag::print_kind(outputStream* st) { 1.290 + struct Data { 1.291 + int flag; 1.292 + const char* name; 1.293 + }; 1.294 + 1.295 + Data data[] = { 1.296 + { KIND_C1, "C1" }, 1.297 + { KIND_C2, "C2" }, 1.298 + { KIND_ARCH, "ARCH" }, 1.299 + { KIND_SHARK, "SHARK" }, 1.300 + { KIND_PLATFORM_DEPENDENT, "pd" }, 1.301 + { KIND_PRODUCT, "product" }, 1.302 + { KIND_MANAGEABLE, "manageable" }, 1.303 + { KIND_DIAGNOSTIC, "diagnostic" }, 1.304 + { KIND_NOT_PRODUCT, "notproduct" }, 1.305 + { KIND_DEVELOP, "develop" }, 1.306 + { KIND_LP64_PRODUCT, "lp64_product" }, 1.307 + { KIND_READ_WRITE, "rw" }, 1.308 + { -1, "" } 1.309 + }; 1.310 + 1.311 + if ((_flags & KIND_MASK) != 0) { 1.312 + st->print("{"); 1.313 + bool is_first = true; 1.314 + 1.315 + for (int i = 0; data[i].flag != -1; i++) { 1.316 + Data d = data[i]; 1.317 + if ((_flags & d.flag) != 0) { 1.318 + if (is_first) { 1.319 + is_first = false; 1.320 + } else { 1.321 + st->print(" "); 1.322 + } 1.323 + st->print(d.name); 1.324 + } 1.325 + } 1.326 + 1.327 + st->print("}"); 1.328 + } 1.329 +} 1.330 + 1.331 void Flag::print_as_flag(outputStream* st) { 1.332 if (is_bool()) { 1.333 - st->print("-XX:%s%s", get_bool() ? "+" : "-", name); 1.334 + st->print("-XX:%s%s", get_bool() ? "+" : "-", _name); 1.335 } else if (is_intx()) { 1.336 - st->print("-XX:%s=" INTX_FORMAT, name, get_intx()); 1.337 + st->print("-XX:%s=" INTX_FORMAT, _name, get_intx()); 1.338 } else if (is_uintx()) { 1.339 - st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx()); 1.340 + st->print("-XX:%s=" UINTX_FORMAT, _name, get_uintx()); 1.341 } else if (is_uint64_t()) { 1.342 - st->print("-XX:%s=" UINT64_FORMAT, name, get_uint64_t()); 1.343 + st->print("-XX:%s=" UINT64_FORMAT, _name, get_uint64_t()); 1.344 } else if (is_double()) { 1.345 - st->print("-XX:%s=%f", name, get_double()); 1.346 + st->print("-XX:%s=%f", _name, get_double()); 1.347 } else if (is_ccstr()) { 1.348 - st->print("-XX:%s=", name); 1.349 + st->print("-XX:%s=", _name); 1.350 const char* cp = get_ccstr(); 1.351 if (cp != NULL) { 1.352 // Need to turn embedded '\n's back into separate arguments 1.353 @@ -167,7 +373,7 @@ 1.354 st->print("%c", *cp); 1.355 break; 1.356 case '\n': 1.357 - st->print(" -XX:%s=", name); 1.358 + st->print(" -XX:%s=", _name); 1.359 break; 1.360 } 1.361 } 1.362 @@ -180,78 +386,51 @@ 1.363 // 4991491 do not "optimize out" the was_set false values: omitting them 1.364 // tickles a Microsoft compiler bug causing flagTable to be malformed 1.365 1.366 -#define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product}", DEFAULT }, 1.367 -#define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{pd product}", DEFAULT }, 1.368 -#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{diagnostic}", DEFAULT }, 1.369 -#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{experimental}", DEFAULT }, 1.370 -#define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{manageable}", DEFAULT }, 1.371 -#define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product rw}", DEFAULT }, 1.372 +#define NAME(name) NOT_PRODUCT(&name) PRODUCT_ONLY(&CONST_##name) 1.373 1.374 -#ifdef PRODUCT 1.375 - #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.376 - #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 1.377 - #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 1.378 -#else 1.379 - #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "", DEFAULT }, 1.380 - #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{pd}", DEFAULT }, 1.381 - #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{notproduct}", DEFAULT }, 1.382 -#endif 1.383 +#define RUNTIME_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT) }, 1.384 +#define RUNTIME_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) }, 1.385 +#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC) }, 1.386 +#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_EXPERIMENTAL) }, 1.387 +#define RUNTIME_MANAGEABLE_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_MANAGEABLE) }, 1.388 +#define RUNTIME_PRODUCT_RW_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_READ_WRITE) }, 1.389 +#define RUNTIME_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DEVELOP) }, 1.390 +#define RUNTIME_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) }, 1.391 +#define RUNTIME_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_NOT_PRODUCT) }, 1.392 1.393 #ifdef _LP64 1.394 - #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{lp64_product}", DEFAULT }, 1.395 +#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_LP64_PRODUCT) }, 1.396 #else 1.397 - #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.398 +#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.399 #endif // _LP64 1.400 1.401 -#define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 product}", DEFAULT }, 1.402 -#define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 pd product}", DEFAULT }, 1.403 -#ifdef PRODUCT 1.404 - #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.405 - #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 1.406 - #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 1.407 -#else 1.408 - #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1}", DEFAULT }, 1.409 - #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C1 pd}", DEFAULT }, 1.410 - #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1 notproduct}", DEFAULT }, 1.411 -#endif 1.412 +#define C1_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT) }, 1.413 +#define C1_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) }, 1.414 +#define C1_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC) }, 1.415 +#define C1_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP) }, 1.416 +#define C1_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) }, 1.417 +#define C1_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_NOT_PRODUCT) }, 1.418 1.419 -#define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 product}", DEFAULT }, 1.420 -#define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 pd product}", DEFAULT }, 1.421 -#define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 diagnostic}", DEFAULT }, 1.422 -#define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 experimental}", DEFAULT }, 1.423 -#ifdef PRODUCT 1.424 - #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.425 - #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 1.426 - #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 1.427 -#else 1.428 - #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2}", DEFAULT }, 1.429 - #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C2 pd}", DEFAULT }, 1.430 - #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2 notproduct}", DEFAULT }, 1.431 -#endif 1.432 +#define C2_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT) }, 1.433 +#define C2_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) }, 1.434 +#define C2_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC) }, 1.435 +#define C2_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_EXPERIMENTAL) }, 1.436 +#define C2_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP) }, 1.437 +#define C2_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) }, 1.438 +#define C2_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_NOT_PRODUCT) }, 1.439 1.440 -#define ARCH_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH product}", DEFAULT }, 1.441 -#define ARCH_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH diagnostic}", DEFAULT }, 1.442 -#define ARCH_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH experimental}", DEFAULT }, 1.443 -#ifdef PRODUCT 1.444 - #define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.445 - #define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 1.446 -#else 1.447 - #define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH}", DEFAULT }, 1.448 - #define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH notproduct}", DEFAULT }, 1.449 -#endif 1.450 +#define ARCH_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_PRODUCT) }, 1.451 +#define ARCH_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_DIAGNOSTIC) }, 1.452 +#define ARCH_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_EXPERIMENTAL) }, 1.453 +#define ARCH_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_DEVELOP) }, 1.454 +#define ARCH_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_NOT_PRODUCT) }, 1.455 1.456 -#define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark product}", DEFAULT }, 1.457 -#define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark pd product}", DEFAULT }, 1.458 -#define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark diagnostic}", DEFAULT }, 1.459 -#ifdef PRODUCT 1.460 - #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ 1.461 - #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ 1.462 - #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) 1.463 -#else 1.464 - #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark}", DEFAULT }, 1.465 - #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{Shark pd}", DEFAULT }, 1.466 - #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark notproduct}", DEFAULT }, 1.467 -#endif 1.468 +#define SHARK_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT) }, 1.469 +#define SHARK_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) }, 1.470 +#define SHARK_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC) }, 1.471 +#define SHARK_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP) }, 1.472 +#define SHARK_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) }, 1.473 +#define SHARK_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_NOT_PRODUCT) }, 1.474 1.475 static Flag flagTable[] = { 1.476 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) 1.477 @@ -260,7 +439,7 @@ 1.478 G1_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) 1.479 #endif // INCLUDE_ALL_GCS 1.480 #ifdef COMPILER1 1.481 - C1_FLAGS(C1_DEVELOP_FLAG_STRUCT, C1_PD_DEVELOP_FLAG_STRUCT, C1_PRODUCT_FLAG_STRUCT, C1_PD_PRODUCT_FLAG_STRUCT, C1_NOTPRODUCT_FLAG_STRUCT) 1.482 + C1_FLAGS(C1_DEVELOP_FLAG_STRUCT, C1_PD_DEVELOP_FLAG_STRUCT, C1_PRODUCT_FLAG_STRUCT, C1_PD_PRODUCT_FLAG_STRUCT, C1_DIAGNOSTIC_FLAG_STRUCT, C1_NOTPRODUCT_FLAG_STRUCT) 1.483 #endif 1.484 #ifdef COMPILER2 1.485 C2_FLAGS(C2_DEVELOP_FLAG_STRUCT, C2_PD_DEVELOP_FLAG_STRUCT, C2_PRODUCT_FLAG_STRUCT, C2_PD_PRODUCT_FLAG_STRUCT, C2_DIAGNOSTIC_FLAG_STRUCT, C2_EXPERIMENTAL_FLAG_STRUCT, C2_NOTPRODUCT_FLAG_STRUCT) 1.486 @@ -284,9 +463,14 @@ 1.487 1.488 // Search the flag table for a named flag 1.489 Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked) { 1.490 - for (Flag* current = &flagTable[0]; current->name != NULL; current++) { 1.491 - if (str_equal(current->name, name, length)) { 1.492 - // Found a matching entry. Report locked flags only if allowed. 1.493 + for (Flag* current = &flagTable[0]; current->_name != NULL; current++) { 1.494 + if (str_equal(current->_name, name, length)) { 1.495 + // Found a matching entry. 1.496 + // Don't report notproduct and develop flags in product builds. 1.497 + if (current->is_constant_in_binary()) { 1.498 + return NULL; 1.499 + } 1.500 + // Report locked flags only if allowed. 1.501 if (!(current->is_unlocked() || current->is_unlocker())) { 1.502 if (!allow_locked) { 1.503 // disable use of locked flags, e.g. diagnostic, experimental, 1.504 @@ -326,8 +510,8 @@ 1.505 float score; 1.506 float max_score = -1; 1.507 1.508 - for (Flag* current = &flagTable[0]; current->name != NULL; current++) { 1.509 - score = str_similar(current->name, name, length); 1.510 + for (Flag* current = &flagTable[0]; current->_name != NULL; current++) { 1.511 + score = str_similar(current->_name, name, length); 1.512 if (score > max_score) { 1.513 max_score = score; 1.514 match = current; 1.515 @@ -356,25 +540,25 @@ 1.516 bool CommandLineFlagsEx::is_default(CommandLineFlag flag) { 1.517 assert((size_t)flag < Flag::numFlags, "bad command line flag index"); 1.518 Flag* f = &Flag::flags[flag]; 1.519 - return (f->origin == DEFAULT); 1.520 + return f->is_default(); 1.521 } 1.522 1.523 bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) { 1.524 assert((size_t)flag < Flag::numFlags, "bad command line flag index"); 1.525 Flag* f = &Flag::flags[flag]; 1.526 - return (f->origin == ERGONOMIC); 1.527 + return f->is_ergonomic(); 1.528 } 1.529 1.530 bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) { 1.531 assert((size_t)flag < Flag::numFlags, "bad command line flag index"); 1.532 Flag* f = &Flag::flags[flag]; 1.533 - return (f->origin == COMMAND_LINE); 1.534 + return f->is_command_line(); 1.535 } 1.536 1.537 bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) { 1.538 Flag* result = Flag::find_flag((char*)name, strlen(name)); 1.539 if (result == NULL) return false; 1.540 - *value = (result->origin == COMMAND_LINE); 1.541 + *value = result->is_command_line(); 1.542 return true; 1.543 } 1.544 1.545 @@ -386,22 +570,22 @@ 1.546 return true; 1.547 } 1.548 1.549 -bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) { 1.550 +bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin) { 1.551 Flag* result = Flag::find_flag(name, len); 1.552 if (result == NULL) return false; 1.553 if (!result->is_bool()) return false; 1.554 bool old_value = result->get_bool(); 1.555 result->set_bool(*value); 1.556 *value = old_value; 1.557 - result->origin = origin; 1.558 + result->set_origin(origin); 1.559 return true; 1.560 } 1.561 1.562 -void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) { 1.563 +void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, Flag::Flags origin) { 1.564 Flag* faddr = address_of_flag(flag); 1.565 guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type"); 1.566 faddr->set_bool(value); 1.567 - faddr->origin = origin; 1.568 + faddr->set_origin(origin); 1.569 } 1.570 1.571 bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) { 1.572 @@ -412,22 +596,22 @@ 1.573 return true; 1.574 } 1.575 1.576 -bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) { 1.577 +bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin) { 1.578 Flag* result = Flag::find_flag(name, len); 1.579 if (result == NULL) return false; 1.580 if (!result->is_intx()) return false; 1.581 intx old_value = result->get_intx(); 1.582 result->set_intx(*value); 1.583 *value = old_value; 1.584 - result->origin = origin; 1.585 + result->set_origin(origin); 1.586 return true; 1.587 } 1.588 1.589 -void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) { 1.590 +void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, Flag::Flags origin) { 1.591 Flag* faddr = address_of_flag(flag); 1.592 guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type"); 1.593 faddr->set_intx(value); 1.594 - faddr->origin = origin; 1.595 + faddr->set_origin(origin); 1.596 } 1.597 1.598 bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) { 1.599 @@ -438,22 +622,22 @@ 1.600 return true; 1.601 } 1.602 1.603 -bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) { 1.604 +bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin) { 1.605 Flag* result = Flag::find_flag(name, len); 1.606 if (result == NULL) return false; 1.607 if (!result->is_uintx()) return false; 1.608 uintx old_value = result->get_uintx(); 1.609 result->set_uintx(*value); 1.610 *value = old_value; 1.611 - result->origin = origin; 1.612 + result->set_origin(origin); 1.613 return true; 1.614 } 1.615 1.616 -void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) { 1.617 +void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin) { 1.618 Flag* faddr = address_of_flag(flag); 1.619 guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type"); 1.620 faddr->set_uintx(value); 1.621 - faddr->origin = origin; 1.622 + faddr->set_origin(origin); 1.623 } 1.624 1.625 bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) { 1.626 @@ -464,22 +648,22 @@ 1.627 return true; 1.628 } 1.629 1.630 -bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, FlagValueOrigin origin) { 1.631 +bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin) { 1.632 Flag* result = Flag::find_flag(name, len); 1.633 if (result == NULL) return false; 1.634 if (!result->is_uint64_t()) return false; 1.635 uint64_t old_value = result->get_uint64_t(); 1.636 result->set_uint64_t(*value); 1.637 *value = old_value; 1.638 - result->origin = origin; 1.639 + result->set_origin(origin); 1.640 return true; 1.641 } 1.642 1.643 -void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin) { 1.644 +void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin) { 1.645 Flag* faddr = address_of_flag(flag); 1.646 guarantee(faddr != NULL && faddr->is_uint64_t(), "wrong flag type"); 1.647 faddr->set_uint64_t(value); 1.648 - faddr->origin = origin; 1.649 + faddr->set_origin(origin); 1.650 } 1.651 1.652 bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) { 1.653 @@ -490,22 +674,22 @@ 1.654 return true; 1.655 } 1.656 1.657 -bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) { 1.658 +bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin) { 1.659 Flag* result = Flag::find_flag(name, len); 1.660 if (result == NULL) return false; 1.661 if (!result->is_double()) return false; 1.662 double old_value = result->get_double(); 1.663 result->set_double(*value); 1.664 *value = old_value; 1.665 - result->origin = origin; 1.666 + result->set_origin(origin); 1.667 return true; 1.668 } 1.669 1.670 -void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) { 1.671 +void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin) { 1.672 Flag* faddr = address_of_flag(flag); 1.673 guarantee(faddr != NULL && faddr->is_double(), "wrong flag type"); 1.674 faddr->set_double(value); 1.675 - faddr->origin = origin; 1.676 + faddr->set_origin(origin); 1.677 } 1.678 1.679 bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) { 1.680 @@ -518,7 +702,7 @@ 1.681 1.682 // Contract: Flag will make private copy of the incoming value. 1.683 // Outgoing value is always malloc-ed, and caller MUST call free. 1.684 -bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) { 1.685 +bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) { 1.686 Flag* result = Flag::find_flag(name, len); 1.687 if (result == NULL) return false; 1.688 if (!result->is_ccstr()) return false; 1.689 @@ -529,35 +713,35 @@ 1.690 strcpy(new_value, *value); 1.691 } 1.692 result->set_ccstr(new_value); 1.693 - if (result->origin == DEFAULT && old_value != NULL) { 1.694 + if (result->is_default() && old_value != NULL) { 1.695 // Prior value is NOT heap allocated, but was a literal constant. 1.696 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1, mtInternal); 1.697 strcpy(old_value_to_free, old_value); 1.698 old_value = old_value_to_free; 1.699 } 1.700 *value = old_value; 1.701 - result->origin = origin; 1.702 + result->set_origin(origin); 1.703 return true; 1.704 } 1.705 1.706 // Contract: Flag will make private copy of the incoming value. 1.707 -void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) { 1.708 +void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin) { 1.709 Flag* faddr = address_of_flag(flag); 1.710 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); 1.711 ccstr old_value = faddr->get_ccstr(); 1.712 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal); 1.713 strcpy(new_value, value); 1.714 faddr->set_ccstr(new_value); 1.715 - if (faddr->origin != DEFAULT && old_value != NULL) { 1.716 + if (!faddr->is_default() && old_value != NULL) { 1.717 // Prior value is heap allocated so free it. 1.718 FREE_C_HEAP_ARRAY(char, old_value, mtInternal); 1.719 } 1.720 - faddr->origin = origin; 1.721 + faddr->set_origin(origin); 1.722 } 1.723 1.724 extern "C" { 1.725 static int compare_flags(const void* void_a, const void* void_b) { 1.726 - return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name); 1.727 + return strcmp((*((Flag**) void_a))->_name, (*((Flag**) void_b))->_name); 1.728 } 1.729 } 1.730 1.731 @@ -566,20 +750,19 @@ 1.732 // note: this method is called before the thread structure is in place 1.733 // which means resource allocation cannot be used. 1.734 1.735 - // Compute size 1.736 - int length= 0; 1.737 - while (flagTable[length].name != NULL) length++; 1.738 + // The last entry is the null entry. 1.739 + const size_t length = Flag::numFlags - 1; 1.740 1.741 // Sort 1.742 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); 1.743 - for (int index = 0; index < length; index++) { 1.744 - array[index] = &flagTable[index]; 1.745 + for (size_t i = 0; i < length; i++) { 1.746 + array[i] = &flagTable[i]; 1.747 } 1.748 qsort(array, length, sizeof(Flag*), compare_flags); 1.749 1.750 // Print 1.751 - for (int i = 0; i < length; i++) { 1.752 - if (array[i]->origin /* naked field! */) { 1.753 + for (size_t i = 0; i < length; i++) { 1.754 + if (array[i]->get_origin() /* naked field! */) { 1.755 array[i]->print_as_flag(out); 1.756 out->print(" "); 1.757 } 1.758 @@ -602,20 +785,19 @@ 1.759 // note: this method is called before the thread structure is in place 1.760 // which means resource allocation cannot be used. 1.761 1.762 - // Compute size 1.763 - int length= 0; 1.764 - while (flagTable[length].name != NULL) length++; 1.765 + // The last entry is the null entry. 1.766 + const size_t length = Flag::numFlags - 1; 1.767 1.768 // Sort 1.769 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); 1.770 - for (int index = 0; index < length; index++) { 1.771 - array[index] = &flagTable[index]; 1.772 + for (size_t i = 0; i < length; i++) { 1.773 + array[i] = &flagTable[i]; 1.774 } 1.775 qsort(array, length, sizeof(Flag*), compare_flags); 1.776 1.777 // Print 1.778 out->print_cr("[Global flags]"); 1.779 - for (int i = 0; i < length; i++) { 1.780 + for (size_t i = 0; i < length; i++) { 1.781 if (array[i]->is_unlocked()) { 1.782 array[i]->print_on(out, withComments); 1.783 }