From: Kyrylo Tkachov Date: Tue, 10 Apr 2018 09:58:57 +0000 (+0000) Subject: [explow] PR target/85173: validize memory before passing it on to target probe_stack X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5c35bc3e16f0e238488423e37aed5dcbb9bfde46;p=gcc.git [explow] PR target/85173: validize memory before passing it on to target probe_stack In this PR the expansion code emits an invalid memory address for the stack probe, which the backend fails to recognise. The address is created explicitly in anti_adjust_stack_and_probe_stack_clash in explow.c and passed down to gen_probe_stack without any validation in emit_stack_probe. This patch fixes the ICE by calling validize_mem on the memory location before passing it down to the target. Jakub pointed out that we also want to create valid addresses for the probe_stack_address case, so this patch creates an expand operand and legitimizes it before passing it down to the probe_stack_address expander. This patch passes bootstrap and testing on arm-none-linux-gnueabihf and aarch64-none-linux-gnu and ppc64le-redhat-linux on gcc112 in the compile farm. PR target/85173 * explow.c (emit_stack_probe): Call validize_mem on memory location before passing it to gen_probe_stack. Create address operand and legitimize it for the probe_stack_address case. * gcc.target/arm/pr85173.c: New test. From-SVN: r259266 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0f5a8b25c0d..805b4b4acb9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-04-10 Kyrylo Tkachov + + PR target/85173 + * explow.c (emit_stack_probe): Call validize_mem on memory location + before passing it to gen_probe_stack. Create address operand and + legitimize it for the probe_stack_address case. + 2018-04-09 Jan Hubicka PR lto/85078 diff --git a/gcc/explow.c b/gcc/explow.c index 042e71904ec..fb2b7ff9f95 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -1626,18 +1626,25 @@ void emit_stack_probe (rtx address) { if (targetm.have_probe_stack_address ()) - emit_insn (targetm.gen_probe_stack_address (address)); + { + struct expand_operand ops[1]; + insn_code icode = targetm.code_for_probe_stack_address; + create_address_operand (ops, address); + maybe_legitimize_operands (icode, 0, 1, ops); + expand_insn (icode, 1, ops); + } else { rtx memref = gen_rtx_MEM (word_mode, address); MEM_VOLATILE_P (memref) = 1; + memref = validize_mem (memref); /* See if we have an insn to probe the stack. */ if (targetm.have_probe_stack ()) - emit_insn (targetm.gen_probe_stack (memref)); + emit_insn (targetm.gen_probe_stack (memref)); else - emit_move_insn (memref, const0_rtx); + emit_move_insn (memref, const0_rtx); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index de04c8bc6b8..f7ca8340e8f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-10 Kyrylo Tkachov + + PR target/85173 + * gcc.target/arm/pr85173.c: New test. + 2018-04-10 Jakub Jelinek PR lto/85248 diff --git a/gcc/testsuite/gcc.target/arm/pr85173.c b/gcc/testsuite/gcc.target/arm/pr85173.c new file mode 100644 index 00000000000..36105c96a73 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr85173.c @@ -0,0 +1,20 @@ +/* PR target/85173. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-probe-interval=14" } */ +/* { dg-require-effective-target arm_thumb2_ok } */ + +__attribute__((noinline, noclone)) void +foo (char *p) +{ + asm volatile ("" : : "r" (p) : "memory"); +} + +/* Nonconstant alloca, small local frame. */ +__attribute__((noinline, noclone)) void +f5 (int x) +{ + char locals[128]; + char *vla = __builtin_alloca (x); + foo (vla); +}