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.san...@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.san...@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.san...@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 } } } } } */ /* { 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 () +{ +} -- 2.13.3