(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
stack-check-17.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fomit-frame-pointer" } */
       3  /* { dg-require-effective-target supports_stack_clash_protection } */
       4  /* { dg-skip-if "" { *-*-* } { "-fstack-protector*" } { "" } } */
       5  
       6  
       7  
       8  int x0, x1;
       9  void f1 (void);
      10  void f2 (int, int);
      11  
      12  __attribute__ ((noreturn))
      13  void
      14  f3 (void)
      15  { 
      16    int y0 = x0;
      17    int y1 = x1;
      18    f1 ();
      19    f2 (y0, y1);
      20    while (1);
      21  }
      22  
      23  /* Verify no explicit probes.  */
      24  /* { dg-final { scan-assembler-not "or\[ql\]" } } */
      25  
      26  /* We also want to verify we did not use a push/pop sequence
      27     to probe *sp as the callee register saves are sufficient
      28     to probe *sp.
      29  
      30     y0/y1 are live across the call and thus must be allocated
      31     into either a stack slot or callee saved register.  The former
      32     would be rather dumb.  So assume it does not happen.
      33  
      34     So search for two/four pushes for the callee register saves/argument pushes
      35     (plus one for the PIC register if needed on ia32) and no pops (since the
      36     function has no reachable epilogue).  */
      37  /* { dg-final { scan-assembler-times "push\[ql\]" 2 { target { ! ia32 } } } }  */
      38  /* { dg-final { scan-assembler-times "push\[ql\]" 4 { target { ia32 && nonpic } } } }  */
      39  /* { dg-final { scan-assembler-times "push\[ql\]" 5 { target { ia32 && { ! nonpic } } } } }  */
      40  /* { dg-final { scan-assembler-not "pop" } } */
      41