Hi. The patch makes clear we'll not diverge number of elements in processor_names and the corresponding enum. Plus I fixed -march=znver2 native as valid options that were not listed.
Patch survives tests and bootstrap on x86_64-linux-gnu. Ready for trunk? Martin gcc/ChangeLog: 2018-11-22 Martin Liska <mli...@suse.cz> * common/config/i386/i386-common.c (processor_names): Add static assert and add missing "znver2". (ix86_get_valid_option_values): Add checking assert for null values and add "native" value if feasible. * config/i386/i386.h: Do not declare size of processor_names. --- gcc/common/config/i386/i386-common.c | 26 ++++++++++++++++++++++---- gcc/config/i386/i386.h | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c index 1017147599c..3deac94a879 100644 --- a/gcc/common/config/i386/i386-common.c +++ b/gcc/common/config/i386/i386-common.c @@ -1478,7 +1478,7 @@ i386_except_unwind_info (struct gcc_options *opts) #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack /* This table must be in sync with enum processor_type in i386.h. */ -const char *const processor_names[PROCESSOR_max] = +const char *const processor_names[] = { "generic", "i386", @@ -1516,9 +1516,14 @@ const char *const processor_names[PROCESSOR_max] = "bdver4", "btver1", "btver2", - "znver1" + "znver1", + "znver2" }; +/* Guarantee that the array is aligned with henum processor_type. */ +STATIC_ASSERT ((sizeof (processor_names) / sizeof (processor_names[0]) + == PROCESSOR_max)); + const pta processor_alias_table[] = { {"i386", PROCESSOR_I386, CPU_NONE, 0}, @@ -1734,11 +1739,24 @@ ix86_get_valid_option_values (int option_code, { case OPT_march_: for (unsigned i = 0; i < pta_size; i++) - v.safe_push (processor_alias_table[i].name); + { + const char *name = processor_alias_table[i].name; + gcc_checking_assert (name != NULL); + v.safe_push (name); + } +#ifdef HAVE_LOCAL_CPU_DETECT + /* Add also "native" as possible value. */ + v.safe_push ("native"); +#endif + break; case OPT_mtune_: for (unsigned i = 0; i < PROCESSOR_max; i++) - v.safe_push (processor_names[i]); + { + const char *name = processor_names[i]; + gcc_checking_assert (name != NULL); + v.safe_push (name); + } break; default: break; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 813c86dbdfa..b9e726e3d24 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2279,7 +2279,7 @@ enum processor_type }; #if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS) -extern const char *const processor_names[PROCESSOR_max]; +extern const char *const processor_names[]; #include "wide-int-bitmask.h"