Properly align stack in gcc.target/i386/cleanup-[12].c
authorH.J. Lu <hjl@gcc.gnu.org>
Wed, 30 Mar 2016 12:37:37 +0000 (05:37 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 30 Mar 2016 12:37:37 +0000 (05:37 -0700)
PR testsuite/70364
* gcc.target/i386/cleanup-1.c: Include <stddef.h>.
(check): New function.
(bar): Call check.
(foo): Align stack to 16 bytes when calling bar.
* gcc.target/i386/cleanup-2.c: Likewise.

From-SVN: r234557

gcc/testsuite/gcc.target/i386/cleanup-1.c
gcc/testsuite/gcc.target/i386/cleanup-2.c

index fc82f35a0abeecbf0f5c0ae89b3d13d4a2b3c0b4..dcfcc4edb5fa992019f59f431c24c2375039f1f3 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <unwind.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -47,6 +48,14 @@ handler (void *p __attribute__((unused)))
   _exit (0);
 }
 
+static void
+__attribute__((noinline))
+check (intptr_t p)
+{
+  if ((p & 15) != 0)
+    abort ();
+}
+
 static int __attribute__((noinline))
 fn5 (void)
 {
@@ -59,6 +68,8 @@ void
 bar (void)
 {
   char dummy __attribute__((cleanup (counter)));
+  unsigned long tmp[4] __attribute__((aligned(16)));
+  check ((intptr_t) tmp);
   fn5 ();
 }
 
@@ -133,9 +144,9 @@ foo (int x)
        ".type  _L_mutex_lock_%=, @function\n"
 "_L_mutex_lock_%=:\n"
 "1:\t" "leaq   %1, %%rdi\n"
-"2:\t" "subq   $128, %%rsp\n"
+"2:\t" "subq   $136, %%rsp\n"
 "3:\t" "call   bar\n"
-"4:\t" "addq   $128, %%rsp\n"
+"4:\t" "addq   $136, %%rsp\n"
 "5:\t" "jmp    24f\n"
 "6:\t" ".size _L_mutex_lock_%=, .-_L_mutex_lock_%=\n\t"
        ".previous\n\t"
@@ -179,7 +190,7 @@ foo (int x)
        ".sleb128 4b-3b\n"
 "16:\t"        ".byte  0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t"
        ".byte  0x0e    # DW_CFA_def_cfa_offset\n\t"
-       ".uleb128 128\n\t"
+       ".uleb128 136\n\t"
        ".byte  0x16    # DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 20f-17f\n"
index 0ec7c3182adbb0cd67e78fc06ed85ddf605a6c09..7e60323373b8553e78dafdbe1f19b2a97eb2ef07 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <unwind.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -47,6 +48,14 @@ handler (void *p __attribute__((unused)))
   _exit (0);
 }
 
+static void
+__attribute__((noinline))
+check (intptr_t p)
+{
+  if ((p & 15) != 0)
+    abort ();
+}
+
 static int __attribute__((noinline))
 fn5 (void)
 {
@@ -59,6 +68,8 @@ void
 bar (void)
 {
   char dummy __attribute__((cleanup (counter)));
+  unsigned long tmp[4] __attribute__((aligned(16)));
+  check ((intptr_t) tmp);
   fn5 ();
 }
 
@@ -74,9 +85,9 @@ foo (int x)
        ".type  _L_mutex_lock_%=, @function\n"
 "_L_mutex_lock_%=:\n"
 "1:\t" "leaq   %1, %%rdi\n"
-"2:\t" "subq   $128, %%rsp\n"
+"2:\t" "subq   $136, %%rsp\n"
 "3:\t" "call   bar\n"
-"4:\t" "addq   $128, %%rsp\n"
+"4:\t" "addq   $136, %%rsp\n"
 "5:\t" "jmp    21f\n"
 "6:\t" ".size _L_mutex_lock_%=, .-_L_mutex_lock_%=\n\t"
        ".previous\n\t"
@@ -160,7 +171,7 @@ foo (int x)
        ".uleb128 6b-5b-1\n"
 "19:\t"        ".byte  0x40 + (3b-1b) # DW_CFA_advance_loc\n\t"
        ".byte  0xe     # DW_CFA_def_cfa_offset\n\t"
-       ".uleb128 128\n\t"
+       ".uleb128 136\n\t"
        ".byte  0x40 + (5b-3b) # DW_CFA_advance_loc\n\t"
        ".byte  0xe     # DW_CFA_def_cfa_offset\n\t"
        ".uleb128 0\n\t"