re PR target/25967 (Add attribute naked for x86)
authorUros Bizjak <ubizjak@gmail.com>
Mon, 31 Jul 2017 13:11:59 +0000 (15:11 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 31 Jul 2017 13:11:59 +0000 (15:11 +0200)
PR target/25967
* config/i386/i386.c (ix86_allocate_stack_slots_for_args):
New function.
(TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS): Define.

testsuite/ChangeLog:

PR target/25967
* gcc.target/i386/naked-3.c (dg-options): Use -O0.
(naked): Add attribute regparm(1) for x86_32 targets.
Add integer argument.  Remove global "data" variable.
(main): Pass integer argument to naked function.
* gcc.target/i386/naked-4.c: New test.

From-SVN: r250742

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/naked-3.c
gcc/testsuite/gcc.target/i386/naked-4.c [new file with mode: 0644]

index 27e4af12cbce6d73b9188d3fb958f927e3a9c144..27130e89b8f08d6c87e8bed40fdcef888b0b5b61 100644 (file)
@@ -1,3 +1,10 @@
+2017-07-31  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/25967
+       * config/i386/i386.c (ix86_allocate_stack_slots_for_args):
+       New function.
+       (TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS): Define.
+
 2017-07-31  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * config.gcc: Add z14.
index 9a35c995f26ab590b27ea7acde738e5539b9315b..29a6dc3af2b7c165efc77a12743a16da9d5d636a 100644 (file)
@@ -31675,6 +31675,13 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
 #endif
 }
 
+static bool
+ix86_allocate_stack_slots_for_args (void)
+{
+  /* Naked functions should not allocate stack slots for arguments.  */
+  return !ix86_function_naked (current_function_decl);
+}
+
 static bool
 ix86_warn_func_return (tree decl)
 {
@@ -52727,6 +52734,8 @@ ix86_run_selftests (void)
 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
 #undef TARGET_MUST_PASS_IN_STACK
 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
+#undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS
+#define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS ix86_allocate_stack_slots_for_args
 #undef TARGET_FUNCTION_ARG_ADVANCE
 #define TARGET_FUNCTION_ARG_ADVANCE ix86_function_arg_advance
 #undef TARGET_FUNCTION_ARG
index 7243fdf337208a456b1512db7f10a3144b91e6c8..7edb3a304812c6c334fdd9fceb9ac23b4046c489 100644 (file)
@@ -1,3 +1,12 @@
+2017-07-31  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/25967
+       * gcc.target/i386/naked-3.c (dg-options): Use -O0.
+       (naked): Add attribute regparm(1) for x86_32 targets.
+       Add integer argument.  Remove global "data" variable.
+       (main): Pass integer argument to naked function.
+       * gcc.target/i386/naked-4.c: New test.
+
 2017-07-31  Jan Hubicka <hubicka@ucw.cz>
            Martin Liska  <mliska@suse.cz>
 
index 845300d6e4a61b8bdaf002af2ba205a6de511ba5..b3a17f635ee11153495641de243c80132c89cfee 100644 (file)
@@ -1,17 +1,18 @@
 /* { dg-do run { target *-*-linux* *-*-gnu* } } */
-/* { dg-options "-O2" } */
+/* { dg-options "-O0" } */
 
 #include <unistd.h>
 #include <signal.h>
 #include <stdlib.h>
 
-int data;
-
 /* Verify that naked function traps at the end.  */
 
 void
 __attribute__((naked, noinline, noclone))
-naked (void)
+#ifdef __i386__
+__attribute__((regparm(1)))
+#endif
+naked (int data)
 {
   if (data == 0x12345678)
     return;
@@ -32,8 +33,7 @@ int main ()
   s.sa_flags = 0;
   sigaction (SIGILL, &s, NULL);
 
-  data = 0x12345678;
-  naked ();
+  naked (0x12345678);
 
   abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/naked-4.c b/gcc/testsuite/gcc.target/i386/naked-4.c
new file mode 100644 (file)
index 0000000..07b3242
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+/* { dg-additional-options "-mregparm=3" { target ia32 } } */
+
+/* Verify that __attribute__((naked)) produces a naked function 
+   that does not allocate stack slots for args.  */
+extern void bar (int);
+
+int
+__attribute__((naked))
+foo (int a, int b, int c)
+{
+  bar (c);
+  asm volatile ("ret" :: "a" (b));
+}
+
+/* { dg-final { scan-assembler-not "%\[re\]bp" } } */