(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.misc-tests/
gcov-7.c
       1  /* Check that gcov correctly reports line counts, branch percentages,
       2   * and call return percentages for functions that call longjmp. */
       3  
       4  /* { dg-options "-fprofile-arcs -ftest-coverage" } */
       5  /* { dg-do run { target native } } */
       6  
       7  #include <setjmp.h>
       8  
       9  extern void abort (void);
      10  extern void exit (int);
      11  
      12  jmp_buf env;
      13  int val;
      14  int longjmp_taken;
      15  int bar_enter, bar_exit;
      16  int foo_enter, foo_exit;
      17  
      18  void bar (int i)
      19  {
      20    bar_enter++;				/* count(3) */
      21  					/* branch(67) */
      22    if (i == 0) {
      23      					/* branch(end) */
      24        longjmp_taken++;			/* count(1) */
      25        longjmp (env, 1);
      26      }
      27    val += i+1;
      28    bar_exit++;				/* count(2) */
      29  }
      30  
      31  void foo (int i)
      32  {
      33    foo_enter++;				/* count(3) */
      34  					/* branch(67) */
      35    if (i == 1) {
      36  					/* branch(end) */
      37        longjmp_taken++;			/* count(1) */
      38        longjmp (env, 2);
      39      }
      40  					/* returns(50) */
      41    bar (i);				/* count(2) */
      42  					/* returns(100) */
      43    bar (7);				/* count(1) */
      44  					/* returns(end) */
      45    val += 16;
      46    foo_exit++;				/* count(1) */
      47  }
      48  
      49  int
      50  passed ()
      51  {
      52    return (val == 31 &&
      53            longjmp_taken == 2 &&
      54  	  foo_enter == 3 &&
      55  	  foo_exit == 1 &&
      56  	  bar_enter == 3 &&
      57  	  bar_exit == 2);
      58  	
      59  }
      60  
      61  void
      62  leave (int i)
      63  {
      64    if (i == 0) {
      65        abort ();
      66      }
      67    exit (0);
      68  }
      69  
      70  int
      71  main()
      72  {
      73    int retval;
      74  
      75  					/* branch(33) */
      76    if ((retval = setjmp (env))) {
      77  					/* branch(end) */
      78        val += retval;			/* count(2) */
      79      }
      80  					/* returns(33) */
      81    foo (val);				/* count(3) */
      82  					/* returns(0) */
      83    leave (passed());			/* count(1) */
      84  					/* returns(end) */
      85  }
      86  
      87  /* { dg-final { run-gcov calls branches { -b gcov-7.c } } } */