Commit 5c35bc3e by Kyrylo Tkachov Committed by Kyrylo Tkachov

[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
parent 8d96e546
2018-04-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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 <jh@suse.cz>
PR lto/85078
......
......@@ -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);
}
}
......
2018-04-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/85173
* gcc.target/arm/pr85173.c: New test.
2018-04-10 Jakub Jelinek <jakub@redhat.com>
PR lto/85248
......
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment