On 07/11/2018 05:21 AM, Tamar Christina wrote: > Hi All, > > This patch adds a hook to tell the mid-end about the probing requirements of > the > target. On AArch64 we allow a specific range for which no probing needs to > be done. This same range is also the amount that will have to be probed up > when > a probe is needed after dropping the stack. > > Defining this probe comes with the extra requirement that the outgoing > arguments > size of any function that uses alloca and stack clash be at the very least 8 > bytes. With this invariant we can skip doing the zero checks for alloca and > save some code. > > A simplified version of the AArch64 stack frame is: > > +-----------------------+ > | | > | | > | | > +-----------------------+ > |LR | > +-----------------------+ > |FP | > +-----------------------+ > |dynamic allocations | -\ probe range hook effects these > +-----------------------+ --\ and ensures that outgoing stack > |padding | -- args is always > 8 when alloca. > +-----------------------+ ---/ Which means it's always safe to probe > |outgoing stack args |-/ at SP > +-----------------------+ > > > > This allows us to generate better code than without the hook without affecting > other targets. > > With this patch I am also removing the > stack_clash_protection_final_dynamic_probe > hook which was added specifically for AArch64 but that is no longer needed. > > Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu and no > issues. > Both targets were tested with stack clash on and off by default. > > Ok for trunk? > > Thanks, > Tamar > > gcc/ > 2018-07-11 Tamar Christina <tamar.christ...@arm.com> > > PR target/86486 > * explow.c (anti_adjust_stack_and_probe_stack_clash): Support custom > probe ranges. > * target.def (stack_clash_protection_alloca_probe_range): New. > (stack_clash_protection_final_dynamic_probe): Remove. > * targhooks.h (default_stack_clash_protection_alloca_probe_range) New. > (default_stack_clash_protection_final_dynamic_probe): Remove. > * targhooks.c: Likewise. > * doc/tm.texi.in (TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE): > New. > (TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE): Remove. > * doc/tm.texi: Regenerate. > The control flow is a bit convoluted here, but after a few false starts where I thought this was wrong, I think it's OK.
Jeff