Hello!

Attached patch fixes PR87928, where we ICE in ix86_compute_frame_layout in

  gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);

when __attribute__ ((sysv_abi) is used. When the testcase is compiled,
ix86_cfun_abi () returns SYSV_ABI due to function __attribute__
override, while ix86_abi returns MS_ABI. These ABIs have different
STACK_BOUNDARY definition, so we compare preferred_alignment with
wrong STACK boundary definition.

Attached patch makes STACK_BOUNDARY dependant on function ABI attribute.

2018-11-09  Uros Bizjak  <ubiz...@gmail.com>

    PR target/87928
    * config/i386/i386.h (STACK_BOUNDARY): Use TARGET_64BIT_MS_ABI
    instead of (TARGET_64BIT && ix86_abi == MS_ABI).
    * config/i386/darwin.h (STACK_BOUNDARY): Ditto.
    * config/i386/cygming.h (STACK_BOUNDARY): Remove.

testsuite /Changelog:

2018-11-09  Uros Bizjak  <ubiz...@gmail.com>

    PR target/87928
    * gcc.target/i386/pr87928.c: New test.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

I will commit the patch to mainline SVN early next week to allow
Darwin and Ming/Cygwin maintainers some time to test the patch on
their targets.

Uros.
Index: config/i386/cygming.h
===================================================================
--- config/i386/cygming.h       (revision 265930)
+++ config/i386/cygming.h       (working copy)
@@ -268,9 +268,6 @@
    bytes in one go.  */
 #define CHECK_STACK_LIMIT 4000
 
-#undef STACK_BOUNDARY
-#define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : 
BITS_PER_WORD)
-
 /* By default, target has a 80387, uses IEEE compatible arithmetic,
    returns float values in the 387 and needs stack probes.
    We also align doubles to 64-bits for MSVC default compatibility.  */
Index: config/i386/darwin.h
===================================================================
--- config/i386/darwin.h        (revision 265930)
+++ config/i386/darwin.h        (working copy)
@@ -113,8 +113,7 @@
    or dynamic loader.  */
 #undef STACK_BOUNDARY
 #define STACK_BOUNDARY \
- ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \
-  ? 128 : BITS_PER_WORD)
+  ((profile_flag || TARGET_64BIT_MS_ABI) ? 128 : BITS_PER_WORD)
 
 #undef MAIN_STACK_BOUNDARY
 #define MAIN_STACK_BOUNDARY 128
Index: config/i386/i386.h
===================================================================
--- config/i386/i386.h  (revision 265930)
+++ config/i386/i386.h  (working copy)
@@ -807,8 +807,7 @@
 #define PARM_BOUNDARY BITS_PER_WORD
 
 /* Boundary (in *bits*) on which stack pointer should be aligned.  */
-#define STACK_BOUNDARY \
- (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
+#define STACK_BOUNDARY (TARGET_64BIT_MS_ABI ? 128 : BITS_PER_WORD)
 
 /* Stack boundary of the main function guaranteed by OS.  */
 #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
Index: testsuite/gcc.target/i386/pr87928.c
===================================================================
--- testsuite/gcc.target/i386/pr87928.c (nonexistent)
+++ testsuite/gcc.target/i386/pr87928.c (working copy)
@@ -0,0 +1,23 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O1 -mstackrealign -mabi=ms" } */
+
+struct foo
+{
+  int a;
+  int b;
+  int c;
+  int d;
+};
+
+__attribute__ ((sysv_abi))
+struct foo bar (void)
+{
+  struct foo retval;
+
+  retval.a = 1;
+  retval.b = 2;
+  retval.c = 3;
+  retval.d = 4;
+
+  return retval;
+}

Reply via email to