Make anti_adjust_stack_and_probe_stack_clash extern and use it for Z
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 14 May 2020 06:16:27 +0000 (08:16 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 14 May 2020 06:16:27 +0000 (08:16 +0200)
When compiling with -mbackchain -fstack-clash-protection currently no
probes are emitted.  This patch adjusts the "allocate_stack" expander
to call anti_adjust_stack_and_probe_stack_clash when needed. In order
to do this I had to export that function from explow.c.

Ok for mainline?

gcc/ChangeLog:

2020-05-14  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/s390.md ("allocate_stack"): Call
anti_adjust_stack_and_probe_stack_clash when stack clash
protection is enabled.
* explow.c (anti_adjust_stack_and_probe_stack_clash): Remove
prototype. Remove static.
* explow.h (anti_adjust_stack_and_probe_stack_clash): Add
prototype.

gcc/testsuite/ChangeLog:

2020-05-14  Andreas Krebbel  <krebbel@linux.ibm.com>

* gcc.target/s390/stack-clash-3.c: New test.

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/explow.c
gcc/explow.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/stack-clash-3.c [new file with mode: 0644]

index c1ee99eb0dfc93224b74dabd78f35e3c086a337d..0b326ee09e8b11891b95070f5b4273d72e0b519d 100644 (file)
@@ -1,3 +1,13 @@
+2020-05-14  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * config/s390/s390.md ("allocate_stack"): Call
+       anti_adjust_stack_and_probe_stack_clash when stack clash
+       protection is enabled.
+       * explow.c (anti_adjust_stack_and_probe_stack_clash): Remove
+       prototype. Remove static.
+       * explow.h (anti_adjust_stack_and_probe_stack_clash): Add
+       prototype.
+
 2020-05-13  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        * config/rs6000/altivec.h (vec_extractl): New #define.
index cf53ef1b7915f0d617e2a96d66f09281d4a69b0d..908de587e171ce5f3a39f7a3447ba15c87e34cba 100644 (file)
   rtx temp = gen_reg_rtx (Pmode);
 
   emit_move_insn (temp, s390_back_chain_rtx ());
-  anti_adjust_stack (operands[1]);
+
+  if (flag_stack_clash_protection)
+    anti_adjust_stack_and_probe_stack_clash (operands[1]);
+  else
+    anti_adjust_stack (operands[1]);
+
   emit_move_insn (s390_back_chain_rtx (), temp);
 
   emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
index b838f03587083c8fca23d47dd710ed84f7a98115..15c9cfb03189a87212ff5ff61077075d3632024b 100644 (file)
@@ -43,7 +43,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "output.h"
 
 static rtx break_out_memory_refs (rtx);
-static void anti_adjust_stack_and_probe_stack_clash (rtx);
 
 
 /* Truncate and perhaps sign-extend C as appropriate for MODE.  */
@@ -1948,7 +1947,7 @@ emit_stack_clash_protection_probe_loop_end (rtx loop_lab, rtx end_loop,
        allocate/probe beyond that because this probing style does not
        guarantee signal handling capability if the guard is hit.  */
 
-static void
+void
 anti_adjust_stack_and_probe_stack_clash (rtx size)
 {
   /* First ensure SIZE is Pmode.  */
index cc44bf8520a05a51a3ed2de6aa501a1a5d96480d..0df8c62b82a8bf1d8d6baf0b6fb658e66361a407 100644 (file)
@@ -69,6 +69,10 @@ extern void anti_adjust_stack (rtx);
 /* Add some bytes to the stack while probing it.  An rtx says how many. */
 extern void anti_adjust_stack_and_probe (rtx, bool);
 
+/* Add some bytes to the stack while probing it.  An rtx says how
+   many.  Add additional probes to prevent stack clashing attacks.  */
+extern void anti_adjust_stack_and_probe_stack_clash (rtx);
+
 /* Support for building allocation/probing loops for stack-clash
    protection of dyamically allocated stack space.  */
 extern void compute_stack_clash_protection_loop_data (rtx *, rtx *, rtx *,
index 916bc2d40c8512d6dfbb540b6ad90b80b199e396..bb3e4c86adcf4f57b750a0be61ec7b58a1991dcb 100644 (file)
@@ -1,3 +1,7 @@
+2020-05-14  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * gcc.target/s390/stack-clash-3.c: New test.
+
 2020-05-13  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        * gcc.target/powerpc/vec-extracth-0.c: New.
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-3.c b/gcc/testsuite/gcc.target/s390/stack-clash-3.c
new file mode 100644 (file)
index 0000000..929d3fb
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z900 -fstack-clash-protection -mbackchain" } */
+
+extern void bar (char *);
+
+void
+foo ()
+{
+  char * mem = __builtin_alloca (20000);
+  bar (mem);
+}
+
+/* For alloca a common code routine emits the probes.  Make sure the
+   "probe_stack" expander is used in that case. We want to use mem
+   compares instead of stores.  */
+/* { dg-final { scan-assembler-times "cg\t" 5 { target lp64 } } } */
+/* { dg-final { scan-assembler-times "c\t" 5 { target { ! lp64 } } } } */