[i386,testsuite,PR,71958] Error on -mx32 with -mabi=ms

Message ID 20170811212744.30180-1-daniel.santos@pobox.com
State New
Headers show

Commit Message

Daniel Santos Aug. 11, 2017, 9:27 p.m.
We currently error when -mx32 -mabi=sysv and we encounter a function
with attribute ms_abi, but we are not erroring on -mx32 and -mabi=ms
(either explicitly or when it is the default on Windows).  In fact, it
generates code that runs, but is of an undfined ABI.

I'm running -m64 and -m32 tests now and will run x32 tests when those
are done.  Presuming that I've corrected all existing tests that do not
filter out x32 target and there are no additional failures, is this OK
for head?

Thanks,
Daniel

gcc/ChangeLog:
2017-08-11  Daniel Santos  <daniel.santos@pobox.com>

	* config/i386/i386.c (ix86_option_override_internal): Modify.
	(ix86_function_type_abi): Likewise.

gcc/testsuite/ChangeLog:
2017-08-11  Daniel Santos  <daniel.santos@pobox.com>

	* gcc.target/i386/pr71958.c: New test.
 	* gcc.target/i386/pr64409.c: Modify to skip on Windows.
	* gcc.target/i386/pr46470.c: Modify to skip x32 target.
 	* gcc.target/i386/pr66275.c: Likewise.
 	* gcc.target/i386/pr68018.c: Likewise.

Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
---
 gcc/config/i386/i386.c                  | 11 +++++++++--
 gcc/testsuite/gcc.target/i386/pr46470.c |  2 +-
 gcc/testsuite/gcc.target/i386/pr64409.c |  3 ++-
 gcc/testsuite/gcc.target/i386/pr66275.c |  2 +-
 gcc/testsuite/gcc.target/i386/pr68018.c |  2 +-
 gcc/testsuite/gcc.target/i386/pr71958.c |  8 ++++++++
 6 files changed, 22 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr71958.c

Comments

Uros Bizjak Aug. 12, 2017, 8:21 a.m. | #1
On Fri, Aug 11, 2017 at 11:27 PM, Daniel Santos <daniel.santos@pobox.com> wrote:
> We currently error when -mx32 -mabi=sysv and we encounter a function
> with attribute ms_abi, but we are not erroring on -mx32 and -mabi=ms
> (either explicitly or when it is the default on Windows).  In fact, it
> generates code that runs, but is of an undfined ABI.
>
> I'm running -m64 and -m32 tests now and will run x32 tests when those
> are done.  Presuming that I've corrected all existing tests that do not
> filter out x32 target and there are no additional failures, is this OK
> for head?
>
> Thanks,
> Daniel
>
> gcc/ChangeLog:
> 2017-08-11  Daniel Santos  <daniel.santos@pobox.com>
>
>         * config/i386/i386.c (ix86_option_override_internal): Modify.
>         (ix86_function_type_abi): Likewise.
>
> gcc/testsuite/ChangeLog:
> 2017-08-11  Daniel Santos  <daniel.santos@pobox.com>
>
>         * gcc.target/i386/pr71958.c: New test.
>         * gcc.target/i386/pr64409.c: Modify to skip on Windows.
>         * gcc.target/i386/pr46470.c: Modify to skip x32 target.
>         * gcc.target/i386/pr66275.c: Likewise.
>         * gcc.target/i386/pr68018.c: Likewise.
>
> Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
> ---
>  gcc/config/i386/i386.c                  | 11 +++++++++--
>  gcc/testsuite/gcc.target/i386/pr46470.c |  2 +-
>  gcc/testsuite/gcc.target/i386/pr64409.c |  3 ++-
>  gcc/testsuite/gcc.target/i386/pr66275.c |  2 +-
>  gcc/testsuite/gcc.target/i386/pr68018.c |  2 +-
>  gcc/testsuite/gcc.target/i386/pr71958.c |  8 ++++++++
>  6 files changed, 22 insertions(+), 6 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr71958.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index b04321a8d40..311a52c2a1f 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -5585,6 +5585,9 @@ ix86_option_override_internal (bool main_args_p,
>
>    if (TARGET_X32_P (opts->x_ix86_isa_flags))
>      {
> +      if (opts_set->x_ix86_abi == MS_ABI)
> +       error ("-mx32 not supported with -mabi=ms");
> +
>        /* Always turn on OPTION_MASK_ISA_64BIT and turn off
>          OPTION_MASK_ABI_64 for TARGET_X32.  */
>        opts->x_ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
> @@ -8777,8 +8780,12 @@ ix86_function_type_abi (const_tree fntype)
>    if (abi == SYSV_ABI
>        && lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
>      {
> -      if (TARGET_X32)
> -       error ("X32 does not support ms_abi attribute");
> +      static int warned;
> +      if (TARGET_X32 && !warned)
> +       {
> +         error ("X32 does not support ms_abi attribute");
> +         warned = 1;
> +       }
>
>        abi = MS_ABI;
>      }
> diff --git a/gcc/testsuite/gcc.target/i386/pr46470.c b/gcc/testsuite/gcc.target/i386/pr46470.c
> index 9e8e731188e..c66a378a1ad 100644
> --- a/gcc/testsuite/gcc.target/i386/pr46470.c
> +++ b/gcc/testsuite/gcc.target/i386/pr46470.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile } */
> +/* { dg-do compile { target { ! x32 } } } */
>  /* The pic register save adds unavoidable stack pointer references.  */
>  /* { dg-skip-if "" { ia32 && { ! nonpic } } } */
>  /* These options are selected to ensure 1 word needs to be allocated
> diff --git a/gcc/testsuite/gcc.target/i386/pr64409.c b/gcc/testsuite/gcc.target/i386/pr64409.c
> index 917472653f4..3dbd9a09f01 100644
> --- a/gcc/testsuite/gcc.target/i386/pr64409.c
> +++ b/gcc/testsuite/gcc.target/i386/pr64409.c
> @@ -1,6 +1,7 @@
>  /* { dg-do compile { target { ! ia32 } } } */
>  /* { dg-require-effective-target maybe_x32 } */
>  /* { dg-options "-O0 -mx32" } */
> +/* { xfail { "*-*-cygwin* *-*-mingw*" } } */
>
>  int a;
> -int* __attribute__ ((ms_abi)) fn1 () { return &a; } /* { dg-error "X32 does not support ms_abi attribute" } */
> +int* __attribute__ ((ms_abi)) fn1 () { return &a; } /* { dg-error "X32 does not support ms_abi attribute" { target { ! "*-*-mingw* *-*-cygwin*" } } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr66275.c b/gcc/testsuite/gcc.target/i386/pr66275.c
> index b8759aeb5ec..a1271857f6a 100644
> --- a/gcc/testsuite/gcc.target/i386/pr66275.c
> +++ b/gcc/testsuite/gcc.target/i386/pr66275.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-do compile { target { *-*-linux* && { ! { ia32 || x32 } } } } } */

"! { ia32 || x32 }" should be replaced with lp64.

>  /* { dg-options "-mabi=ms -fdump-rtl-dfinit" } */
>
>  void
> diff --git a/gcc/testsuite/gcc.target/i386/pr68018.c b/gcc/testsuite/gcc.target/i386/pr68018.c
> index a0fa21e0b00..871fdddf643 100644
> --- a/gcc/testsuite/gcc.target/i386/pr68018.c
> +++ b/gcc/testsuite/gcc.target/i386/pr68018.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-do compile { target { *-*-linux* && { ! { ia32 || x32 } } } } } */

Also here.

>  /* { dg-options "-O -mabi=ms -mstackrealign" } */
>
>  typedef float V __attribute__ ((vector_size (16)));
> diff --git a/gcc/testsuite/gcc.target/i386/pr71958.c b/gcc/testsuite/gcc.target/i386/pr71958.c
> new file mode 100644
> index 00000000000..090d1970ca9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr71958.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mx32 -mabi=ms" } */
> +/* { dg-require-effective-target maybe_x32 } */

The above is not needed for compile tests.

> +/* { dg-excess-errors "not supported" } */

For expected errors, you should use dg-error.

Uros.

> +
> +void main ()
> +{
> +}
> --
> 2.13.3
>
Rainer Orth Aug. 12, 2017, 2:16 p.m. | #2
Hi Daniel,

> We currently error when -mx32 -mabi=sysv and we encounter a function
> with attribute ms_abi, but we are not erroring on -mx32 and -mabi=ms
> (either explicitly or when it is the default on Windows).  In fact, it
> generates code that runs, but is of an undfined ABI.
>
> I'm running -m64 and -m32 tests now and will run x32 tests when those
> are done.  Presuming that I've corrected all existing tests that do not
> filter out x32 target and there are no additional failures, is this OK
> for head?
>
> Thanks,
> Daniel
>
> gcc/ChangeLog:
> 2017-08-11  Daniel Santos  <daniel.santos@pobox.com>
>
> 	* config/i386/i386.c (ix86_option_override_internal): Modify.
> 	(ix86_function_type_abi): Likewise.

those entries are pretty useless as they stand: you should state *what*
you changed.

	Rainer

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b04321a8d40..311a52c2a1f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -5585,6 +5585,9 @@  ix86_option_override_internal (bool main_args_p,
 
   if (TARGET_X32_P (opts->x_ix86_isa_flags))
     {
+      if (opts_set->x_ix86_abi == MS_ABI)
+	error ("-mx32 not supported with -mabi=ms");
+
       /* Always turn on OPTION_MASK_ISA_64BIT and turn off
 	 OPTION_MASK_ABI_64 for TARGET_X32.  */
       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
@@ -8777,8 +8780,12 @@  ix86_function_type_abi (const_tree fntype)
   if (abi == SYSV_ABI
       && lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
     {
-      if (TARGET_X32)
-	error ("X32 does not support ms_abi attribute");
+      static int warned;
+      if (TARGET_X32 && !warned)
+	{
+	  error ("X32 does not support ms_abi attribute");
+	  warned = 1;
+	}
 
       abi = MS_ABI;
     }
diff --git a/gcc/testsuite/gcc.target/i386/pr46470.c b/gcc/testsuite/gcc.target/i386/pr46470.c
index 9e8e731188e..c66a378a1ad 100644
--- a/gcc/testsuite/gcc.target/i386/pr46470.c
+++ b/gcc/testsuite/gcc.target/i386/pr46470.c
@@ -1,4 +1,4 @@ 
-/* { dg-do compile } */
+/* { dg-do compile { target { ! x32 } } } */
 /* The pic register save adds unavoidable stack pointer references.  */
 /* { dg-skip-if "" { ia32 && { ! nonpic } } } */
 /* These options are selected to ensure 1 word needs to be allocated
diff --git a/gcc/testsuite/gcc.target/i386/pr64409.c b/gcc/testsuite/gcc.target/i386/pr64409.c
index 917472653f4..3dbd9a09f01 100644
--- a/gcc/testsuite/gcc.target/i386/pr64409.c
+++ b/gcc/testsuite/gcc.target/i386/pr64409.c
@@ -1,6 +1,7 @@ 
 /* { dg-do compile { target { ! ia32 } } } */
 /* { dg-require-effective-target maybe_x32 } */
 /* { dg-options "-O0 -mx32" } */
+/* { xfail { "*-*-cygwin* *-*-mingw*" } } */
 
 int a;
-int* __attribute__ ((ms_abi)) fn1 () { return &a; } /* { dg-error "X32 does not support ms_abi attribute" } */
+int* __attribute__ ((ms_abi)) fn1 () { return &a; } /* { dg-error "X32 does not support ms_abi attribute" { target { ! "*-*-mingw* *-*-cygwin*" } } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr66275.c b/gcc/testsuite/gcc.target/i386/pr66275.c
index b8759aeb5ec..a1271857f6a 100644
--- a/gcc/testsuite/gcc.target/i386/pr66275.c
+++ b/gcc/testsuite/gcc.target/i386/pr66275.c
@@ -1,4 +1,4 @@ 
-/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+/* { dg-do compile { target { *-*-linux* && { ! { ia32 || x32 } } } } } */
 /* { dg-options "-mabi=ms -fdump-rtl-dfinit" } */
 
 void
diff --git a/gcc/testsuite/gcc.target/i386/pr68018.c b/gcc/testsuite/gcc.target/i386/pr68018.c
index a0fa21e0b00..871fdddf643 100644
--- a/gcc/testsuite/gcc.target/i386/pr68018.c
+++ b/gcc/testsuite/gcc.target/i386/pr68018.c
@@ -1,4 +1,4 @@ 
-/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+/* { dg-do compile { target { *-*-linux* && { ! { ia32 || x32 } } } } } */
 /* { dg-options "-O -mabi=ms -mstackrealign" } */
 
 typedef float V __attribute__ ((vector_size (16)));
diff --git a/gcc/testsuite/gcc.target/i386/pr71958.c b/gcc/testsuite/gcc.target/i386/pr71958.c
new file mode 100644
index 00000000000..090d1970ca9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr71958.c
@@ -0,0 +1,8 @@ 
+/* { dg-do compile } */
+/* { dg-options "-mx32 -mabi=ms" } */
+/* { dg-require-effective-target maybe_x32 } */
+/* { dg-excess-errors "not supported" } */
+
+void main ()
+{
+}