summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/gcov
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/gcov')
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-1.C313
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-2.C32
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-3.C17
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-3.h31
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-4.C41
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-5.C50
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov-6.C29
-rw-r--r--gcc/testsuite/g++.dg/gcov/gcov.exp44
8 files changed, 557 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-1.C b/gcc/testsuite/g++.dg/gcov/gcov-1.C
new file mode 100644
index 000000000..c279b1452
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-1.C
@@ -0,0 +1,313 @@
+/* Check that execution counts and branch probabilities for various C
+ constructs are reported correctly by gcov. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+extern "C" void abort (void);
+
+int do_something (int i)
+{
+ return i;
+}
+
+/* Check static inline functions. */
+
+int unref_val;
+
+static inline int
+unreferenced (int i, int j)
+{
+ return i - j;
+}
+
+static inline int
+uncalled (int i, int j)
+{
+ return i * j;
+}
+
+static inline int
+called (int i, int j)
+{
+ return i + j; /* count(1) */
+}
+
+void
+call_unref ()
+{
+ if (unref_val) /* count(1) */
+ unref_val = uncalled (1, 2);
+ unref_val = called (unref_val, 4); /* count(1) */
+}
+
+
+/* Check for loops. */
+
+int for_val1;
+int for_val2;
+int for_temp;
+
+int
+test_for1 (int n)
+{
+ int i;
+ for_temp = 1; /* count(3) */
+ for (i = 0; i < n; i++) /* branch(25) */
+ /* branch(end) */
+ for_temp++; /* count(9) */
+ return for_temp; /* count(3) */
+}
+
+int
+test_for2 (int m, int n, int o)
+{
+ int i, j, k;
+ for_temp = 1; /* count(6) */
+ for (i = 0; i < n; i++) /* branch(30) */
+ /* branch(end) */
+ for (j = 0; j < m; j++) /* branch(32) */
+ /* branch(end) */
+ for (k = 0; k < o; k++) /* branch(27) */
+ /* branch(end) */
+ for_temp++; /* count(81) */
+ return for_temp; /* count(6) */
+}
+
+int
+call_for ()
+{
+ for_val1 += test_for1 (0);
+ for_val1 += test_for1 (2);
+ for_val1 += test_for1 (7);
+
+ for_val2 += test_for2 (0, 0, 0);
+ for_val2 += test_for2 (1, 0, 0);
+ for_val2 += test_for2 (1, 3, 0);
+ for_val2 += test_for2 (1, 3, 1);
+ for_val2 += test_for2 (3, 1, 5);
+ for_val2 += test_for2 (3, 7, 3);
+}
+
+/* Check the use of goto. */
+
+int goto_val;
+
+int
+test_goto1 (int f)
+{
+ /* branch(50) */
+ if (f) /* count(2) */
+ /* branch(end) */
+ goto lab1; /* count(1) */
+ return 1; /* count(1) */
+lab1:
+ return 2; /* count(1) */
+}
+
+int
+test_goto2 (int f)
+{
+ int i;
+ /* branch(7) */
+ for (i = 0; i < 10; i++) /* count(15) */
+ /* branch(end) */
+ if (i == f) goto lab2; /* count(14) */
+ return 4; /* count(1) */
+lab2:
+ return 8; /* count(1) */
+}
+
+void
+call_goto ()
+{
+ goto_val += test_goto1 (0);
+ goto_val += test_goto1 (1);
+ goto_val += test_goto2 (3);
+ goto_val += test_goto2 (30);
+}
+
+/* Check nested if-then-else statements. */
+
+int ifelse_val1;
+int ifelse_val2;
+int ifelse_val3;
+
+int
+test_ifelse1 (int i, int j)
+{
+ int result = 0;
+ /* branch(40) */
+ if (i) /* count(5) */
+ /* branch(0) */
+ if (j) /* count(3) */
+ /* branch(end) */
+ result = do_something (4); /* count(3) */
+ else
+ result = do_something (1024);
+ else
+ /* branch(50) */
+ if (j) /* count(2) */
+ /* branch(end) */
+ result = do_something (1); /* count(1) */
+ else
+ result = do_something (2); /* count(1) */
+ /* branch(80) */
+ if (i > j) /* count(5) */
+ /* branch(end) */
+ result = do_something (result*2); /* count(1) */
+ /* branch(80) */
+ if (i > 10) /* count(5) */
+ /* branch(100) */
+ if (j > 10) /* count(1) */
+ /* branch(end) */
+ result = do_something (result*4); /* count(1) */
+ return result; /* count(5) */
+}
+
+int
+test_ifelse2 (int i)
+{
+ int result = 0;
+ /* branch(83) */
+ if (!i) /* count(6) */
+ /* branch(end) */
+ result = do_something (1); /* count(1) */
+ /* branch(100) */
+ if (i == 1) /* count(6) */
+ /* branch(end) */
+ result = do_something (1024);
+ /* branch(50) */
+ if (i == 2) /* count(6) */
+ /* branch(end) */
+ result = do_something (2); /* count(3) */
+ /* branch(67) */
+ if (i == 3) /* count(6) */
+ /* branch(end) */
+ return do_something (8); /* count(2) */
+ /* branch(100) */
+ if (i == 4) /* count(4) */
+ /* branch(end) */
+ return do_something (2048);
+ return result; /* count(4) */
+}
+
+int
+test_ifelse3 (int i, int j)
+{
+ int result = 1;
+ /* branch(27 50 75) */
+ if (i > 10 && j > i && j < 20) /* count(11) */
+ /* branch(end) */
+ result = do_something (16); /* count(1) */
+ /* branch(55) */
+ if (i > 20) /* count(11) */
+ /* branch(60) */
+ if (j > i) /* count(5) */
+ /* branch(50) */
+ if (j < 30) /* count(2) */
+ /* branch(end) */
+ result = do_something (32); /* count(1) */
+ /* branch(9 10 89) */
+ if (i == 3 || j == 47 || i == j) /* count(11) */
+ /* branch(end) */
+ result = do_something (64); /* count(3) */
+ return result; /* count(11) */
+}
+
+void
+call_ifelse ()
+{
+ ifelse_val1 += test_ifelse1 (0, 2);
+ ifelse_val1 += test_ifelse1 (0, 0);
+ ifelse_val1 += test_ifelse1 (1, 2);
+ ifelse_val1 += test_ifelse1 (10, 2);
+ ifelse_val1 += test_ifelse1 (11, 11);
+
+ ifelse_val2 += test_ifelse2 (0);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (3);
+ ifelse_val2 += test_ifelse2 (3);
+
+ ifelse_val3 += test_ifelse3 (11, 19);
+ ifelse_val3 += test_ifelse3 (25, 27);
+ ifelse_val3 += test_ifelse3 (11, 22);
+ ifelse_val3 += test_ifelse3 (11, 10);
+ ifelse_val3 += test_ifelse3 (21, 32);
+ ifelse_val3 += test_ifelse3 (21, 20);
+ ifelse_val3 += test_ifelse3 (1, 2);
+ ifelse_val3 += test_ifelse3 (32, 31);
+ ifelse_val3 += test_ifelse3 (3, 0);
+ ifelse_val3 += test_ifelse3 (0, 47);
+ ifelse_val3 += test_ifelse3 (65, 65);
+}
+
+/* Check switch statements. */
+
+int switch_val, switch_m;
+
+int
+test_switch (int i, int j)
+{
+ int result = 0; /* count(5) */
+
+ /* branch(20 0 60 20) */
+ switch (i) /* count(5) */
+ /* branch(end) */
+ {
+ case 1:
+ result = do_something (2); /* count(1) */
+ break;
+ case 2:
+ result = do_something (1024);
+ break;
+ case 3:
+ case 4:
+ /* branch(67) */
+ if (j == 2) /* count(3) */
+ /* branch(end) */
+ return do_something (4); /* count(1) */
+ result = do_something (8); /* count(2) */
+ break;
+ default:
+ result = do_something (32); /* count(1) */
+ switch_m++; /* count(1) */
+ break;
+ }
+ return result; /* count(4) */
+}
+
+void
+call_switch ()
+{
+ switch_val += test_switch (1, 0);
+ switch_val += test_switch (3, 0);
+ switch_val += test_switch (3, 2);
+ switch_val += test_switch (4, 0);
+ switch_val += test_switch (16, 0);
+ switch_val += switch_m;
+}
+
+int
+main()
+{
+ call_for ();
+ call_goto ();
+ call_ifelse ();
+ call_switch ();
+ call_unref ();
+ if ((for_val1 != 12)
+ || (for_val2 != 87)
+ || (goto_val != 15)
+ || (ifelse_val1 != 31)
+ || (ifelse_val2 != 23)
+ || (ifelse_val3 != 246)
+ || (switch_val != 55)
+ || (unref_val != 4))
+ abort ();
+ return 0;
+}
+
+/* { dg-final { run-gcov branches { -b gcov-1.C } } } */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-2.C b/gcc/testsuite/g++.dg/gcov/gcov-2.C
new file mode 100644
index 000000000..66d8af39b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-2.C
@@ -0,0 +1,32 @@
+/* Verify line coverage counts for simple member functions. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+class C {
+public:
+ C()
+ {
+ i = 0; /* count(1) */
+ }
+ ~C() {}
+ void seti (int j)
+ {
+ i = j; /* count(1) */
+ }
+private:
+ int i;
+};
+
+void foo()
+{
+ C c; /* count(1) */
+ c.seti (1); /* count(1) */
+}
+
+int main()
+{
+ foo(); /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-2.C } } */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-3.C b/gcc/testsuite/g++.dg/gcov/gcov-3.C
new file mode 100644
index 000000000..aff063a4b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-3.C
@@ -0,0 +1,17 @@
+/* Check that gcov doesn't abort when a static object is defined
+ within a header file. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+#include "gcov-3.h"
+
+extern int foo();
+
+int
+main ()
+{
+ return foo(); /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-3.C } } */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-3.h b/gcc/testsuite/g++.dg/gcov/gcov-3.h
new file mode 100644
index 000000000..1c7ca00dd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-3.h
@@ -0,0 +1,31 @@
+/* Leave unused lines for at least the length of the including source file. */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct T {
+ int i;
+ T() { i = 0; }
+};
+
+T t;
+
+int foo()
+{
+ return t.i; /* count(1) */
+}
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-4.C b/gcc/testsuite/g++.dg/gcov/gcov-4.C
new file mode 100644
index 000000000..2f83ff1be
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-4.C
@@ -0,0 +1,41 @@
+/* Check that execution counts and branch probabilities for various C
+ constructs are reported correctly by gcov. */
+
+#include <stdio.h>
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fno-exceptions" } */
+/* { dg-do run { target native } } */
+
+class foo {
+public:
+ foo() { printf("foo()\n"); };
+ ~foo() { printf("~foo()\n"); };
+ void method(void) { printf("method()\n"); };
+};
+
+int func(int i, int j) __attribute__((noinline));
+
+int func(int i, int j){
+ if (j) {
+ printf("unreachable\n");
+ return 3;
+ }
+
+ foo f;
+
+ if (i == 1) {
+ f.method();
+ f.method();
+ } else {
+ f.method();
+ printf("unreachable\n");
+ return 2; /* count(#####) */
+ }
+ f.method();
+ return 0;
+}
+
+int main() {
+ return func(1, 0);
+}
+/* { dg-final { run-gcov gcov-4.C } } */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-5.C b/gcc/testsuite/g++.dg/gcov/gcov-5.C
new file mode 100644
index 000000000..9ada41802
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-5.C
@@ -0,0 +1,50 @@
+/* Check that execution counts for template functions
+ are reported correctly by gcov. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fno-inline" } */
+/* { dg-do run { target native } } */
+
+class A {
+ int count;
+ public:
+ A(int c) { count = c; }
+ void func(void) { printf("func\n"); }
+ bool done(void) {
+ return (count == 0) ? true : (count-- != 0);
+ }
+ void run(void) { abort(); }
+};
+
+//typedef A T;
+template<class T>
+void WithoutBrace(T *a) {
+ while (!a->done())
+ a->run(); /* count(#####) */
+} /* count(1) */
+
+template<class T>
+void WithBrace(T *a)
+{
+ while (!a->done())
+ {
+ a->run(); /* count(#####) */
+ }
+} /* count(1) */
+
+A *func(A *a)
+{
+ WithoutBrace(a);
+ WithBrace(a);
+ return a;
+}
+
+int main() {
+ A a(0);
+ func(&a);
+ return 0;
+}
+
+/* { dg-final { run-gcov gcov-5.C } } */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-6.C b/gcc/testsuite/g++.dg/gcov/gcov-6.C
new file mode 100644
index 000000000..53a2b20bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov-6.C
@@ -0,0 +1,29 @@
+// PR gcov-profile/34609
+// { dg-do compile }
+// { dg-options "-O -ftest-coverage" }
+
+struct A
+{
+ int i;
+ int &get () { return i; }
+};
+
+inline A foo ()
+{
+ A a;
+ a.get ();
+ return a;
+}
+
+inline A bar ()
+{
+ return foo ();
+}
+
+void baz ()
+{
+ A a;
+ a = bar ();
+}
+
+// { dg-final { cleanup-coverage-files } }
diff --git a/gcc/testsuite/g++.dg/gcov/gcov.exp b/gcc/testsuite/g++.dg/gcov/gcov.exp
new file mode 100644
index 000000000..08e00c45d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gcov/gcov.exp
@@ -0,0 +1,44 @@
+# Copyright (C) 1997, 2001, 2002, 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Gcov test driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib gcov.exp
+
+global GXX_UNDER_TEST
+
+# Find gcov in the same directory as $GXX_UNDER_TEST.
+if { ![is_remote host] && [string match "*/*" [lindex $GXX_UNDER_TEST 0]] } {
+ set GCOV [file dirname [lindex $GXX_UNDER_TEST 0]]/gcov
+} else {
+ set GCOV gcov
+}
+
+# Initialize harness.
+dg-init
+
+# Delete old .gcda files.
+set files [glob -nocomplain gcov-*.gcda]
+if { $files != "" } {
+ eval "remote_file build delete $files"
+}
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" ""
+
+dg-finish