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"
 



Reply via email to