OSDN Git Service

Test gcov output for functions that use longjmp.
authorjanis <janis@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Sep 2001 16:42:54 +0000 (16:42 +0000)
committerjanis <janis@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Sep 2001 16:42:54 +0000 (16:42 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45468 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/gcc.misc-tests/gcov-7.c [new file with mode: 0644]

diff --git a/gcc/testsuite/gcc.misc-tests/gcov-7.c b/gcc/testsuite/gcc.misc-tests/gcov-7.c
new file mode 100644 (file)
index 0000000..e0ed7a3
--- /dev/null
@@ -0,0 +1,84 @@
+/* Check that gcov correctly reports line counts, branch percentages,
+ * and call return percentages for functions that call longjmp. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+#include <setjmp.h>
+
+jmp_buf env;
+int val;
+int longjmp_taken;
+int bar_enter, bar_exit;
+int foo_enter, foo_exit;
+
+void bar (int i)
+{
+  bar_enter++;                         /* count(3) */
+                                       /* branch(67) */
+  if (i == 0) {
+                                       /* branch(end) */
+      longjmp_taken++;                 /* count(1) */
+      longjmp (env, 1);
+    }
+  val += i+1;
+  bar_exit++;                          /* count(2) */
+}
+
+void foo (int i)
+{
+  foo_enter++;                         /* count(3) */
+                                       /* branch(67) */
+  if (i == 1) {
+                                       /* branch(end) */
+      longjmp_taken++;                 /* count(1) */
+      longjmp (env, 2);
+    }
+                                       /* returns(50) */
+  bar (i);                             /* count(2) */
+                                       /* returns(100) */
+  bar (7);                             /* count(1) */
+                                       /* returns(end) */
+  val += 16;
+  foo_exit++;                          /* count(1) */
+}
+
+int
+passed ()
+{
+  return (val == 31 &&
+          longjmp_taken == 2 &&
+         foo_enter == 3 &&
+         foo_exit == 1 &&
+         bar_enter == 3 &&
+         bar_exit == 2);
+       
+}
+
+void
+leave (int i)
+{
+  if (i == 0) {
+      abort ();
+    }
+  exit (0);
+}
+
+int
+main()
+{
+  int retval;
+
+                                       /* branch(33) */
+  if ((retval = setjmp (env))) {
+                                       /* branch(end) */
+      val += retval;                   /* count(2) */
+    }
+                                       /* returns(33) */
+  foo (val);                           /* count(3) */
+                                       /* returns(0) */
+  leave (passed());                    /* count(1) */
+                                       /* returns(end) */
+}
+
+/* { dg-final { run-gcov -b gcov-7.c } } */