mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 06:14:49 +02:00
6979444: add command line option to print command line flags descriptions
Implementation of a nonproduct boolean flag XX:PrintFlagsWithComments Reviewed-by: kamg, dholmes, dsamersoff
This commit is contained in:
parent
d7850a0df7
commit
5d5bcb4bca
4 changed files with 72 additions and 49 deletions
|
@ -2855,6 +2855,13 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
|
||||||
CommandLineFlags::printFlags();
|
CommandLineFlags::printFlags();
|
||||||
vm_exit(0);
|
vm_exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
|
if (match_option(option, "-XX:+PrintFlagsWithComments", &tail)) {
|
||||||
|
CommandLineFlags::printFlags(true);
|
||||||
|
vm_exit(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IgnoreUnrecognizedVMOptions) {
|
if (IgnoreUnrecognizedVMOptions) {
|
||||||
|
|
|
@ -68,12 +68,14 @@ bool Flag::is_external() const {
|
||||||
// Length of format string (e.g. "%.1234s") for printing ccstr below
|
// Length of format string (e.g. "%.1234s") for printing ccstr below
|
||||||
#define FORMAT_BUFFER_LEN 16
|
#define FORMAT_BUFFER_LEN 16
|
||||||
|
|
||||||
void Flag::print_on(outputStream* st) {
|
void Flag::print_on(outputStream* st, bool withComments) {
|
||||||
st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
|
st->print("%9s %-40s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
|
||||||
if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
|
if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
|
||||||
if (is_intx()) st->print("%-16ld", get_intx());
|
if (is_intx()) st->print("%-16ld", get_intx());
|
||||||
if (is_uintx()) st->print("%-16lu", get_uintx());
|
if (is_uintx()) st->print("%-16lu", get_uintx());
|
||||||
if (is_uint64_t()) st->print("%-16lu", get_uint64_t());
|
if (is_uint64_t()) st->print("%-16lu", get_uint64_t());
|
||||||
|
if (is_double()) st->print("%-16f", get_double());
|
||||||
|
|
||||||
if (is_ccstr()) {
|
if (is_ccstr()) {
|
||||||
const char* cp = get_ccstr();
|
const char* cp = get_ccstr();
|
||||||
if (cp != NULL) {
|
if (cp != NULL) {
|
||||||
|
@ -90,8 +92,14 @@ void Flag::print_on(outputStream* st) {
|
||||||
}
|
}
|
||||||
st->print("%-16s", cp);
|
st->print("%-16s", cp);
|
||||||
}
|
}
|
||||||
|
else st->print("%-16s", "");
|
||||||
|
}
|
||||||
|
st->print("%-20s", kind);
|
||||||
|
if (withComments) {
|
||||||
|
#ifndef PRODUCT
|
||||||
|
st->print("%s", doc );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
st->print(" %s", kind);
|
|
||||||
st->cr();
|
st->cr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,67 +139,67 @@ void Flag::print_as_flag(outputStream* st) {
|
||||||
// 4991491 do not "optimize out" the was_set false values: omitting them
|
// 4991491 do not "optimize out" the was_set false values: omitting them
|
||||||
// tickles a Microsoft compiler bug causing flagTable to be malformed
|
// tickles a Microsoft compiler bug causing flagTable to be malformed
|
||||||
|
|
||||||
#define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT },
|
#define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product}", DEFAULT },
|
||||||
#define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT },
|
#define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{pd product}", DEFAULT },
|
||||||
#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{diagnostic}", DEFAULT },
|
#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{diagnostic}", DEFAULT },
|
||||||
#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{experimental}", DEFAULT },
|
#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{experimental}", DEFAULT },
|
||||||
#define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT },
|
#define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{manageable}", DEFAULT },
|
||||||
#define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT },
|
#define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product rw}", DEFAULT },
|
||||||
|
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
#define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
#define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||||
#define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
#define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
||||||
#define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
#define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
||||||
#else
|
#else
|
||||||
#define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT },
|
#define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "", DEFAULT },
|
||||||
#define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT },
|
#define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{pd}", DEFAULT },
|
||||||
#define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT },
|
#define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{notproduct}", DEFAULT },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{lp64_product}", DEFAULT },
|
#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{lp64_product}", DEFAULT },
|
||||||
#else
|
#else
|
||||||
#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||||
#endif // _LP64
|
#endif // _LP64
|
||||||
|
|
||||||
#define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT },
|
#define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 product}", DEFAULT },
|
||||||
#define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT },
|
#define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 pd product}", DEFAULT },
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
#define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
#define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||||
#define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
#define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
||||||
#define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
#define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
||||||
#else
|
#else
|
||||||
#define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT },
|
#define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1}", DEFAULT },
|
||||||
#define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT },
|
#define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C1 pd}", DEFAULT },
|
||||||
#define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT },
|
#define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1 notproduct}", DEFAULT },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT },
|
#define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 product}", DEFAULT },
|
||||||
#define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT },
|
#define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 pd product}", DEFAULT },
|
||||||
#define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT },
|
#define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 diagnostic}", DEFAULT },
|
||||||
#define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 experimental}", DEFAULT },
|
#define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 experimental}", DEFAULT },
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
#define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
#define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||||
#define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
#define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
||||||
#define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
#define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
||||||
#else
|
#else
|
||||||
#define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT },
|
#define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2}", DEFAULT },
|
||||||
#define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT },
|
#define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C2 pd}", DEFAULT },
|
||||||
#define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT },
|
#define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2 notproduct}", DEFAULT },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark product}", DEFAULT },
|
#define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark product}", DEFAULT },
|
||||||
#define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{Shark pd product}", DEFAULT },
|
#define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark pd product}", DEFAULT },
|
||||||
#define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark diagnostic}", DEFAULT },
|
#define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark diagnostic}", DEFAULT },
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
#define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
#define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||||
#define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
#define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
|
||||||
#define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
#define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
||||||
#else
|
#else
|
||||||
#define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark}", DEFAULT },
|
#define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark}", DEFAULT },
|
||||||
#define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{Shark pd}", DEFAULT },
|
#define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{Shark pd}", DEFAULT },
|
||||||
#define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{Shark notproduct}", DEFAULT },
|
#define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark notproduct}", DEFAULT },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static Flag flagTable[] = {
|
static Flag flagTable[] = {
|
||||||
|
@ -485,7 +493,7 @@ void CommandLineFlags::verify() {
|
||||||
|
|
||||||
#endif // PRODUCT
|
#endif // PRODUCT
|
||||||
|
|
||||||
void CommandLineFlags::printFlags() {
|
void CommandLineFlags::printFlags(bool withComments) {
|
||||||
// Print the flags sorted by name
|
// Print the flags sorted by name
|
||||||
// note: this method is called before the thread structure is in place
|
// note: this method is called before the thread structure is in place
|
||||||
// which means resource allocation cannot be used.
|
// which means resource allocation cannot be used.
|
||||||
|
@ -505,7 +513,7 @@ void CommandLineFlags::printFlags() {
|
||||||
tty->print_cr("[Global flags]");
|
tty->print_cr("[Global flags]");
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
if (array[i]->is_unlocked()) {
|
if (array[i]->is_unlocked()) {
|
||||||
array[i]->print_on(tty);
|
array[i]->print_on(tty, withComments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(Flag*, array);
|
FREE_C_HEAP_ARRAY(Flag*, array);
|
||||||
|
|
|
@ -90,6 +90,9 @@ struct Flag {
|
||||||
const char *type;
|
const char *type;
|
||||||
const char *name;
|
const char *name;
|
||||||
void* addr;
|
void* addr;
|
||||||
|
|
||||||
|
NOT_PRODUCT(const char *doc;)
|
||||||
|
|
||||||
const char *kind;
|
const char *kind;
|
||||||
FlagValueOrigin origin;
|
FlagValueOrigin origin;
|
||||||
|
|
||||||
|
@ -131,7 +134,7 @@ struct Flag {
|
||||||
bool is_writeable() const;
|
bool is_writeable() const;
|
||||||
bool is_external() const;
|
bool is_external() const;
|
||||||
|
|
||||||
void print_on(outputStream* st);
|
void print_on(outputStream* st, bool withComments = false );
|
||||||
void print_as_flag(outputStream* st);
|
void print_as_flag(outputStream* st);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -211,7 +214,7 @@ class CommandLineFlags {
|
||||||
static bool wasSetOnCmdline(const char* name, bool* value);
|
static bool wasSetOnCmdline(const char* name, bool* value);
|
||||||
static void printSetFlags();
|
static void printSetFlags();
|
||||||
|
|
||||||
static void printFlags();
|
static void printFlags(bool withComments = false );
|
||||||
|
|
||||||
static void verify() PRODUCT_RETURN;
|
static void verify() PRODUCT_RETURN;
|
||||||
};
|
};
|
||||||
|
@ -2406,6 +2409,9 @@ class CommandLineFlags {
|
||||||
product(bool, PrintFlagsFinal, false, \
|
product(bool, PrintFlagsFinal, false, \
|
||||||
"Print all VM flags after argument and ergonomic processing") \
|
"Print all VM flags after argument and ergonomic processing") \
|
||||||
\
|
\
|
||||||
|
notproduct(bool, PrintFlagsWithComments, false, \
|
||||||
|
"Print all VM flags with default values and descriptions and exit")\
|
||||||
|
\
|
||||||
diagnostic(bool, SerializeVMOutput, true, \
|
diagnostic(bool, SerializeVMOutput, true, \
|
||||||
"Use a mutex to serialize output to tty and hotspot.log") \
|
"Use a mutex to serialize output to tty and hotspot.log") \
|
||||||
\
|
\
|
||||||
|
|
|
@ -76,12 +76,14 @@
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
#define PRODUCT_ONLY(code) code
|
#define PRODUCT_ONLY(code) code
|
||||||
#define NOT_PRODUCT(code)
|
#define NOT_PRODUCT(code)
|
||||||
|
#define NOT_PRODUCT_ARG(arg)
|
||||||
#define PRODUCT_RETURN {}
|
#define PRODUCT_RETURN {}
|
||||||
#define PRODUCT_RETURN0 { return 0; }
|
#define PRODUCT_RETURN0 { return 0; }
|
||||||
#define PRODUCT_RETURN_(code) { code }
|
#define PRODUCT_RETURN_(code) { code }
|
||||||
#else // PRODUCT
|
#else // PRODUCT
|
||||||
#define PRODUCT_ONLY(code)
|
#define PRODUCT_ONLY(code)
|
||||||
#define NOT_PRODUCT(code) code
|
#define NOT_PRODUCT(code) code
|
||||||
|
#define NOT_PRODUCT_ARG(arg) arg,
|
||||||
#define PRODUCT_RETURN /*next token must be ;*/
|
#define PRODUCT_RETURN /*next token must be ;*/
|
||||||
#define PRODUCT_RETURN0 /*next token must be ;*/
|
#define PRODUCT_RETURN0 /*next token must be ;*/
|
||||||
#define PRODUCT_RETURN_(code) /*next token must be ;*/
|
#define PRODUCT_RETURN_(code) /*next token must be ;*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue