Blame SOURCES/gcc48-rh1537828-5.patch

8178f7
commit 5fdcac79eb72406c59fa72073dfb3ba21380f56d
8178f7
Author: ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
8178f7
Date:   Tue Apr 10 09:58:57 2018 +0000
8178f7
8178f7
    [explow] PR target/85173: validize memory before passing it on to target probe_stack
8178f7
    
8178f7
    In this PR the expansion code emits an invalid memory address for the stack probe, which the backend fails to recognise.
8178f7
    The address is created explicitly in anti_adjust_stack_and_probe_stack_clash in explow.c and passed down to gen_probe_stack
8178f7
    without any validation in emit_stack_probe.
8178f7
    
8178f7
    This patch fixes the ICE by calling validize_mem on the memory location before passing it down to the target.
8178f7
    Jakub pointed out that we also want to create valid addresses for the probe_stack_address case, so this patch
8178f7
    creates an expand operand and legitimizes it before passing it down to the probe_stack_address expander.
8178f7
    
8178f7
    This patch passes bootstrap and testing on arm-none-linux-gnueabihf and aarch64-none-linux-gnu
8178f7
    and ppc64le-redhat-linux on gcc112 in the compile farm.
8178f7
    
8178f7
            PR target/85173
8178f7
            * explow.c (emit_stack_probe): Call validize_mem on memory location
8178f7
            before passing it to gen_probe_stack.  Create address operand and
8178f7
            legitimize it for the probe_stack_address case.
8178f7
    
8178f7
            * gcc.target/arm/pr85173.c: New test.
8178f7
    
8178f7
    
8178f7
    
8178f7
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259266 138bc75d-0d04-0410-961f-82ee72b054a4
8178f7
8178f7
diff --git a/gcc/explow.c b/gcc/explow.c
8178f7
index 9386489..e2253ae 100644
8178f7
--- a/gcc/explow.c
8178f7
+++ b/gcc/explow.c
8178f7
@@ -1549,13 +1549,20 @@ emit_stack_probe (rtx address)
8178f7
 {
8178f7
 #ifdef HAVE_probe_stack_address
8178f7
   if (HAVE_probe_stack_address)
8178f7
-    emit_insn (gen_probe_stack_address (address));
8178f7
+    {
8178f7
+      struct expand_operand ops[1];
8178f7
+      insn_code icode = targetm.code_for_probe_stack_address;
8178f7
+      create_address_operand (ops, address);
8178f7
+      maybe_legitimize_operands (icode, 0, 1, ops);
8178f7
+      expand_insn (icode, 1, ops);
8178f7
+    }
8178f7
   else
8178f7
 #endif
8178f7
     {
8178f7
       rtx memref = gen_rtx_MEM (word_mode, address);
8178f7
 
8178f7
       MEM_VOLATILE_P (memref) = 1;
8178f7
+      memref = validize_mem (memref);
8178f7
 
8178f7
       /* See if we have an insn to probe the stack.  */
8178f7
 #ifdef HAVE_probe_stack
8178f7
diff --git a/gcc/testsuite/gcc.target/arm/pr85173.c b/gcc/testsuite/gcc.target/arm/pr85173.c
8178f7
new file mode 100644
8178f7
index 0000000..36105c9
8178f7
--- /dev/null
8178f7
+++ b/gcc/testsuite/gcc.target/arm/pr85173.c
8178f7
@@ -0,0 +1,20 @@
8178f7
+/* PR target/85173.  */
8178f7
+
8178f7
+/* { dg-do compile } */
8178f7
+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-probe-interval=14" } */
8178f7
+/* { dg-require-effective-target arm_thumb2_ok } */
8178f7
+
8178f7
+__attribute__((noinline, noclone)) void
8178f7
+foo (char *p)
8178f7
+{
8178f7
+  asm volatile ("" : : "r" (p) : "memory");
8178f7
+}
8178f7
+
8178f7
+/* Nonconstant alloca, small local frame.  */
8178f7
+__attribute__((noinline, noclone)) void
8178f7
+f5 (int x)
8178f7
+{
8178f7
+  char locals[128];
8178f7
+  char *vla = __builtin_alloca (x);
8178f7
+  foo (vla);
8178f7
+}