diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-01 14:23:42 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-01 14:23:42 +0000 |
commit | 82711f6567ef069eebb942e382e2c3fa61fbf538 (patch) | |
tree | 22200b7326b32ca672ffb6e4ce6d19a09dc476e5 /gcc48-rh1469697-6.patch | |
parent | 5d624aa0d36abe76a344f0593eae5cf36d083b15 (diff) |
automatic import of compat-libgfortran-48openeuler24.03_LTSopeneuler23.09
Diffstat (limited to 'gcc48-rh1469697-6.patch')
-rw-r--r-- | gcc48-rh1469697-6.patch | 2705 |
1 files changed, 2705 insertions, 0 deletions
diff --git a/gcc48-rh1469697-6.patch b/gcc48-rh1469697-6.patch new file mode 100644 index 0000000..b08bb30 --- /dev/null +++ b/gcc48-rh1469697-6.patch @@ -0,0 +1,2705 @@ +commit dd9992d1b96b5811873c98a208c029bebb0c3577 +Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Wed Sep 20 05:35:07 2017 +0000 + + * config/i386/i386.c (ix86_adjust_stack_and_probe_stack_clash): New. + (ix86_expand_prologue): Dump stack clash info as needed. + Call ix86_adjust_stack_and_probe_stack_clash as needed. + + * gcc.dg/stack-check-4.c: New test. + * gcc.dg/stack-check-5.c: New test. + * gcc.dg/stack-check-6.c: New test. + * gcc.dg/stack-check-6a.c: New test. + * gcc.dg/stack-check-7.c: New test. + * gcc.dg/stack-check-8.c: New test. + * gcc.dg/stack-check-9.c: New test. + * gcc.dg/stack-check-10.c: New test. + * lib/target-supports.exp + (check_effective_target_supports_stack_clash_protection): Enable for + x86 and x86_64 targets. + + git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@252998 138bc75d-0d04-0410-961f-82ee72b054a4 + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index d996fd160e8..a555b0774c0 100644 +--- a/gcc/config/i386/i386.c ++++ b/gcc/config/i386/i386.c +@@ -9839,6 +9839,147 @@ release_scratch_register_on_entry (struct scratch_reg *sr) + + #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP) + ++/* Emit code to adjust the stack pointer by SIZE bytes while probing it. ++ ++ This differs from the next routine in that it tries hard to prevent ++ attacks that jump the stack guard. Thus it is never allowed to allocate ++ more than PROBE_INTERVAL bytes of stack space without a suitable ++ probe. */ ++ ++static void ++ix86_adjust_stack_and_probe_stack_clash (const HOST_WIDE_INT size) ++{ ++ struct machine_function *m = cfun->machine; ++ ++ /* If this function does not statically allocate stack space, then ++ no probes are needed. */ ++ if (!size) ++ { ++ dump_stack_clash_frame_info (NO_PROBE_NO_FRAME, false); ++ return; ++ } ++ ++ /* If we are a noreturn function, then we have to consider the ++ possibility that we're called via a jump rather than a call. ++ ++ Thus we don't have the implicit probe generated by saving the ++ return address into the stack at the call. Thus, the stack ++ pointer could be anywhere in the guard page. The safe thing ++ to do is emit a probe now. ++ ++ ?!? This should be revamped to work like aarch64 and s390 where ++ we track the offset from the most recent probe. Normally that ++ offset would be zero. For a non-return function we would reset ++ it to PROBE_INTERVAL - (STACK_BOUNDARY / BITS_PER_UNIT). Then ++ we just probe when we cross PROBE_INTERVAL. */ ++ if (TREE_THIS_VOLATILE (cfun->decl)) ++ { ++ emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx, ++ -GET_MODE_SIZE (word_mode))); ++ emit_insn (gen_blockage ()); ++ } ++ ++ /* If we allocate less than the size of the guard statically, ++ then no probing is necessary, but we do need to allocate ++ the stack. */ ++ if (size < (1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE))) ++ { ++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx, ++ GEN_INT (-size), -1, ++ m->fs.cfa_reg == stack_pointer_rtx); ++ dump_stack_clash_frame_info (NO_PROBE_SMALL_FRAME, true); ++ return; ++ } ++ ++ /* We're allocating a large enough stack frame that we need to ++ emit probes. Either emit them inline or in a loop depending ++ on the size. */ ++ HOST_WIDE_INT probe_interval ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL); ++ if (size <= 4 * probe_interval) ++ { ++ HOST_WIDE_INT i; ++ for (i = probe_interval; i <= size; i += probe_interval) ++ { ++ /* Allocate PROBE_INTERVAL bytes. */ ++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx, ++ GEN_INT (-probe_interval), -1, ++ m->fs.cfa_reg == stack_pointer_rtx); ++ ++ /* And probe at *sp. */ ++ emit_stack_probe (stack_pointer_rtx); ++ emit_insn (gen_blockage ()); ++ } ++ ++ /* We need to allocate space for the residual, but we do not need ++ to probe the residual. */ ++ HOST_WIDE_INT residual = (i - probe_interval - size); ++ if (residual) ++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx, ++ GEN_INT (residual), -1, ++ m->fs.cfa_reg == stack_pointer_rtx); ++ dump_stack_clash_frame_info (PROBE_INLINE, residual != 0); ++ } ++ else ++ { ++ struct scratch_reg sr; ++ get_scratch_register_on_entry (&sr); ++ ++ /* Step 1: round SIZE down to a multiple of the interval. */ ++ HOST_WIDE_INT rounded_size = size & -probe_interval; ++ ++ /* Step 2: compute final value of the loop counter. Use lea if ++ possible. */ ++ rtx addr = plus_constant (Pmode, stack_pointer_rtx, -rounded_size); ++ rtx insn; ++ if (address_operand (addr, Pmode)) ++ insn = emit_insn (gen_rtx_SET (VOIDmode, sr.reg, addr)); ++ else ++ { ++ emit_move_insn (sr.reg, GEN_INT (-rounded_size)); ++ insn = emit_insn (gen_rtx_SET (VOIDmode, sr.reg, ++ gen_rtx_PLUS (Pmode, sr.reg, ++ stack_pointer_rtx))); ++ } ++ if (m->fs.cfa_reg == stack_pointer_rtx) ++ { ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, sr.reg, ++ m->fs.cfa_offset + rounded_size)); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ /* Step 3: the loop. */ ++ rtx size_rtx = GEN_INT (rounded_size); ++ insn = emit_insn (ix86_gen_adjust_stack_and_probe (sr.reg, sr.reg, ++ size_rtx)); ++ if (m->fs.cfa_reg == stack_pointer_rtx) ++ { ++ m->fs.cfa_offset += rounded_size; ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, stack_pointer_rtx, ++ m->fs.cfa_offset)); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ m->fs.sp_offset += rounded_size; ++ emit_insn (gen_blockage ()); ++ ++ /* Step 4: adjust SP if we cannot assert at compile-time that SIZE ++ is equal to ROUNDED_SIZE. */ ++ ++ if (size != rounded_size) ++ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx, ++ GEN_INT (rounded_size - size), -1, ++ m->fs.cfa_reg == stack_pointer_rtx); ++ dump_stack_clash_frame_info (PROBE_LOOP, size != rounded_size); ++ ++ release_scratch_register_on_entry (&sr); ++ } ++ ++ /* Make sure nothing is scheduled before we are done. */ ++ emit_insn (gen_blockage ()); ++} ++ + /* Emit code to adjust the stack pointer by SIZE bytes while probing it. */ + + static void +@@ -10529,12 +10670,19 @@ ix86_expand_prologue (void) + + /* The stack has already been decremented by the instruction calling us + so probe if the size is non-negative to preserve the protection area. */ +- if (allocate >= 0 && flag_stack_check == STATIC_BUILTIN_STACK_CHECK) ++ if (allocate >= 0 ++ && (flag_stack_check == STATIC_BUILTIN_STACK_CHECK ++ || flag_stack_clash_protection)) + { + /* We expect the registers to be saved when probes are used. */ + gcc_assert (int_registers_saved); + +- if (STACK_CHECK_MOVING_SP) ++ if (flag_stack_clash_protection) ++ { ++ ix86_adjust_stack_and_probe_stack_clash (allocate); ++ allocate = 0; ++ } ++ else if (STACK_CHECK_MOVING_SP) + { + ix86_adjust_stack_and_probe (allocate); + allocate = 0; +diff --git a/gcc/testsuite/gcc.dg/stack-check-10.c b/gcc/testsuite/gcc.dg/stack-check-10.c +new file mode 100644 +index 00000000000..a86956ad692 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-10.c +@@ -0,0 +1,41 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int f (int *); ++ ++int ++g (int a) ++{ ++ return f (&a); ++} ++ ++int f1 (void); ++int f2 (int); ++ ++int ++f3 (void) ++{ ++ return f2 (f1 ()); ++} ++ ++ ++/* If we have caller implicit probes, then we should not need probes in either callee. ++ Else callees may need probes, particularly if non-leaf functions require a ++ frame/frame pointer. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no probe" 2 "pro_and_epilogue" { target caller_implicit_probes } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash inline probe" 1 "pro_and_epilogue" { target { ! caller_implicit_probes } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no probe" 1 "pro_and_epilogue" { target { ! caller_implicit_probes } } } } */ ++ ++/* Neither of these functions are a nonreturn function. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 2 "pro_and_epilogue" } } */ ++ ++/* If the callee realigns the stack or has a mandatory frame, then both functions ++ have a residual allocation. Else just g() has a residual allocation. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash residual allocation in prologue" 2 "pro_and_epilogue" } } */ ++ ++ ++/* If the target has frame pointers for non-leafs, then both functions will ++ need a frame pointer. Otherwise neither should. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 2 "pro_and_epilogue" { target { ! frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ +diff --git a/gcc/testsuite/gcc.dg/stack-check-3.c b/gcc/testsuite/gcc.dg/stack-check-3.c +index 58fb65649ee..f0bf7c71a5b 100644 +--- a/gcc/testsuite/gcc.dg/stack-check-3.c ++++ b/gcc/testsuite/gcc.dg/stack-check-3.c +@@ -7,7 +7,7 @@ + residual allocation + probe for f?. */ + + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-expand -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=4096 --param stack-clash-protection-guard-size=4096" } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-expand -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + + __attribute__((noinline, noclone)) void +diff --git a/gcc/testsuite/gcc.dg/stack-check-4.c b/gcc/testsuite/gcc.dg/stack-check-4.c +new file mode 100644 +index 00000000000..b0c5c61972f +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-4.c +@@ -0,0 +1,42 @@ ++/* On targets where the call instruction is an implicit probe of *sp, we ++ elide stack probes as long as the size of the local stack is less than ++ PROBE_INTERVAL. ++ ++ But if the caller were to transform a tail call into a direct jump ++ we do not have that implicit probe. This normally isn't a problem as ++ the caller must not have a local frame for that optimization to apply. ++ ++ However, a sufficiently smart compiler could realize that the caller's ++ local stack need not be torn down and thus could transform a call into ++ a jump if the target is a noreturn function, even if the caller has ++ a local frame. ++ ++ To guard against that, targets that depend on *sp being probed by the ++ call itself must emit a probe if the target function is a noreturn ++ function, even if they just allocate a small amount of stack space. ++ ++ Rather than try to parse RTL or assembly code, we instead require the ++ prologue code to emit information into the dump file that we can ++ scan for. We scan for both the positive and negative cases. */ ++ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++extern void arf (char *); ++ ++__attribute__ ((noreturn)) void foo1 () ++{ ++ char x[10]; ++ while (1) ++ arf (x); ++} ++ ++void foo2 () ++{ ++ char x[10]; ++ arf (x); ++} ++/* { dg-final { scan-rtl-dump-times "Stack clash noreturn" 1 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 1 "pro_and_epilogue" } } */ ++ +diff --git a/gcc/testsuite/gcc.dg/stack-check-5.c b/gcc/testsuite/gcc.dg/stack-check-5.c +new file mode 100644 +index 00000000000..2171d9b6c23 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-5.c +@@ -0,0 +1,74 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++ ++extern void foo (char *); ++extern void bar (void); ++ ++/* This function allocates no local stack and is a leaf. It should have no ++ probes on any target and should not require a frame pointer. */ ++int ++f0 (int x, int y) ++{ ++ asm volatile ("" : : : "memory"); ++ return x + y; ++} ++ ++/* This function allocates no local stack, but is not a leaf. Ideally it ++ should not need probing and no frame pointer. */ ++int ++f1 (int x, int y) ++{ ++ asm volatile ("" : : : "memory"); ++ bar (); ++} ++ ++/* This is a leaf with a small frame. On targets with implicit probes in ++ the caller, this should not need probing. On targets with no implicit ++ probes in the caller, it may require probes. Ideally it should need no ++ frame pointer. */ ++void ++f2 (void) ++{ ++ char buf[512]; ++ asm volatile ("" : : "g" (&buf) : "memory"); ++} ++ ++/* This is a non-leaf with a small frame. On targets with implicit probes in ++ the caller, this should not need probing. On targets with no implicit ++ probes in the caller, it may require probes. It should need no frame ++ pointer. */ ++void ++f3 (void) ++{ ++ char buf[512]; ++ foo (buf); ++} ++ ++/* If we have caller implicit probes, then we should not need probes. ++ Else callees may need probes, particularly if non-leaf functions require a ++ frame/frame pointer. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no probe" 4 "pro_and_epilogue" { target caller_implicit_probes } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no probe" 2 "pro_and_epilogue" { target { ! caller_implicit_probes } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash inline probes " 2 "pro_and_epilogue" { target { ! caller_implicit_probes } } } } */ ++ ++/* None of these functions are marked with the noreturn attribute. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 4 "pro_and_epilogue" } } */ ++ ++/* Two functions are leafs, two are not. Verify the target identified them ++ appropriately. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 4 "pro_and_epilogue" { target { ! frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ ++ ++ ++/* We have selected the size of the array in f2/f3 to be large enough ++ to not live in the red zone on targets that support it. ++ ++ That allows simplification of this test considerably. ++ f1() should not require any allocations, thus no residuals. ++ All the rest of the functions require some kind of allocation, ++ either for the saved fp/rp or the array. */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no residual allocation in prologue" 1 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash residual allocation in prologue" 3 "pro_and_epilogue" } } */ +diff --git a/gcc/testsuite/gcc.dg/stack-check-6.c b/gcc/testsuite/gcc.dg/stack-check-6.c +new file mode 100644 +index 00000000000..ad2021c9037 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-6.c +@@ -0,0 +1,55 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++ ++extern void foo (char *); ++extern void bar (void); ++ ++ ++/* This is a leaf with a frame that is large enough to require probing with ++ a residual allocation, but small enough to probe inline. */ ++void ++f4 (void) ++{ ++ char buf[4096 + 512]; ++ asm volatile ("" : : "g" (&buf) : "memory"); ++} ++ ++ ++/* This is a non-leaf with a frame large enough to require probing and ++ a residual allocation, but small enough to probe inline. */ ++void ++f5 (void) ++{ ++ char buf[4096 + 512]; ++ foo (buf); ++} ++ ++/* This is a leaf with a frame that is large enough to require probing with ++ a loop plus a residual allocation. */ ++void ++f6 (void) ++{ ++ char buf[4096 * 10 + 512]; ++ asm volatile ("" : : "g" (&buf) : "memory"); ++} ++ ++ ++/* This is a non-leaf with a frame large enough to require probing with ++ a loop plus a residual allocation. */ ++void ++f7 (void) ++{ ++ char buf[4096 * 10 + 512]; ++ foo (buf); ++} ++ ++/* { dg-final { scan-rtl-dump-times "Stack clash inline probes" 2 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash probe loop" 2 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash residual allocation in prologue" 4 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 4 "pro_and_epilogue" } } */ ++ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 4 "pro_and_epilogue" { target { ! frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ +diff --git a/gcc/testsuite/gcc.dg/stack-check-6a.c b/gcc/testsuite/gcc.dg/stack-check-6a.c +new file mode 100644 +index 00000000000..6f8e7128921 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-6a.c +@@ -0,0 +1,17 @@ ++/* The goal here is to verify that increasing the size of the guard allows ++ elimination of all probing on the relevant targets. */ ++ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=16" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++#include "stack-check-6.c" ++ ++/* { dg-final { scan-rtl-dump-times "Stack clash inline probes" 0 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash probe loop" 0 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash residual allocation in prologue" 4 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 4 "pro_and_epilogue" } } */ ++ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 4 "pro_and_epilogue" { target { ! frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash frame pointer needed" 2 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ +diff --git a/gcc/testsuite/gcc.dg/stack-check-7.c b/gcc/testsuite/gcc.dg/stack-check-7.c +new file mode 100644 +index 00000000000..b963a2881dc +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-7.c +@@ -0,0 +1,36 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fstack-clash-protection -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++/* For further testing, this can be run under valgrind where it's crashed ++ on aarch64 and ppc64le with -fstack-check=specific. */ ++ ++ ++__attribute__((noinline, noclone)) void ++foo (char *p) ++{ ++ asm volatile ("" : : "r" (p) : "memory"); ++} ++ ++__attribute__((noinline, noclone)) void ++bar (void) ++{ ++ char buf[131072]; ++ foo (buf); ++} ++ ++__attribute__((noinline, noclone)) void ++baz (void) ++{ ++ char buf[12000]; ++ foo (buf); ++} ++ ++int ++main () ++{ ++ bar (); ++ baz (); ++ return 0; ++} ++ +diff --git a/gcc/testsuite/gcc.dg/stack-check-8.c b/gcc/testsuite/gcc.dg/stack-check-8.c +new file mode 100644 +index 00000000000..0ccec8b532a +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-8.c +@@ -0,0 +1,139 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -w -fstack-clash-protection -Wno-psabi -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++ ++typedef float V __attribute__((vector_size (32))); ++ ++__attribute__((noinline, noclone)) void ++foo (char *p) ++{ ++ asm volatile ("" : : "r" (p) : "memory"); ++} ++ ++__attribute__((noinline, noclone)) int ++f0 (int x, int y) ++{ ++ asm volatile ("" : : : "memory"); ++ return x + y; ++} ++ ++__attribute__((noinline, noclone)) void ++f1 (void) ++{ ++ char buf[64]; ++ foo (buf); ++} ++ ++__attribute__((noinline, noclone)) void ++f2 (void) ++{ ++ char buf[12000]; ++ foo (buf); ++} ++ ++__attribute__((noinline, noclone)) void ++f3 (void) ++{ ++ char buf[131072]; ++ foo (buf); ++} ++ ++__attribute__((noinline, noclone)) void ++f4 (int x) ++{ ++ char vla[x]; ++ foo (vla); ++} ++ ++__attribute__((noinline, noclone)) void ++f5 (int x) ++{ ++ char buf[12000]; ++ foo (buf); ++ { ++ char vla[x]; ++ foo (vla); ++ } ++ { ++ char vla[x]; ++ foo (vla); ++ } ++} ++ ++V v; ++ ++__attribute__((noinline, noclone)) int ++f6 (int x, int y, V a, V b, V c) ++{ ++ asm volatile ("" : : : "memory"); ++ v = a + b + c; ++ return x + y; ++} ++ ++__attribute__((noinline, noclone)) void ++f7 (V a, V b, V c) ++{ ++ char buf[64]; ++ foo (buf); ++ v = a + b + c; ++} ++ ++__attribute__((noinline, noclone)) void ++f8 (V a, V b, V c) ++{ ++ char buf[12000]; ++ foo (buf); ++ v = a + b + c; ++} ++ ++__attribute__((noinline, noclone)) void ++f9 (V a, V b, V c) ++{ ++ char buf[131072]; ++ foo (buf); ++ v = a + b + c; ++} ++ ++__attribute__((noinline, noclone)) void ++f10 (int x, V a, V b, V c) ++{ ++ char vla[x]; ++ foo (vla); ++ v = a + b + c; ++} ++ ++__attribute__((noinline, noclone)) void ++f11 (int x, V a, V b, V c) ++{ ++ char buf[12000]; ++ foo (buf); ++ v = a + b + c; ++ { ++ char vla[x]; ++ foo (vla); ++ } ++ { ++ char vla[x]; ++ foo (vla); ++ } ++} ++ ++int ++main () ++{ ++ f0 (2, 3); ++ f1 (); ++ f2 (); ++ f3 (); ++ f4 (12000); ++ f5 (12000); ++ f6 (2, 3, v, v, v); ++ f7 (v, v, v); ++ f8 (v, v, v); ++ f9 (v, v, v); ++ f10 (12000, v, v, v); ++ f11 (12000, v, v, v); ++ return 0; ++} ++ +diff --git a/gcc/testsuite/gcc.dg/stack-check-9.c b/gcc/testsuite/gcc.dg/stack-check-9.c +new file mode 100644 +index 00000000000..b84075b9b43 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/stack-check-9.c +@@ -0,0 +1,2022 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection -fdump-rtl-pro_and_epilogue -fno-optimize-sibling-calls --param stack-clash-protection-probe-interval=12 --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++double f1 (void); ++double f2 (double, double); ++ ++double ++f3 (void) ++{ ++ double d000 = f1 (); ++ double d001 = f1 (); ++ double d002 = f1 (); ++ double d003 = f1 (); ++ double d004 = f1 (); ++ double d005 = f1 (); ++ double d006 = f1 (); ++ double d007 = f1 (); ++ double d008 = f1 (); ++ double d009 = f1 (); ++ double d010 = f1 (); ++ double d011 = f1 (); ++ double d012 = f1 (); ++ double d013 = f1 (); ++ double d014 = f1 (); ++ double d015 = f1 (); ++ double d016 = f1 (); ++ double d017 = f1 (); ++ double d018 = f1 (); ++ double d019 = f1 (); ++ double d020 = f1 (); ++ double d021 = f1 (); ++ double d022 = f1 (); ++ double d023 = f1 (); ++ double d024 = f1 (); ++ double d025 = f1 (); ++ double d026 = f1 (); ++ double d027 = f1 (); ++ double d028 = f1 (); ++ double d029 = f1 (); ++ double d030 = f1 (); ++ double d031 = f1 (); ++ double d032 = f1 (); ++ double d033 = f1 (); ++ double d034 = f1 (); ++ double d035 = f1 (); ++ double d036 = f1 (); ++ double d037 = f1 (); ++ double d038 = f1 (); ++ double d039 = f1 (); ++ double d040 = f1 (); ++ double d041 = f1 (); ++ double d042 = f1 (); ++ double d043 = f1 (); ++ double d044 = f1 (); ++ double d045 = f1 (); ++ double d046 = f1 (); ++ double d047 = f1 (); ++ double d048 = f1 (); ++ double d049 = f1 (); ++ double d050 = f1 (); ++ double d051 = f1 (); ++ double d052 = f1 (); ++ double d053 = f1 (); ++ double d054 = f1 (); ++ double d055 = f1 (); ++ double d056 = f1 (); ++ double d057 = f1 (); ++ double d058 = f1 (); ++ double d059 = f1 (); ++ double d060 = f1 (); ++ double d061 = f1 (); ++ double d062 = f1 (); ++ double d063 = f1 (); ++ double d064 = f1 (); ++ double d065 = f1 (); ++ double d066 = f1 (); ++ double d067 = f1 (); ++ double d068 = f1 (); ++ double d069 = f1 (); ++ double d070 = f1 (); ++ double d071 = f1 (); ++ double d072 = f1 (); ++ double d073 = f1 (); ++ double d074 = f1 (); ++ double d075 = f1 (); ++ double d076 = f1 (); ++ double d077 = f1 (); ++ double d078 = f1 (); ++ double d079 = f1 (); ++ double d080 = f1 (); ++ double d081 = f1 (); ++ double d082 = f1 (); ++ double d083 = f1 (); ++ double d084 = f1 (); ++ double d085 = f1 (); ++ double d086 = f1 (); ++ double d087 = f1 (); ++ double d088 = f1 (); ++ double d089 = f1 (); ++ double d090 = f1 (); ++ double d091 = f1 (); ++ double d092 = f1 (); ++ double d093 = f1 (); ++ double d094 = f1 (); ++ double d095 = f1 (); ++ double d096 = f1 (); ++ double d097 = f1 (); ++ double d098 = f1 (); ++ double d099 = f1 (); ++ double d100 = f1 (); ++ double d101 = f1 (); ++ double d102 = f1 (); ++ double d103 = f1 (); ++ double d104 = f1 (); ++ double d105 = f1 (); ++ double d106 = f1 (); ++ double d107 = f1 (); ++ double d108 = f1 (); ++ double d109 = f1 (); ++ double d110 = f1 (); ++ double d111 = f1 (); ++ double d112 = f1 (); ++ double d113 = f1 (); ++ double d114 = f1 (); ++ double d115 = f1 (); ++ double d116 = f1 (); ++ double d117 = f1 (); ++ double d118 = f1 (); ++ double d119 = f1 (); ++ double d120 = f1 (); ++ double d121 = f1 (); ++ double d122 = f1 (); ++ double d123 = f1 (); ++ double d124 = f1 (); ++ double d125 = f1 (); ++ double d126 = f1 (); ++ double d127 = f1 (); ++ double d128 = f1 (); ++ double d129 = f1 (); ++ double d130 = f1 (); ++ double d131 = f1 (); ++ double d132 = f1 (); ++ double d133 = f1 (); ++ double d134 = f1 (); ++ double d135 = f1 (); ++ double d136 = f1 (); ++ double d137 = f1 (); ++ double d138 = f1 (); ++ double d139 = f1 (); ++ double d140 = f1 (); ++ double d141 = f1 (); ++ double d142 = f1 (); ++ double d143 = f1 (); ++ double d144 = f1 (); ++ double d145 = f1 (); ++ double d146 = f1 (); ++ double d147 = f1 (); ++ double d148 = f1 (); ++ double d149 = f1 (); ++ double d150 = f1 (); ++ double d151 = f1 (); ++ double d152 = f1 (); ++ double d153 = f1 (); ++ double d154 = f1 (); ++ double d155 = f1 (); ++ double d156 = f1 (); ++ double d157 = f1 (); ++ double d158 = f1 (); ++ double d159 = f1 (); ++ double d160 = f1 (); ++ double d161 = f1 (); ++ double d162 = f1 (); ++ double d163 = f1 (); ++ double d164 = f1 (); ++ double d165 = f1 (); ++ double d166 = f1 (); ++ double d167 = f1 (); ++ double d168 = f1 (); ++ double d169 = f1 (); ++ double d170 = f1 (); ++ double d171 = f1 (); ++ double d172 = f1 (); ++ double d173 = f1 (); ++ double d174 = f1 (); ++ double d175 = f1 (); ++ double d176 = f1 (); ++ double d177 = f1 (); ++ double d178 = f1 (); ++ double d179 = f1 (); ++ double d180 = f1 (); ++ double d181 = f1 (); ++ double d182 = f1 (); ++ double d183 = f1 (); ++ double d184 = f1 (); ++ double d185 = f1 (); ++ double d186 = f1 (); ++ double d187 = f1 (); ++ double d188 = f1 (); ++ double d189 = f1 (); ++ double d190 = f1 (); ++ double d191 = f1 (); ++ double d192 = f1 (); ++ double d193 = f1 (); ++ double d194 = f1 (); ++ double d195 = f1 (); ++ double d196 = f1 (); ++ double d197 = f1 (); ++ double d198 = f1 (); ++ double d199 = f1 (); ++ double d200 = f1 (); ++ double d201 = f1 (); ++ double d202 = f1 (); ++ double d203 = f1 (); ++ double d204 = f1 (); ++ double d205 = f1 (); ++ double d206 = f1 (); ++ double d207 = f1 (); ++ double d208 = f1 (); ++ double d209 = f1 (); ++ double d210 = f1 (); ++ double d211 = f1 (); ++ double d212 = f1 (); ++ double d213 = f1 (); ++ double d214 = f1 (); ++ double d215 = f1 (); ++ double d216 = f1 (); ++ double d217 = f1 (); ++ double d218 = f1 (); ++ double d219 = f1 (); ++ double d220 = f1 (); ++ double d221 = f1 (); ++ double d222 = f1 (); ++ double d223 = f1 (); ++ double d224 = f1 (); ++ double d225 = f1 (); ++ double d226 = f1 (); ++ double d227 = f1 (); ++ double d228 = f1 (); ++ double d229 = f1 (); ++ double d230 = f1 (); ++ double d231 = f1 (); ++ double d232 = f1 (); ++ double d233 = f1 (); ++ double d234 = f1 (); ++ double d235 = f1 (); ++ double d236 = f1 (); ++ double d237 = f1 (); ++ double d238 = f1 (); ++ double d239 = f1 (); ++ double d240 = f1 (); ++ double d241 = f1 (); ++ double d242 = f1 (); ++ double d243 = f1 (); ++ double d244 = f1 (); ++ double d245 = f1 (); ++ double d246 = f1 (); ++ double d247 = f1 (); ++ double d248 = f1 (); ++ double d249 = f1 (); ++ double d250 = f1 (); ++ double d251 = f1 (); ++ double d252 = f1 (); ++ double d253 = f1 (); ++ double d254 = f1 (); ++ double d255 = f1 (); ++ double d256 = f1 (); ++ double d257 = f1 (); ++ double d258 = f1 (); ++ double d259 = f1 (); ++ double d260 = f1 (); ++ double d261 = f1 (); ++ double d262 = f1 (); ++ double d263 = f1 (); ++ double d264 = f1 (); ++ double d265 = f1 (); ++ double d266 = f1 (); ++ double d267 = f1 (); ++ double d268 = f1 (); ++ double d269 = f1 (); ++ double d270 = f1 (); ++ double d271 = f1 (); ++ double d272 = f1 (); ++ double d273 = f1 (); ++ double d274 = f1 (); ++ double d275 = f1 (); ++ double d276 = f1 (); ++ double d277 = f1 (); ++ double d278 = f1 (); ++ double d279 = f1 (); ++ double d280 = f1 (); ++ double d281 = f1 (); ++ double d282 = f1 (); ++ double d283 = f1 (); ++ double d284 = f1 (); ++ double d285 = f1 (); ++ double d286 = f1 (); ++ double d287 = f1 (); ++ double d288 = f1 (); ++ double d289 = f1 (); ++ double d290 = f1 (); ++ double d291 = f1 (); ++ double d292 = f1 (); ++ double d293 = f1 (); ++ double d294 = f1 (); ++ double d295 = f1 (); ++ double d296 = f1 (); ++ double d297 = f1 (); ++ double d298 = f1 (); ++ double d299 = f1 (); ++ double d300 = f1 (); ++ double d301 = f1 (); ++ double d302 = f1 (); ++ double d303 = f1 (); ++ double d304 = f1 (); ++ double d305 = f1 (); ++ double d306 = f1 (); ++ double d307 = f1 (); ++ double d308 = f1 (); ++ double d309 = f1 (); ++ double d310 = f1 (); ++ double d311 = f1 (); ++ double d312 = f1 (); ++ double d313 = f1 (); ++ double d314 = f1 (); ++ double d315 = f1 (); ++ double d316 = f1 (); ++ double d317 = f1 (); ++ double d318 = f1 (); ++ double d319 = f1 (); ++ double d320 = f1 (); ++ double d321 = f1 (); ++ double d322 = f1 (); ++ double d323 = f1 (); ++ double d324 = f1 (); ++ double d325 = f1 (); ++ double d326 = f1 (); ++ double d327 = f1 (); ++ double d328 = f1 (); ++ double d329 = f1 (); ++ double d330 = f1 (); ++ double d331 = f1 (); ++ double d332 = f1 (); ++ double d333 = f1 (); ++ double d334 = f1 (); ++ double d335 = f1 (); ++ double d336 = f1 (); ++ double d337 = f1 (); ++ double d338 = f1 (); ++ double d339 = f1 (); ++ double d340 = f1 (); ++ double d341 = f1 (); ++ double d342 = f1 (); ++ double d343 = f1 (); ++ double d344 = f1 (); ++ double d345 = f1 (); ++ double d346 = f1 (); ++ double d347 = f1 (); ++ double d348 = f1 (); ++ double d349 = f1 (); ++ double d350 = f1 (); ++ double d351 = f1 (); ++ double d352 = f1 (); ++ double d353 = f1 (); ++ double d354 = f1 (); ++ double d355 = f1 (); ++ double d356 = f1 (); ++ double d357 = f1 (); ++ double d358 = f1 (); ++ double d359 = f1 (); ++ double d360 = f1 (); ++ double d361 = f1 (); ++ double d362 = f1 (); ++ double d363 = f1 (); ++ double d364 = f1 (); ++ double d365 = f1 (); ++ double d366 = f1 (); ++ double d367 = f1 (); ++ double d368 = f1 (); ++ double d369 = f1 (); ++ double d370 = f1 (); ++ double d371 = f1 (); ++ double d372 = f1 (); ++ double d373 = f1 (); ++ double d374 = f1 (); ++ double d375 = f1 (); ++ double d376 = f1 (); ++ double d377 = f1 (); ++ double d378 = f1 (); ++ double d379 = f1 (); ++ double d380 = f1 (); ++ double d381 = f1 (); ++ double d382 = f1 (); ++ double d383 = f1 (); ++ double d384 = f1 (); ++ double d385 = f1 (); ++ double d386 = f1 (); ++ double d387 = f1 (); ++ double d388 = f1 (); ++ double d389 = f1 (); ++ double d390 = f1 (); ++ double d391 = f1 (); ++ double d392 = f1 (); ++ double d393 = f1 (); ++ double d394 = f1 (); ++ double d395 = f1 (); ++ double d396 = f1 (); ++ double d397 = f1 (); ++ double d398 = f1 (); ++ double d399 = f1 (); ++ double d400 = f1 (); ++ double d401 = f1 (); ++ double d402 = f1 (); ++ double d403 = f1 (); ++ double d404 = f1 (); ++ double d405 = f1 (); ++ double d406 = f1 (); ++ double d407 = f1 (); ++ double d408 = f1 (); ++ double d409 = f1 (); ++ double d410 = f1 (); ++ double d411 = f1 (); ++ double d412 = f1 (); ++ double d413 = f1 (); ++ double d414 = f1 (); ++ double d415 = f1 (); ++ double d416 = f1 (); ++ double d417 = f1 (); ++ double d418 = f1 (); ++ double d419 = f1 (); ++ double d420 = f1 (); ++ double d421 = f1 (); ++ double d422 = f1 (); ++ double d423 = f1 (); ++ double d424 = f1 (); ++ double d425 = f1 (); ++ double d426 = f1 (); ++ double d427 = f1 (); ++ double d428 = f1 (); ++ double d429 = f1 (); ++ double d430 = f1 (); ++ double d431 = f1 (); ++ double d432 = f1 (); ++ double d433 = f1 (); ++ double d434 = f1 (); ++ double d435 = f1 (); ++ double d436 = f1 (); ++ double d437 = f1 (); ++ double d438 = f1 (); ++ double d439 = f1 (); ++ double d440 = f1 (); ++ double d441 = f1 (); ++ double d442 = f1 (); ++ double d443 = f1 (); ++ double d444 = f1 (); ++ double d445 = f1 (); ++ double d446 = f1 (); ++ double d447 = f1 (); ++ double d448 = f1 (); ++ double d449 = f1 (); ++ double d450 = f1 (); ++ double d451 = f1 (); ++ double d452 = f1 (); ++ double d453 = f1 (); ++ double d454 = f1 (); ++ double d455 = f1 (); ++ double d456 = f1 (); ++ double d457 = f1 (); ++ double d458 = f1 (); ++ double d459 = f1 (); ++ double d460 = f1 (); ++ double d461 = f1 (); ++ double d462 = f1 (); ++ double d463 = f1 (); ++ double d464 = f1 (); ++ double d465 = f1 (); ++ double d466 = f1 (); ++ double d467 = f1 (); ++ double d468 = f1 (); ++ double d469 = f1 (); ++ double d470 = f1 (); ++ double d471 = f1 (); ++ double d472 = f1 (); ++ double d473 = f1 (); ++ double d474 = f1 (); ++ double d475 = f1 (); ++ double d476 = f1 (); ++ double d477 = f1 (); ++ double d478 = f1 (); ++ double d479 = f1 (); ++ double d480 = f1 (); ++ double d481 = f1 (); ++ double d482 = f1 (); ++ double d483 = f1 (); ++ double d484 = f1 (); ++ double d485 = f1 (); ++ double d486 = f1 (); ++ double d487 = f1 (); ++ double d488 = f1 (); ++ double d489 = f1 (); ++ double d490 = f1 (); ++ double d491 = f1 (); ++ double d492 = f1 (); ++ double d493 = f1 (); ++ double d494 = f1 (); ++ double d495 = f1 (); ++ double d496 = f1 (); ++ double d497 = f1 (); ++ double d498 = f1 (); ++ double d499 = f1 (); ++ double d500 = f1 (); ++ double d501 = f1 (); ++ double d502 = f1 (); ++ double d503 = f1 (); ++ double d504 = f1 (); ++ double d505 = f1 (); ++ double d506 = f1 (); ++ double d507 = f1 (); ++ double d508 = f1 (); ++ double d509 = f1 (); ++ double d510 = f1 (); ++ double d511 = f1 (); ++ double d512 = f1 (); ++ double d513 = f1 (); ++ double d514 = f1 (); ++ double d515 = f1 (); ++ double d516 = f1 (); ++ double d517 = f1 (); ++ double d518 = f1 (); ++ double d519 = f1 (); ++ double d520 = f1 (); ++ double d521 = f1 (); ++ double d522 = f1 (); ++ double d523 = f1 (); ++ double d524 = f1 (); ++ double d525 = f1 (); ++ double d526 = f1 (); ++ double d527 = f1 (); ++ double d528 = f1 (); ++ double d529 = f1 (); ++ double d530 = f1 (); ++ double d531 = f1 (); ++ double d532 = f1 (); ++ double d533 = f1 (); ++ double d534 = f1 (); ++ double d535 = f1 (); ++ double d536 = f1 (); ++ double d537 = f1 (); ++ double d538 = f1 (); ++ double d539 = f1 (); ++ double d540 = f1 (); ++ double d541 = f1 (); ++ double d542 = f1 (); ++ double d543 = f1 (); ++ double d544 = f1 (); ++ double d545 = f1 (); ++ double d546 = f1 (); ++ double d547 = f1 (); ++ double d548 = f1 (); ++ double d549 = f1 (); ++ double d550 = f1 (); ++ double d551 = f1 (); ++ double d552 = f1 (); ++ double d553 = f1 (); ++ double d554 = f1 (); ++ double d555 = f1 (); ++ double d556 = f1 (); ++ double d557 = f1 (); ++ double d558 = f1 (); ++ double d559 = f1 (); ++ double d560 = f1 (); ++ double d561 = f1 (); ++ double d562 = f1 (); ++ double d563 = f1 (); ++ double d564 = f1 (); ++ double d565 = f1 (); ++ double d566 = f1 (); ++ double d567 = f1 (); ++ double d568 = f1 (); ++ double d569 = f1 (); ++ double d570 = f1 (); ++ double d571 = f1 (); ++ double d572 = f1 (); ++ double d573 = f1 (); ++ double d574 = f1 (); ++ double d575 = f1 (); ++ double d576 = f1 (); ++ double d577 = f1 (); ++ double d578 = f1 (); ++ double d579 = f1 (); ++ double d580 = f1 (); ++ double d581 = f1 (); ++ double d582 = f1 (); ++ double d583 = f1 (); ++ double d584 = f1 (); ++ double d585 = f1 (); ++ double d586 = f1 (); ++ double d587 = f1 (); ++ double d588 = f1 (); ++ double d589 = f1 (); ++ double d590 = f1 (); ++ double d591 = f1 (); ++ double d592 = f1 (); ++ double d593 = f1 (); ++ double d594 = f1 (); ++ double d595 = f1 (); ++ double d596 = f1 (); ++ double d597 = f1 (); ++ double d598 = f1 (); ++ double d599 = f1 (); ++ double d600 = f1 (); ++ double d601 = f1 (); ++ double d602 = f1 (); ++ double d603 = f1 (); ++ double d604 = f1 (); ++ double d605 = f1 (); ++ double d606 = f1 (); ++ double d607 = f1 (); ++ double d608 = f1 (); ++ double d609 = f1 (); ++ double d610 = f1 (); ++ double d611 = f1 (); ++ double d612 = f1 (); ++ double d613 = f1 (); ++ double d614 = f1 (); ++ double d615 = f1 (); ++ double d616 = f1 (); ++ double d617 = f1 (); ++ double d618 = f1 (); ++ double d619 = f1 (); ++ double d620 = f1 (); ++ double d621 = f1 (); ++ double d622 = f1 (); ++ double d623 = f1 (); ++ double d624 = f1 (); ++ double d625 = f1 (); ++ double d626 = f1 (); ++ double d627 = f1 (); ++ double d628 = f1 (); ++ double d629 = f1 (); ++ double d630 = f1 (); ++ double d631 = f1 (); ++ double d632 = f1 (); ++ double d633 = f1 (); ++ double d634 = f1 (); ++ double d635 = f1 (); ++ double d636 = f1 (); ++ double d637 = f1 (); ++ double d638 = f1 (); ++ double d639 = f1 (); ++ double d640 = f1 (); ++ double d641 = f1 (); ++ double d642 = f1 (); ++ double d643 = f1 (); ++ double d644 = f1 (); ++ double d645 = f1 (); ++ double d646 = f1 (); ++ double d647 = f1 (); ++ double d648 = f1 (); ++ double d649 = f1 (); ++ double d650 = f1 (); ++ double d651 = f1 (); ++ double d652 = f1 (); ++ double d653 = f1 (); ++ double d654 = f1 (); ++ double d655 = f1 (); ++ double d656 = f1 (); ++ double d657 = f1 (); ++ double d658 = f1 (); ++ double d659 = f1 (); ++ double d660 = f1 (); ++ double d661 = f1 (); ++ double d662 = f1 (); ++ double d663 = f1 (); ++ double d664 = f1 (); ++ double d665 = f1 (); ++ double d666 = f1 (); ++ double d667 = f1 (); ++ double d668 = f1 (); ++ double d669 = f1 (); ++ double d670 = f1 (); ++ double d671 = f1 (); ++ double d672 = f1 (); ++ double d673 = f1 (); ++ double d674 = f1 (); ++ double d675 = f1 (); ++ double d676 = f1 (); ++ double d677 = f1 (); ++ double d678 = f1 (); ++ double d679 = f1 (); ++ double d680 = f1 (); ++ double d681 = f1 (); ++ double d682 = f1 (); ++ double d683 = f1 (); ++ double d684 = f1 (); ++ double d685 = f1 (); ++ double d686 = f1 (); ++ double d687 = f1 (); ++ double d688 = f1 (); ++ double d689 = f1 (); ++ double d690 = f1 (); ++ double d691 = f1 (); ++ double d692 = f1 (); ++ double d693 = f1 (); ++ double d694 = f1 (); ++ double d695 = f1 (); ++ double d696 = f1 (); ++ double d697 = f1 (); ++ double d698 = f1 (); ++ double d699 = f1 (); ++ double d700 = f1 (); ++ double d701 = f1 (); ++ double d702 = f1 (); ++ double d703 = f1 (); ++ double d704 = f1 (); ++ double d705 = f1 (); ++ double d706 = f1 (); ++ double d707 = f1 (); ++ double d708 = f1 (); ++ double d709 = f1 (); ++ double d710 = f1 (); ++ double d711 = f1 (); ++ double d712 = f1 (); ++ double d713 = f1 (); ++ double d714 = f1 (); ++ double d715 = f1 (); ++ double d716 = f1 (); ++ double d717 = f1 (); ++ double d718 = f1 (); ++ double d719 = f1 (); ++ double d720 = f1 (); ++ double d721 = f1 (); ++ double d722 = f1 (); ++ double d723 = f1 (); ++ double d724 = f1 (); ++ double d725 = f1 (); ++ double d726 = f1 (); ++ double d727 = f1 (); ++ double d728 = f1 (); ++ double d729 = f1 (); ++ double d730 = f1 (); ++ double d731 = f1 (); ++ double d732 = f1 (); ++ double d733 = f1 (); ++ double d734 = f1 (); ++ double d735 = f1 (); ++ double d736 = f1 (); ++ double d737 = f1 (); ++ double d738 = f1 (); ++ double d739 = f1 (); ++ double d740 = f1 (); ++ double d741 = f1 (); ++ double d742 = f1 (); ++ double d743 = f1 (); ++ double d744 = f1 (); ++ double d745 = f1 (); ++ double d746 = f1 (); ++ double d747 = f1 (); ++ double d748 = f1 (); ++ double d749 = f1 (); ++ double d750 = f1 (); ++ double d751 = f1 (); ++ double d752 = f1 (); ++ double d753 = f1 (); ++ double d754 = f1 (); ++ double d755 = f1 (); ++ double d756 = f1 (); ++ double d757 = f1 (); ++ double d758 = f1 (); ++ double d759 = f1 (); ++ double d760 = f1 (); ++ double d761 = f1 (); ++ double d762 = f1 (); ++ double d763 = f1 (); ++ double d764 = f1 (); ++ double d765 = f1 (); ++ double d766 = f1 (); ++ double d767 = f1 (); ++ double d768 = f1 (); ++ double d769 = f1 (); ++ double d770 = f1 (); ++ double d771 = f1 (); ++ double d772 = f1 (); ++ double d773 = f1 (); ++ double d774 = f1 (); ++ double d775 = f1 (); ++ double d776 = f1 (); ++ double d777 = f1 (); ++ double d778 = f1 (); ++ double d779 = f1 (); ++ double d780 = f1 (); ++ double d781 = f1 (); ++ double d782 = f1 (); ++ double d783 = f1 (); ++ double d784 = f1 (); ++ double d785 = f1 (); ++ double d786 = f1 (); ++ double d787 = f1 (); ++ double d788 = f1 (); ++ double d789 = f1 (); ++ double d790 = f1 (); ++ double d791 = f1 (); ++ double d792 = f1 (); ++ double d793 = f1 (); ++ double d794 = f1 (); ++ double d795 = f1 (); ++ double d796 = f1 (); ++ double d797 = f1 (); ++ double d798 = f1 (); ++ double d799 = f1 (); ++ double d800 = f1 (); ++ double d801 = f1 (); ++ double d802 = f1 (); ++ double d803 = f1 (); ++ double d804 = f1 (); ++ double d805 = f1 (); ++ double d806 = f1 (); ++ double d807 = f1 (); ++ double d808 = f1 (); ++ double d809 = f1 (); ++ double d810 = f1 (); ++ double d811 = f1 (); ++ double d812 = f1 (); ++ double d813 = f1 (); ++ double d814 = f1 (); ++ double d815 = f1 (); ++ double d816 = f1 (); ++ double d817 = f1 (); ++ double d818 = f1 (); ++ double d819 = f1 (); ++ double d820 = f1 (); ++ double d821 = f1 (); ++ double d822 = f1 (); ++ double d823 = f1 (); ++ double d824 = f1 (); ++ double d825 = f1 (); ++ double d826 = f1 (); ++ double d827 = f1 (); ++ double d828 = f1 (); ++ double d829 = f1 (); ++ double d830 = f1 (); ++ double d831 = f1 (); ++ double d832 = f1 (); ++ double d833 = f1 (); ++ double d834 = f1 (); ++ double d835 = f1 (); ++ double d836 = f1 (); ++ double d837 = f1 (); ++ double d838 = f1 (); ++ double d839 = f1 (); ++ double d840 = f1 (); ++ double d841 = f1 (); ++ double d842 = f1 (); ++ double d843 = f1 (); ++ double d844 = f1 (); ++ double d845 = f1 (); ++ double d846 = f1 (); ++ double d847 = f1 (); ++ double d848 = f1 (); ++ double d849 = f1 (); ++ double d850 = f1 (); ++ double d851 = f1 (); ++ double d852 = f1 (); ++ double d853 = f1 (); ++ double d854 = f1 (); ++ double d855 = f1 (); ++ double d856 = f1 (); ++ double d857 = f1 (); ++ double d858 = f1 (); ++ double d859 = f1 (); ++ double d860 = f1 (); ++ double d861 = f1 (); ++ double d862 = f1 (); ++ double d863 = f1 (); ++ double d864 = f1 (); ++ double d865 = f1 (); ++ double d866 = f1 (); ++ double d867 = f1 (); ++ double d868 = f1 (); ++ double d869 = f1 (); ++ double d870 = f1 (); ++ double d871 = f1 (); ++ double d872 = f1 (); ++ double d873 = f1 (); ++ double d874 = f1 (); ++ double d875 = f1 (); ++ double d876 = f1 (); ++ double d877 = f1 (); ++ double d878 = f1 (); ++ double d879 = f1 (); ++ double d880 = f1 (); ++ double d881 = f1 (); ++ double d882 = f1 (); ++ double d883 = f1 (); ++ double d884 = f1 (); ++ double d885 = f1 (); ++ double d886 = f1 (); ++ double d887 = f1 (); ++ double d888 = f1 (); ++ double d889 = f1 (); ++ double d890 = f1 (); ++ double d891 = f1 (); ++ double d892 = f1 (); ++ double d893 = f1 (); ++ double d894 = f1 (); ++ double d895 = f1 (); ++ double d896 = f1 (); ++ double d897 = f1 (); ++ double d898 = f1 (); ++ double d899 = f1 (); ++ double d900 = f1 (); ++ double d901 = f1 (); ++ double d902 = f1 (); ++ double d903 = f1 (); ++ double d904 = f1 (); ++ double d905 = f1 (); ++ double d906 = f1 (); ++ double d907 = f1 (); ++ double d908 = f1 (); ++ double d909 = f1 (); ++ double d910 = f1 (); ++ double d911 = f1 (); ++ double d912 = f1 (); ++ double d913 = f1 (); ++ double d914 = f1 (); ++ double d915 = f1 (); ++ double d916 = f1 (); ++ double d917 = f1 (); ++ double d918 = f1 (); ++ double d919 = f1 (); ++ double d920 = f1 (); ++ double d921 = f1 (); ++ double d922 = f1 (); ++ double d923 = f1 (); ++ double d924 = f1 (); ++ double d925 = f1 (); ++ double d926 = f1 (); ++ double d927 = f1 (); ++ double d928 = f1 (); ++ double d929 = f1 (); ++ double d930 = f1 (); ++ double d931 = f1 (); ++ double d932 = f1 (); ++ double d933 = f1 (); ++ double d934 = f1 (); ++ double d935 = f1 (); ++ double d936 = f1 (); ++ double d937 = f1 (); ++ double d938 = f1 (); ++ double d939 = f1 (); ++ double d940 = f1 (); ++ double d941 = f1 (); ++ double d942 = f1 (); ++ double d943 = f1 (); ++ double d944 = f1 (); ++ double d945 = f1 (); ++ double d946 = f1 (); ++ double d947 = f1 (); ++ double d948 = f1 (); ++ double d949 = f1 (); ++ double d950 = f1 (); ++ double d951 = f1 (); ++ double d952 = f1 (); ++ double d953 = f1 (); ++ double d954 = f1 (); ++ double d955 = f1 (); ++ double d956 = f1 (); ++ double d957 = f1 (); ++ double d958 = f1 (); ++ double d959 = f1 (); ++ double d960 = f1 (); ++ double d961 = f1 (); ++ double d962 = f1 (); ++ double d963 = f1 (); ++ double d964 = f1 (); ++ double d965 = f1 (); ++ double d966 = f1 (); ++ double d967 = f1 (); ++ double d968 = f1 (); ++ double d969 = f1 (); ++ double d970 = f1 (); ++ double d971 = f1 (); ++ double d972 = f1 (); ++ double d973 = f1 (); ++ double d974 = f1 (); ++ double d975 = f1 (); ++ double d976 = f1 (); ++ double d977 = f1 (); ++ double d978 = f1 (); ++ double d979 = f1 (); ++ double d980 = f1 (); ++ double d981 = f1 (); ++ double d982 = f1 (); ++ double d983 = f1 (); ++ double d984 = f1 (); ++ double d985 = f1 (); ++ double d986 = f1 (); ++ double d987 = f1 (); ++ double d988 = f1 (); ++ double d989 = f1 (); ++ double d990 = f1 (); ++ double d991 = f1 (); ++ double d992 = f1 (); ++ double d993 = f1 (); ++ double d994 = f1 (); ++ double d995 = f1 (); ++ double d996 = f1 (); ++ double d997 = f1 (); ++ double d998 = f1 (); ++ double d999 = f1 (); ++ ++ double x = 0; ++ x = f2 (x, d000); ++ x = f2 (x, d001); ++ x = f2 (x, d002); ++ x = f2 (x, d003); ++ x = f2 (x, d004); ++ x = f2 (x, d005); ++ x = f2 (x, d006); ++ x = f2 (x, d007); ++ x = f2 (x, d008); ++ x = f2 (x, d009); ++ x = f2 (x, d010); ++ x = f2 (x, d011); ++ x = f2 (x, d012); ++ x = f2 (x, d013); ++ x = f2 (x, d014); ++ x = f2 (x, d015); ++ x = f2 (x, d016); ++ x = f2 (x, d017); ++ x = f2 (x, d018); ++ x = f2 (x, d019); ++ x = f2 (x, d020); ++ x = f2 (x, d021); ++ x = f2 (x, d022); ++ x = f2 (x, d023); ++ x = f2 (x, d024); ++ x = f2 (x, d025); ++ x = f2 (x, d026); ++ x = f2 (x, d027); ++ x = f2 (x, d028); ++ x = f2 (x, d029); ++ x = f2 (x, d030); ++ x = f2 (x, d031); ++ x = f2 (x, d032); ++ x = f2 (x, d033); ++ x = f2 (x, d034); ++ x = f2 (x, d035); ++ x = f2 (x, d036); ++ x = f2 (x, d037); ++ x = f2 (x, d038); ++ x = f2 (x, d039); ++ x = f2 (x, d040); ++ x = f2 (x, d041); ++ x = f2 (x, d042); ++ x = f2 (x, d043); ++ x = f2 (x, d044); ++ x = f2 (x, d045); ++ x = f2 (x, d046); ++ x = f2 (x, d047); ++ x = f2 (x, d048); ++ x = f2 (x, d049); ++ x = f2 (x, d050); ++ x = f2 (x, d051); ++ x = f2 (x, d052); ++ x = f2 (x, d053); ++ x = f2 (x, d054); ++ x = f2 (x, d055); ++ x = f2 (x, d056); ++ x = f2 (x, d057); ++ x = f2 (x, d058); ++ x = f2 (x, d059); ++ x = f2 (x, d060); ++ x = f2 (x, d061); ++ x = f2 (x, d062); ++ x = f2 (x, d063); ++ x = f2 (x, d064); ++ x = f2 (x, d065); ++ x = f2 (x, d066); ++ x = f2 (x, d067); ++ x = f2 (x, d068); ++ x = f2 (x, d069); ++ x = f2 (x, d070); ++ x = f2 (x, d071); ++ x = f2 (x, d072); ++ x = f2 (x, d073); ++ x = f2 (x, d074); ++ x = f2 (x, d075); ++ x = f2 (x, d076); ++ x = f2 (x, d077); ++ x = f2 (x, d078); ++ x = f2 (x, d079); ++ x = f2 (x, d080); ++ x = f2 (x, d081); ++ x = f2 (x, d082); ++ x = f2 (x, d083); ++ x = f2 (x, d084); ++ x = f2 (x, d085); ++ x = f2 (x, d086); ++ x = f2 (x, d087); ++ x = f2 (x, d088); ++ x = f2 (x, d089); ++ x = f2 (x, d090); ++ x = f2 (x, d091); ++ x = f2 (x, d092); ++ x = f2 (x, d093); ++ x = f2 (x, d094); ++ x = f2 (x, d095); ++ x = f2 (x, d096); ++ x = f2 (x, d097); ++ x = f2 (x, d098); ++ x = f2 (x, d099); ++ x = f2 (x, d100); ++ x = f2 (x, d101); ++ x = f2 (x, d102); ++ x = f2 (x, d103); ++ x = f2 (x, d104); ++ x = f2 (x, d105); ++ x = f2 (x, d106); ++ x = f2 (x, d107); ++ x = f2 (x, d108); ++ x = f2 (x, d109); ++ x = f2 (x, d110); ++ x = f2 (x, d111); ++ x = f2 (x, d112); ++ x = f2 (x, d113); ++ x = f2 (x, d114); ++ x = f2 (x, d115); ++ x = f2 (x, d116); ++ x = f2 (x, d117); ++ x = f2 (x, d118); ++ x = f2 (x, d119); ++ x = f2 (x, d120); ++ x = f2 (x, d121); ++ x = f2 (x, d122); ++ x = f2 (x, d123); ++ x = f2 (x, d124); ++ x = f2 (x, d125); ++ x = f2 (x, d126); ++ x = f2 (x, d127); ++ x = f2 (x, d128); ++ x = f2 (x, d129); ++ x = f2 (x, d130); ++ x = f2 (x, d131); ++ x = f2 (x, d132); ++ x = f2 (x, d133); ++ x = f2 (x, d134); ++ x = f2 (x, d135); ++ x = f2 (x, d136); ++ x = f2 (x, d137); ++ x = f2 (x, d138); ++ x = f2 (x, d139); ++ x = f2 (x, d140); ++ x = f2 (x, d141); ++ x = f2 (x, d142); ++ x = f2 (x, d143); ++ x = f2 (x, d144); ++ x = f2 (x, d145); ++ x = f2 (x, d146); ++ x = f2 (x, d147); ++ x = f2 (x, d148); ++ x = f2 (x, d149); ++ x = f2 (x, d150); ++ x = f2 (x, d151); ++ x = f2 (x, d152); ++ x = f2 (x, d153); ++ x = f2 (x, d154); ++ x = f2 (x, d155); ++ x = f2 (x, d156); ++ x = f2 (x, d157); ++ x = f2 (x, d158); ++ x = f2 (x, d159); ++ x = f2 (x, d160); ++ x = f2 (x, d161); ++ x = f2 (x, d162); ++ x = f2 (x, d163); ++ x = f2 (x, d164); ++ x = f2 (x, d165); ++ x = f2 (x, d166); ++ x = f2 (x, d167); ++ x = f2 (x, d168); ++ x = f2 (x, d169); ++ x = f2 (x, d170); ++ x = f2 (x, d171); ++ x = f2 (x, d172); ++ x = f2 (x, d173); ++ x = f2 (x, d174); ++ x = f2 (x, d175); ++ x = f2 (x, d176); ++ x = f2 (x, d177); ++ x = f2 (x, d178); ++ x = f2 (x, d179); ++ x = f2 (x, d180); ++ x = f2 (x, d181); ++ x = f2 (x, d182); ++ x = f2 (x, d183); ++ x = f2 (x, d184); ++ x = f2 (x, d185); ++ x = f2 (x, d186); ++ x = f2 (x, d187); ++ x = f2 (x, d188); ++ x = f2 (x, d189); ++ x = f2 (x, d190); ++ x = f2 (x, d191); ++ x = f2 (x, d192); ++ x = f2 (x, d193); ++ x = f2 (x, d194); ++ x = f2 (x, d195); ++ x = f2 (x, d196); ++ x = f2 (x, d197); ++ x = f2 (x, d198); ++ x = f2 (x, d199); ++ x = f2 (x, d200); ++ x = f2 (x, d201); ++ x = f2 (x, d202); ++ x = f2 (x, d203); ++ x = f2 (x, d204); ++ x = f2 (x, d205); ++ x = f2 (x, d206); ++ x = f2 (x, d207); ++ x = f2 (x, d208); ++ x = f2 (x, d209); ++ x = f2 (x, d210); ++ x = f2 (x, d211); ++ x = f2 (x, d212); ++ x = f2 (x, d213); ++ x = f2 (x, d214); ++ x = f2 (x, d215); ++ x = f2 (x, d216); ++ x = f2 (x, d217); ++ x = f2 (x, d218); ++ x = f2 (x, d219); ++ x = f2 (x, d220); ++ x = f2 (x, d221); ++ x = f2 (x, d222); ++ x = f2 (x, d223); ++ x = f2 (x, d224); ++ x = f2 (x, d225); ++ x = f2 (x, d226); ++ x = f2 (x, d227); ++ x = f2 (x, d228); ++ x = f2 (x, d229); ++ x = f2 (x, d230); ++ x = f2 (x, d231); ++ x = f2 (x, d232); ++ x = f2 (x, d233); ++ x = f2 (x, d234); ++ x = f2 (x, d235); ++ x = f2 (x, d236); ++ x = f2 (x, d237); ++ x = f2 (x, d238); ++ x = f2 (x, d239); ++ x = f2 (x, d240); ++ x = f2 (x, d241); ++ x = f2 (x, d242); ++ x = f2 (x, d243); ++ x = f2 (x, d244); ++ x = f2 (x, d245); ++ x = f2 (x, d246); ++ x = f2 (x, d247); ++ x = f2 (x, d248); ++ x = f2 (x, d249); ++ x = f2 (x, d250); ++ x = f2 (x, d251); ++ x = f2 (x, d252); ++ x = f2 (x, d253); ++ x = f2 (x, d254); ++ x = f2 (x, d255); ++ x = f2 (x, d256); ++ x = f2 (x, d257); ++ x = f2 (x, d258); ++ x = f2 (x, d259); ++ x = f2 (x, d260); ++ x = f2 (x, d261); ++ x = f2 (x, d262); ++ x = f2 (x, d263); ++ x = f2 (x, d264); ++ x = f2 (x, d265); ++ x = f2 (x, d266); ++ x = f2 (x, d267); ++ x = f2 (x, d268); ++ x = f2 (x, d269); ++ x = f2 (x, d270); ++ x = f2 (x, d271); ++ x = f2 (x, d272); ++ x = f2 (x, d273); ++ x = f2 (x, d274); ++ x = f2 (x, d275); ++ x = f2 (x, d276); ++ x = f2 (x, d277); ++ x = f2 (x, d278); ++ x = f2 (x, d279); ++ x = f2 (x, d280); ++ x = f2 (x, d281); ++ x = f2 (x, d282); ++ x = f2 (x, d283); ++ x = f2 (x, d284); ++ x = f2 (x, d285); ++ x = f2 (x, d286); ++ x = f2 (x, d287); ++ x = f2 (x, d288); ++ x = f2 (x, d289); ++ x = f2 (x, d290); ++ x = f2 (x, d291); ++ x = f2 (x, d292); ++ x = f2 (x, d293); ++ x = f2 (x, d294); ++ x = f2 (x, d295); ++ x = f2 (x, d296); ++ x = f2 (x, d297); ++ x = f2 (x, d298); ++ x = f2 (x, d299); ++ x = f2 (x, d300); ++ x = f2 (x, d301); ++ x = f2 (x, d302); ++ x = f2 (x, d303); ++ x = f2 (x, d304); ++ x = f2 (x, d305); ++ x = f2 (x, d306); ++ x = f2 (x, d307); ++ x = f2 (x, d308); ++ x = f2 (x, d309); ++ x = f2 (x, d310); ++ x = f2 (x, d311); ++ x = f2 (x, d312); ++ x = f2 (x, d313); ++ x = f2 (x, d314); ++ x = f2 (x, d315); ++ x = f2 (x, d316); ++ x = f2 (x, d317); ++ x = f2 (x, d318); ++ x = f2 (x, d319); ++ x = f2 (x, d320); ++ x = f2 (x, d321); ++ x = f2 (x, d322); ++ x = f2 (x, d323); ++ x = f2 (x, d324); ++ x = f2 (x, d325); ++ x = f2 (x, d326); ++ x = f2 (x, d327); ++ x = f2 (x, d328); ++ x = f2 (x, d329); ++ x = f2 (x, d330); ++ x = f2 (x, d331); ++ x = f2 (x, d332); ++ x = f2 (x, d333); ++ x = f2 (x, d334); ++ x = f2 (x, d335); ++ x = f2 (x, d336); ++ x = f2 (x, d337); ++ x = f2 (x, d338); ++ x = f2 (x, d339); ++ x = f2 (x, d340); ++ x = f2 (x, d341); ++ x = f2 (x, d342); ++ x = f2 (x, d343); ++ x = f2 (x, d344); ++ x = f2 (x, d345); ++ x = f2 (x, d346); ++ x = f2 (x, d347); ++ x = f2 (x, d348); ++ x = f2 (x, d349); ++ x = f2 (x, d350); ++ x = f2 (x, d351); ++ x = f2 (x, d352); ++ x = f2 (x, d353); ++ x = f2 (x, d354); ++ x = f2 (x, d355); ++ x = f2 (x, d356); ++ x = f2 (x, d357); ++ x = f2 (x, d358); ++ x = f2 (x, d359); ++ x = f2 (x, d360); ++ x = f2 (x, d361); ++ x = f2 (x, d362); ++ x = f2 (x, d363); ++ x = f2 (x, d364); ++ x = f2 (x, d365); ++ x = f2 (x, d366); ++ x = f2 (x, d367); ++ x = f2 (x, d368); ++ x = f2 (x, d369); ++ x = f2 (x, d370); ++ x = f2 (x, d371); ++ x = f2 (x, d372); ++ x = f2 (x, d373); ++ x = f2 (x, d374); ++ x = f2 (x, d375); ++ x = f2 (x, d376); ++ x = f2 (x, d377); ++ x = f2 (x, d378); ++ x = f2 (x, d379); ++ x = f2 (x, d380); ++ x = f2 (x, d381); ++ x = f2 (x, d382); ++ x = f2 (x, d383); ++ x = f2 (x, d384); ++ x = f2 (x, d385); ++ x = f2 (x, d386); ++ x = f2 (x, d387); ++ x = f2 (x, d388); ++ x = f2 (x, d389); ++ x = f2 (x, d390); ++ x = f2 (x, d391); ++ x = f2 (x, d392); ++ x = f2 (x, d393); ++ x = f2 (x, d394); ++ x = f2 (x, d395); ++ x = f2 (x, d396); ++ x = f2 (x, d397); ++ x = f2 (x, d398); ++ x = f2 (x, d399); ++ x = f2 (x, d400); ++ x = f2 (x, d401); ++ x = f2 (x, d402); ++ x = f2 (x, d403); ++ x = f2 (x, d404); ++ x = f2 (x, d405); ++ x = f2 (x, d406); ++ x = f2 (x, d407); ++ x = f2 (x, d408); ++ x = f2 (x, d409); ++ x = f2 (x, d410); ++ x = f2 (x, d411); ++ x = f2 (x, d412); ++ x = f2 (x, d413); ++ x = f2 (x, d414); ++ x = f2 (x, d415); ++ x = f2 (x, d416); ++ x = f2 (x, d417); ++ x = f2 (x, d418); ++ x = f2 (x, d419); ++ x = f2 (x, d420); ++ x = f2 (x, d421); ++ x = f2 (x, d422); ++ x = f2 (x, d423); ++ x = f2 (x, d424); ++ x = f2 (x, d425); ++ x = f2 (x, d426); ++ x = f2 (x, d427); ++ x = f2 (x, d428); ++ x = f2 (x, d429); ++ x = f2 (x, d430); ++ x = f2 (x, d431); ++ x = f2 (x, d432); ++ x = f2 (x, d433); ++ x = f2 (x, d434); ++ x = f2 (x, d435); ++ x = f2 (x, d436); ++ x = f2 (x, d437); ++ x = f2 (x, d438); ++ x = f2 (x, d439); ++ x = f2 (x, d440); ++ x = f2 (x, d441); ++ x = f2 (x, d442); ++ x = f2 (x, d443); ++ x = f2 (x, d444); ++ x = f2 (x, d445); ++ x = f2 (x, d446); ++ x = f2 (x, d447); ++ x = f2 (x, d448); ++ x = f2 (x, d449); ++ x = f2 (x, d450); ++ x = f2 (x, d451); ++ x = f2 (x, d452); ++ x = f2 (x, d453); ++ x = f2 (x, d454); ++ x = f2 (x, d455); ++ x = f2 (x, d456); ++ x = f2 (x, d457); ++ x = f2 (x, d458); ++ x = f2 (x, d459); ++ x = f2 (x, d460); ++ x = f2 (x, d461); ++ x = f2 (x, d462); ++ x = f2 (x, d463); ++ x = f2 (x, d464); ++ x = f2 (x, d465); ++ x = f2 (x, d466); ++ x = f2 (x, d467); ++ x = f2 (x, d468); ++ x = f2 (x, d469); ++ x = f2 (x, d470); ++ x = f2 (x, d471); ++ x = f2 (x, d472); ++ x = f2 (x, d473); ++ x = f2 (x, d474); ++ x = f2 (x, d475); ++ x = f2 (x, d476); ++ x = f2 (x, d477); ++ x = f2 (x, d478); ++ x = f2 (x, d479); ++ x = f2 (x, d480); ++ x = f2 (x, d481); ++ x = f2 (x, d482); ++ x = f2 (x, d483); ++ x = f2 (x, d484); ++ x = f2 (x, d485); ++ x = f2 (x, d486); ++ x = f2 (x, d487); ++ x = f2 (x, d488); ++ x = f2 (x, d489); ++ x = f2 (x, d490); ++ x = f2 (x, d491); ++ x = f2 (x, d492); ++ x = f2 (x, d493); ++ x = f2 (x, d494); ++ x = f2 (x, d495); ++ x = f2 (x, d496); ++ x = f2 (x, d497); ++ x = f2 (x, d498); ++ x = f2 (x, d499); ++ x = f2 (x, d500); ++ x = f2 (x, d501); ++ x = f2 (x, d502); ++ x = f2 (x, d503); ++ x = f2 (x, d504); ++ x = f2 (x, d505); ++ x = f2 (x, d506); ++ x = f2 (x, d507); ++ x = f2 (x, d508); ++ x = f2 (x, d509); ++ x = f2 (x, d510); ++ x = f2 (x, d511); ++ x = f2 (x, d512); ++ x = f2 (x, d513); ++ x = f2 (x, d514); ++ x = f2 (x, d515); ++ x = f2 (x, d516); ++ x = f2 (x, d517); ++ x = f2 (x, d518); ++ x = f2 (x, d519); ++ x = f2 (x, d520); ++ x = f2 (x, d521); ++ x = f2 (x, d522); ++ x = f2 (x, d523); ++ x = f2 (x, d524); ++ x = f2 (x, d525); ++ x = f2 (x, d526); ++ x = f2 (x, d527); ++ x = f2 (x, d528); ++ x = f2 (x, d529); ++ x = f2 (x, d530); ++ x = f2 (x, d531); ++ x = f2 (x, d532); ++ x = f2 (x, d533); ++ x = f2 (x, d534); ++ x = f2 (x, d535); ++ x = f2 (x, d536); ++ x = f2 (x, d537); ++ x = f2 (x, d538); ++ x = f2 (x, d539); ++ x = f2 (x, d540); ++ x = f2 (x, d541); ++ x = f2 (x, d542); ++ x = f2 (x, d543); ++ x = f2 (x, d544); ++ x = f2 (x, d545); ++ x = f2 (x, d546); ++ x = f2 (x, d547); ++ x = f2 (x, d548); ++ x = f2 (x, d549); ++ x = f2 (x, d550); ++ x = f2 (x, d551); ++ x = f2 (x, d552); ++ x = f2 (x, d553); ++ x = f2 (x, d554); ++ x = f2 (x, d555); ++ x = f2 (x, d556); ++ x = f2 (x, d557); ++ x = f2 (x, d558); ++ x = f2 (x, d559); ++ x = f2 (x, d560); ++ x = f2 (x, d561); ++ x = f2 (x, d562); ++ x = f2 (x, d563); ++ x = f2 (x, d564); ++ x = f2 (x, d565); ++ x = f2 (x, d566); ++ x = f2 (x, d567); ++ x = f2 (x, d568); ++ x = f2 (x, d569); ++ x = f2 (x, d570); ++ x = f2 (x, d571); ++ x = f2 (x, d572); ++ x = f2 (x, d573); ++ x = f2 (x, d574); ++ x = f2 (x, d575); ++ x = f2 (x, d576); ++ x = f2 (x, d577); ++ x = f2 (x, d578); ++ x = f2 (x, d579); ++ x = f2 (x, d580); ++ x = f2 (x, d581); ++ x = f2 (x, d582); ++ x = f2 (x, d583); ++ x = f2 (x, d584); ++ x = f2 (x, d585); ++ x = f2 (x, d586); ++ x = f2 (x, d587); ++ x = f2 (x, d588); ++ x = f2 (x, d589); ++ x = f2 (x, d590); ++ x = f2 (x, d591); ++ x = f2 (x, d592); ++ x = f2 (x, d593); ++ x = f2 (x, d594); ++ x = f2 (x, d595); ++ x = f2 (x, d596); ++ x = f2 (x, d597); ++ x = f2 (x, d598); ++ x = f2 (x, d599); ++ x = f2 (x, d600); ++ x = f2 (x, d601); ++ x = f2 (x, d602); ++ x = f2 (x, d603); ++ x = f2 (x, d604); ++ x = f2 (x, d605); ++ x = f2 (x, d606); ++ x = f2 (x, d607); ++ x = f2 (x, d608); ++ x = f2 (x, d609); ++ x = f2 (x, d610); ++ x = f2 (x, d611); ++ x = f2 (x, d612); ++ x = f2 (x, d613); ++ x = f2 (x, d614); ++ x = f2 (x, d615); ++ x = f2 (x, d616); ++ x = f2 (x, d617); ++ x = f2 (x, d618); ++ x = f2 (x, d619); ++ x = f2 (x, d620); ++ x = f2 (x, d621); ++ x = f2 (x, d622); ++ x = f2 (x, d623); ++ x = f2 (x, d624); ++ x = f2 (x, d625); ++ x = f2 (x, d626); ++ x = f2 (x, d627); ++ x = f2 (x, d628); ++ x = f2 (x, d629); ++ x = f2 (x, d630); ++ x = f2 (x, d631); ++ x = f2 (x, d632); ++ x = f2 (x, d633); ++ x = f2 (x, d634); ++ x = f2 (x, d635); ++ x = f2 (x, d636); ++ x = f2 (x, d637); ++ x = f2 (x, d638); ++ x = f2 (x, d639); ++ x = f2 (x, d640); ++ x = f2 (x, d641); ++ x = f2 (x, d642); ++ x = f2 (x, d643); ++ x = f2 (x, d644); ++ x = f2 (x, d645); ++ x = f2 (x, d646); ++ x = f2 (x, d647); ++ x = f2 (x, d648); ++ x = f2 (x, d649); ++ x = f2 (x, d650); ++ x = f2 (x, d651); ++ x = f2 (x, d652); ++ x = f2 (x, d653); ++ x = f2 (x, d654); ++ x = f2 (x, d655); ++ x = f2 (x, d656); ++ x = f2 (x, d657); ++ x = f2 (x, d658); ++ x = f2 (x, d659); ++ x = f2 (x, d660); ++ x = f2 (x, d661); ++ x = f2 (x, d662); ++ x = f2 (x, d663); ++ x = f2 (x, d664); ++ x = f2 (x, d665); ++ x = f2 (x, d666); ++ x = f2 (x, d667); ++ x = f2 (x, d668); ++ x = f2 (x, d669); ++ x = f2 (x, d670); ++ x = f2 (x, d671); ++ x = f2 (x, d672); ++ x = f2 (x, d673); ++ x = f2 (x, d674); ++ x = f2 (x, d675); ++ x = f2 (x, d676); ++ x = f2 (x, d677); ++ x = f2 (x, d678); ++ x = f2 (x, d679); ++ x = f2 (x, d680); ++ x = f2 (x, d681); ++ x = f2 (x, d682); ++ x = f2 (x, d683); ++ x = f2 (x, d684); ++ x = f2 (x, d685); ++ x = f2 (x, d686); ++ x = f2 (x, d687); ++ x = f2 (x, d688); ++ x = f2 (x, d689); ++ x = f2 (x, d690); ++ x = f2 (x, d691); ++ x = f2 (x, d692); ++ x = f2 (x, d693); ++ x = f2 (x, d694); ++ x = f2 (x, d695); ++ x = f2 (x, d696); ++ x = f2 (x, d697); ++ x = f2 (x, d698); ++ x = f2 (x, d699); ++ x = f2 (x, d700); ++ x = f2 (x, d701); ++ x = f2 (x, d702); ++ x = f2 (x, d703); ++ x = f2 (x, d704); ++ x = f2 (x, d705); ++ x = f2 (x, d706); ++ x = f2 (x, d707); ++ x = f2 (x, d708); ++ x = f2 (x, d709); ++ x = f2 (x, d710); ++ x = f2 (x, d711); ++ x = f2 (x, d712); ++ x = f2 (x, d713); ++ x = f2 (x, d714); ++ x = f2 (x, d715); ++ x = f2 (x, d716); ++ x = f2 (x, d717); ++ x = f2 (x, d718); ++ x = f2 (x, d719); ++ x = f2 (x, d720); ++ x = f2 (x, d721); ++ x = f2 (x, d722); ++ x = f2 (x, d723); ++ x = f2 (x, d724); ++ x = f2 (x, d725); ++ x = f2 (x, d726); ++ x = f2 (x, d727); ++ x = f2 (x, d728); ++ x = f2 (x, d729); ++ x = f2 (x, d730); ++ x = f2 (x, d731); ++ x = f2 (x, d732); ++ x = f2 (x, d733); ++ x = f2 (x, d734); ++ x = f2 (x, d735); ++ x = f2 (x, d736); ++ x = f2 (x, d737); ++ x = f2 (x, d738); ++ x = f2 (x, d739); ++ x = f2 (x, d740); ++ x = f2 (x, d741); ++ x = f2 (x, d742); ++ x = f2 (x, d743); ++ x = f2 (x, d744); ++ x = f2 (x, d745); ++ x = f2 (x, d746); ++ x = f2 (x, d747); ++ x = f2 (x, d748); ++ x = f2 (x, d749); ++ x = f2 (x, d750); ++ x = f2 (x, d751); ++ x = f2 (x, d752); ++ x = f2 (x, d753); ++ x = f2 (x, d754); ++ x = f2 (x, d755); ++ x = f2 (x, d756); ++ x = f2 (x, d757); ++ x = f2 (x, d758); ++ x = f2 (x, d759); ++ x = f2 (x, d760); ++ x = f2 (x, d761); ++ x = f2 (x, d762); ++ x = f2 (x, d763); ++ x = f2 (x, d764); ++ x = f2 (x, d765); ++ x = f2 (x, d766); ++ x = f2 (x, d767); ++ x = f2 (x, d768); ++ x = f2 (x, d769); ++ x = f2 (x, d770); ++ x = f2 (x, d771); ++ x = f2 (x, d772); ++ x = f2 (x, d773); ++ x = f2 (x, d774); ++ x = f2 (x, d775); ++ x = f2 (x, d776); ++ x = f2 (x, d777); ++ x = f2 (x, d778); ++ x = f2 (x, d779); ++ x = f2 (x, d780); ++ x = f2 (x, d781); ++ x = f2 (x, d782); ++ x = f2 (x, d783); ++ x = f2 (x, d784); ++ x = f2 (x, d785); ++ x = f2 (x, d786); ++ x = f2 (x, d787); ++ x = f2 (x, d788); ++ x = f2 (x, d789); ++ x = f2 (x, d790); ++ x = f2 (x, d791); ++ x = f2 (x, d792); ++ x = f2 (x, d793); ++ x = f2 (x, d794); ++ x = f2 (x, d795); ++ x = f2 (x, d796); ++ x = f2 (x, d797); ++ x = f2 (x, d798); ++ x = f2 (x, d799); ++ x = f2 (x, d800); ++ x = f2 (x, d801); ++ x = f2 (x, d802); ++ x = f2 (x, d803); ++ x = f2 (x, d804); ++ x = f2 (x, d805); ++ x = f2 (x, d806); ++ x = f2 (x, d807); ++ x = f2 (x, d808); ++ x = f2 (x, d809); ++ x = f2 (x, d810); ++ x = f2 (x, d811); ++ x = f2 (x, d812); ++ x = f2 (x, d813); ++ x = f2 (x, d814); ++ x = f2 (x, d815); ++ x = f2 (x, d816); ++ x = f2 (x, d817); ++ x = f2 (x, d818); ++ x = f2 (x, d819); ++ x = f2 (x, d820); ++ x = f2 (x, d821); ++ x = f2 (x, d822); ++ x = f2 (x, d823); ++ x = f2 (x, d824); ++ x = f2 (x, d825); ++ x = f2 (x, d826); ++ x = f2 (x, d827); ++ x = f2 (x, d828); ++ x = f2 (x, d829); ++ x = f2 (x, d830); ++ x = f2 (x, d831); ++ x = f2 (x, d832); ++ x = f2 (x, d833); ++ x = f2 (x, d834); ++ x = f2 (x, d835); ++ x = f2 (x, d836); ++ x = f2 (x, d837); ++ x = f2 (x, d838); ++ x = f2 (x, d839); ++ x = f2 (x, d840); ++ x = f2 (x, d841); ++ x = f2 (x, d842); ++ x = f2 (x, d843); ++ x = f2 (x, d844); ++ x = f2 (x, d845); ++ x = f2 (x, d846); ++ x = f2 (x, d847); ++ x = f2 (x, d848); ++ x = f2 (x, d849); ++ x = f2 (x, d850); ++ x = f2 (x, d851); ++ x = f2 (x, d852); ++ x = f2 (x, d853); ++ x = f2 (x, d854); ++ x = f2 (x, d855); ++ x = f2 (x, d856); ++ x = f2 (x, d857); ++ x = f2 (x, d858); ++ x = f2 (x, d859); ++ x = f2 (x, d860); ++ x = f2 (x, d861); ++ x = f2 (x, d862); ++ x = f2 (x, d863); ++ x = f2 (x, d864); ++ x = f2 (x, d865); ++ x = f2 (x, d866); ++ x = f2 (x, d867); ++ x = f2 (x, d868); ++ x = f2 (x, d869); ++ x = f2 (x, d870); ++ x = f2 (x, d871); ++ x = f2 (x, d872); ++ x = f2 (x, d873); ++ x = f2 (x, d874); ++ x = f2 (x, d875); ++ x = f2 (x, d876); ++ x = f2 (x, d877); ++ x = f2 (x, d878); ++ x = f2 (x, d879); ++ x = f2 (x, d880); ++ x = f2 (x, d881); ++ x = f2 (x, d882); ++ x = f2 (x, d883); ++ x = f2 (x, d884); ++ x = f2 (x, d885); ++ x = f2 (x, d886); ++ x = f2 (x, d887); ++ x = f2 (x, d888); ++ x = f2 (x, d889); ++ x = f2 (x, d890); ++ x = f2 (x, d891); ++ x = f2 (x, d892); ++ x = f2 (x, d893); ++ x = f2 (x, d894); ++ x = f2 (x, d895); ++ x = f2 (x, d896); ++ x = f2 (x, d897); ++ x = f2 (x, d898); ++ x = f2 (x, d899); ++ x = f2 (x, d900); ++ x = f2 (x, d901); ++ x = f2 (x, d902); ++ x = f2 (x, d903); ++ x = f2 (x, d904); ++ x = f2 (x, d905); ++ x = f2 (x, d906); ++ x = f2 (x, d907); ++ x = f2 (x, d908); ++ x = f2 (x, d909); ++ x = f2 (x, d910); ++ x = f2 (x, d911); ++ x = f2 (x, d912); ++ x = f2 (x, d913); ++ x = f2 (x, d914); ++ x = f2 (x, d915); ++ x = f2 (x, d916); ++ x = f2 (x, d917); ++ x = f2 (x, d918); ++ x = f2 (x, d919); ++ x = f2 (x, d920); ++ x = f2 (x, d921); ++ x = f2 (x, d922); ++ x = f2 (x, d923); ++ x = f2 (x, d924); ++ x = f2 (x, d925); ++ x = f2 (x, d926); ++ x = f2 (x, d927); ++ x = f2 (x, d928); ++ x = f2 (x, d929); ++ x = f2 (x, d930); ++ x = f2 (x, d931); ++ x = f2 (x, d932); ++ x = f2 (x, d933); ++ x = f2 (x, d934); ++ x = f2 (x, d935); ++ x = f2 (x, d936); ++ x = f2 (x, d937); ++ x = f2 (x, d938); ++ x = f2 (x, d939); ++ x = f2 (x, d940); ++ x = f2 (x, d941); ++ x = f2 (x, d942); ++ x = f2 (x, d943); ++ x = f2 (x, d944); ++ x = f2 (x, d945); ++ x = f2 (x, d946); ++ x = f2 (x, d947); ++ x = f2 (x, d948); ++ x = f2 (x, d949); ++ x = f2 (x, d950); ++ x = f2 (x, d951); ++ x = f2 (x, d952); ++ x = f2 (x, d953); ++ x = f2 (x, d954); ++ x = f2 (x, d955); ++ x = f2 (x, d956); ++ x = f2 (x, d957); ++ x = f2 (x, d958); ++ x = f2 (x, d959); ++ x = f2 (x, d960); ++ x = f2 (x, d961); ++ x = f2 (x, d962); ++ x = f2 (x, d963); ++ x = f2 (x, d964); ++ x = f2 (x, d965); ++ x = f2 (x, d966); ++ x = f2 (x, d967); ++ x = f2 (x, d968); ++ x = f2 (x, d969); ++ x = f2 (x, d970); ++ x = f2 (x, d971); ++ x = f2 (x, d972); ++ x = f2 (x, d973); ++ x = f2 (x, d974); ++ x = f2 (x, d975); ++ x = f2 (x, d976); ++ x = f2 (x, d977); ++ x = f2 (x, d978); ++ x = f2 (x, d979); ++ x = f2 (x, d980); ++ x = f2 (x, d981); ++ x = f2 (x, d982); ++ x = f2 (x, d983); ++ x = f2 (x, d984); ++ x = f2 (x, d985); ++ x = f2 (x, d986); ++ x = f2 (x, d987); ++ x = f2 (x, d988); ++ x = f2 (x, d989); ++ x = f2 (x, d990); ++ x = f2 (x, d991); ++ x = f2 (x, d992); ++ x = f2 (x, d993); ++ x = f2 (x, d994); ++ x = f2 (x, d995); ++ x = f2 (x, d996); ++ x = f2 (x, d997); ++ x = f2 (x, d998); ++ x = f2 (x, d999); ++ return x; ++} ++ ++/* { dg-final { scan-rtl-dump-times "Stack clash inline probes" 1 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash residual allocation in prologue" 1 "pro_and_epilogue" } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash not noreturn" 1 "pro_and_epilogue" } } */ ++ ++/* f3 is not a leaf ++/* { dg-final { scan-rtl-dump-times "Stack clash no frame pointer needed" 1 "pro_and_epilogue" { target { ! frame_pointer_for_non_leaf } } } } */ ++/* { dg-final { scan-rtl-dump-times "Stack clash frame pointer needed" 1 "pro_and_epilogue" { target { frame_pointer_for_non_leaf } } } } */ +diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp +index 821cea9cb33..2c669a9822f 100644 +--- a/gcc/testsuite/lib/target-supports.exp ++++ b/gcc/testsuite/lib/target-supports.exp +@@ -5421,11 +5421,15 @@ proc check_effective_target_autoincdec { } { + proc check_effective_target_supports_stack_clash_protection { } { + + # Temporary until the target bits are fully ACK'd. +-# if { [istarget aarch*-*-*] || [istarget x86_64-*-*] +-# || [istarget i?86-*-*] || [istarget s390*-*-*] ++# if { [istarget aarch*-*-*] ++# || [istarget s390*-*-*] + # || [istarget powerpc*-*-*] || [istarget rs6000*-*-*] } { + # return 1 + # } ++ ++ if { [istarget x86_64-*-*] || [istarget i?86-*-*] } { ++ return 1 ++ } + return 0 + } + |