i386: fix -march=amd crash

Message ID ef65b440-7973-990d-0c4d-ec9c87409155@suse.cz
State New
Headers show
Series
  • i386: fix -march=amd crash
Related show

Commit Message

Martin Liška March 24, 2021, 6:37 p.m.
It started with g:3e2ae3ee285a57455d5a23bd352a68c289130186 where
new entry was added to processor_alias_table after generic node:

+  {"amdfam19h", PROCESSOR_GENERIC, CPU_GENERIC, 0,
+    M_CPU_TYPE (AMDFAM19H), P_NONE},

and then the following is violated:

/* NB: processor_alias_table stops at the "generic" entry.  */

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

	PR target/99753
	* common/config/i386/i386-common.c (ARRAY_SIZE): Fix off-by-one
	error.
	* config/i386/i386-options.c (ix86_option_override_internal):
	Add run-time assert.

gcc/testsuite/ChangeLog:

	PR target/99753
	* gcc.target/i386/pr99753.c: New test.
---
  gcc/common/config/i386/i386-common.c    | 2 +-
  gcc/config/i386/i386-options.c          | 3 +++
  gcc/testsuite/gcc.target/i386/pr99753.c | 5 +++++
  3 files changed, 9 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/gcc.target/i386/pr99753.c

-- 
2.30.2

Comments

Jan Hubicka March 24, 2021, 7:38 p.m. | #1
> It started with g:3e2ae3ee285a57455d5a23bd352a68c289130186 where

> new entry was added to processor_alias_table after generic node:

> 

> +  {"amdfam19h", PROCESSOR_GENERIC, CPU_GENERIC, 0,

> +    M_CPU_TYPE (AMDFAM19H), P_NONE},

> 

> and then the following is violated:

> 

> /* NB: processor_alias_table stops at the "generic" entry.  */

> 

> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

> 

> Ready to be installed?

OK, thanks!
Honza
> Thanks,

> Martin

> 

> gcc/ChangeLog:

> 

> 	PR target/99753

> 	* common/config/i386/i386-common.c (ARRAY_SIZE): Fix off-by-one

> 	error.

> 	* config/i386/i386-options.c (ix86_option_override_internal):

> 	Add run-time assert.

> 

> gcc/testsuite/ChangeLog:

> 

> 	PR target/99753

> 	* gcc.target/i386/pr99753.c: New test.

> ---

>  gcc/common/config/i386/i386-common.c    | 2 +-

>  gcc/config/i386/i386-options.c          | 3 +++

>  gcc/testsuite/gcc.target/i386/pr99753.c | 5 +++++

>  3 files changed, 9 insertions(+), 1 deletion(-)

>  create mode 100644 gcc/testsuite/gcc.target/i386/pr99753.c

> 

> diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c

> index eea8af12f48..b89183b830e 100644

> --- a/gcc/common/config/i386/i386-common.c

> +++ b/gcc/common/config/i386/i386-common.c

> @@ -2051,7 +2051,7 @@ const pta processor_alias_table[] =

>  };

>  /* NB: processor_alias_table stops at the "generic" entry.  */

> -unsigned int const pta_size = ARRAY_SIZE (processor_alias_table) - 6;

> +unsigned int const pta_size = ARRAY_SIZE (processor_alias_table) - 7;

>  unsigned int const num_arch_names = ARRAY_SIZE (processor_alias_table);

>  /* Provide valid option values for -march and -mtune options.  */

> diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c

> index b653527d266..88d5e717f26 100644

> --- a/gcc/config/i386/i386-options.c

> +++ b/gcc/config/i386/i386-options.c

> @@ -2042,6 +2042,9 @@ ix86_option_override_internal (bool main_args_p,

>      sorry ("%i-bit mode not compiled in",

>  	   (opts->x_ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);

> +  /* Last processor_alias_table must point to "generic" entry.  */

> +  gcc_checking_assert (strcmp (processor_alias_table[pta_size - 1].name,

> +			       "generic") == 0);

>    for (i = 0; i < pta_size; i++)

>      if (! strcmp (opts->x_ix86_arch_string, processor_alias_table[i].name))

>        {

> diff --git a/gcc/testsuite/gcc.target/i386/pr99753.c b/gcc/testsuite/gcc.target/i386/pr99753.c

> new file mode 100644

> index 00000000000..3def1fd7481

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/i386/pr99753.c

> @@ -0,0 +1,5 @@

> +/* PR target/99753 */

> +

> +/* { dg-do compile } */

> +/* { dg-options "-march=amd -m32" } */

> +/* { dg-error "bad value .'amd'. for '-march=' switch"  "" { target *-*-* } 0 } */

> -- 

> 2.30.2

>

Patch

diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c
index eea8af12f48..b89183b830e 100644
--- a/gcc/common/config/i386/i386-common.c
+++ b/gcc/common/config/i386/i386-common.c
@@ -2051,7 +2051,7 @@  const pta processor_alias_table[] =
  };
  
  /* NB: processor_alias_table stops at the "generic" entry.  */
-unsigned int const pta_size = ARRAY_SIZE (processor_alias_table) - 6;
+unsigned int const pta_size = ARRAY_SIZE (processor_alias_table) - 7;
  unsigned int const num_arch_names = ARRAY_SIZE (processor_alias_table);
  
  /* Provide valid option values for -march and -mtune options.  */
diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
index b653527d266..88d5e717f26 100644
--- a/gcc/config/i386/i386-options.c
+++ b/gcc/config/i386/i386-options.c
@@ -2042,6 +2042,9 @@  ix86_option_override_internal (bool main_args_p,
      sorry ("%i-bit mode not compiled in",
  	   (opts->x_ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
  
+  /* Last processor_alias_table must point to "generic" entry.  */
+  gcc_checking_assert (strcmp (processor_alias_table[pta_size - 1].name,
+			       "generic") == 0);
    for (i = 0; i < pta_size; i++)
      if (! strcmp (opts->x_ix86_arch_string, processor_alias_table[i].name))
        {
diff --git a/gcc/testsuite/gcc.target/i386/pr99753.c b/gcc/testsuite/gcc.target/i386/pr99753.c
new file mode 100644
index 00000000000..3def1fd7481
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr99753.c
@@ -0,0 +1,5 @@ 
+/* PR target/99753 */
+
+/* { dg-do compile } */
+/* { dg-options "-march=amd -m32" } */
+/* { dg-error "bad value .'amd'. for '-march=' switch"  "" { target *-*-* } 0 } */