This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Wrong coverage attribution.
- From: "Seongbae Park (박성배, 朴成培)" <seongbae dot park at gmail dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>, "Janis Johnson" <janis187 at us dot ibm dot com>, mark at codesourcery dot com, nathan at codesourcery dot com
- Date: Thu, 26 Jul 2007 16:09:06 -0700
- Subject: [PATCH] Wrong coverage attribution.
Hi,
gcc/ChangeLog:
2007-07-26 Seongbae Park <seongbae.park@gmail.com>
* tree-eh.c (lower_try_finally_onedest): Reset the locus of moved goto.
gcc/testsuite/ChangeLog:
2007-07-26 Seongbae Park <seongbae.park@gmail.com>
* lib/gcov.exp (verify-lines): Recognize - and # as possible count.
* g++.dg/gcov/gcov-4.C: New test.
Attached patch fixes the problem shown in the testcase
- this testcase fails in the current mainline
because of GOTO moved to a different block during eh lowering.
Bootstrap and regtest are in progress.
If all tests look clean,
ok for mainline and 4.2 branch ?
--
#pragma ident "Seongbae Park, compiler, http://seongbae.blogspot.com"
Index: gcc/testsuite/g++.dg/gcov/gcov-4.C
===================================================================
--- gcc/testsuite/g++.dg/gcov/gcov-4.C (revision 0)
+++ gcc/testsuite/g++.dg/gcov/gcov-4.C (revision 0)
@@ -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 } } */
Index: gcc/testsuite/lib/gcov.exp
===================================================================
--- gcc/testsuite/lib/gcov.exp (revision 126963)
+++ gcc/testsuite/lib/gcov.exp (working copy)
@@ -42,7 +42,9 @@ proc verify-lines { testcase file } {
set failed 0
set fd [open $file r]
while { [gets $fd line] >= 0 } {
- if [regexp "^ *(\[^:]*): *(\[0-9\]+):.*count\\((\[0-9\]+)\\)" \
+ # We want to match both "-" and "#####" as count as well as numbers,
+ # since we want to detect lines that shouldn't be marked as covered.
+ if [regexp "^ *(\[^:]*): *(\[0-9\\-#]+):.*count\\((\[0-9\\-#]+)\\)" \
"$line" all is n shouldbe] {
if { $is == "" } {
fail "$n:no data available for this line"
Index: gcc/tree-eh.c
===================================================================
--- gcc/tree-eh.c (revision 126963)
+++ gcc/tree-eh.c (working copy)
@@ -999,6 +999,9 @@ lower_try_finally_onedest (struct leh_st
}
}
+ /* Reset the locus of the goto since we're moving
+ goto to a different block which might be on a different line. */
+ SET_EXPR_LOCUS (tf->goto_queue[0].cont_stmt, NULL);
append_to_statement_list (tf->goto_queue[0].cont_stmt, tf->top_p);
maybe_record_in_goto_queue (state, tf->goto_queue[0].cont_stmt);
}