[gcc(refs/vendors/redhat/heads/gcc-8-branch)] rtl_data: Add sp_is_clobbered_by_asm

Jakub Jelinek jakub@gcc.gnu.org
Mon Sep 28 09:15:49 GMT 2020


https://gcc.gnu.org/g:0170836502e78b8cfecea8e67ee03f39bf72dd1b

commit 0170836502e78b8cfecea8e67ee03f39bf72dd1b
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Sep 14 08:52:27 2020 -0700

    rtl_data: Add sp_is_clobbered_by_asm
    
    Add sp_is_clobbered_by_asm to rtl_data to inform backends that the stack
    pointer is clobbered by asm statement.
    
    gcc/
    
            PR target/97032
            * cfgexpand.c (expand_asm_stmt): Set sp_is_clobbered_by_asm to
            true if the stack pointer is clobbered by asm statement.
            * emit-rtl.h (rtl_data): Add sp_is_clobbered_by_asm.
            * config/i386/i386.c (ix86_get_drap_rtx): Set need_drap to true
            if the stack pointer is clobbered by asm statement.
    
    gcc/testsuite/
    
            PR target/97032
            * gcc.target/i386/pr97032.c: New test.
    
    (cherry picked from commit 453a20c65722719b9e2d84339f215e7ec87692dc)

Diff:
---
 gcc/cfgexpand.c                         |  3 +++
 gcc/config/i386/i386.c                  |  6 ++++--
 gcc/emit-rtl.h                          |  3 +++
 gcc/testsuite/gcc.target/i386/pr97032.c | 22 ++++++++++++++++++++++
 4 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 18565bf1dab..dcf491954f1 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2972,6 +2972,9 @@ expand_asm_stmt (gasm *stmt)
 			   regname);
 		    return;
 		  }
+		/* Clobbering the stack pointer register.  */
+		else if (reg == (int) STACK_POINTER_REGNUM)
+		  crtl->sp_is_clobbered_by_asm = true;
 
 	        SET_HARD_REG_BIT (clobbered_regs, reg);
 	        rtx x = gen_rtx_REG (reg_raw_mode[reg], reg);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index f3c722b51e9..ce20bc2ab4e 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -12528,10 +12528,12 @@ ix86_update_stack_boundary (void)
 static rtx
 ix86_get_drap_rtx (void)
 {
-  /* We must use DRAP if there are outgoing arguments on stack and
+  /* We must use DRAP if there are outgoing arguments on stack or
+     the stack pointer register is clobbered by asm statment and
      ACCUMULATE_OUTGOING_ARGS is false.  */
   if (ix86_force_drap
-      || (cfun->machine->outgoing_args_on_stack
+      || ((cfun->machine->outgoing_args_on_stack
+	   || crtl->sp_is_clobbered_by_asm)
 	  && !ACCUMULATE_OUTGOING_ARGS))
     crtl->need_drap = true;
 
diff --git a/gcc/emit-rtl.h b/gcc/emit-rtl.h
index 4e7bd1ec26d..55dc3e84e9c 100644
--- a/gcc/emit-rtl.h
+++ b/gcc/emit-rtl.h
@@ -265,6 +265,9 @@ struct GTY(()) rtl_data {
      pass_stack_ptr_mod has run.  */
   bool sp_is_unchanging;
 
+  /* True if the stack pointer is clobbered by asm statement.  */
+  bool sp_is_clobbered_by_asm;
+
   /* Nonzero if function being compiled doesn't contain any calls
      (ignoring the prologue and epilogue).  This is set prior to
      register allocation in IRA and is valid for the remaining
diff --git a/gcc/testsuite/gcc.target/i386/pr97032.c b/gcc/testsuite/gcc.target/i386/pr97032.c
new file mode 100644
index 00000000000..b9ef2ad0c05
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr97032.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { ia32 && fstack_protector } } } */
+/* { dg-options "-O2 -mincoming-stack-boundary=2 -fstack-protector-all" } */
+
+#include <stdarg.h>
+
+extern int *__errno_location (void);
+
+long
+sys_socketcall (int op, ...)
+{
+  long int res;
+  va_list ap;
+  va_start (ap, op);
+  asm volatile ("push %%ebx; movl %2, %%ebx; int $0x80; pop %%ebx"
+		: "=a" (res) : "0" (102), "ri" (16), "c" (ap) : "memory", "esp");
+  if (__builtin_expect (res > 4294963200UL, 0))
+    *__errno_location () = -res;
+  va_end (ap);
+  return res;
+}
+
+/* { dg-final { scan-assembler "call\[ \t\]*_?__errno_location" } } */


More information about the Gcc-cvs mailing list