Make groups more generic (PR gcov-profile/84548).
authorMartin Liska <mliska@suse.cz>
Tue, 27 Feb 2018 14:11:08 +0000 (15:11 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 27 Feb 2018 14:11:08 +0000 (14:11 +0000)
2018-02-27  Martin Liska  <mliska@suse.cz>

PR gcov-profile/84548
* gcov.c (process_file): Allow partial overlap and consider it
also as group functions.
(output_lines): Properly calculate range of lines for a group.
2018-02-27  Martin Liska  <mliska@suse.cz>

PR gcov-profile/84548
* g++.dg/gcov/pr84548.C: New test.

From-SVN: r258033

gcc/ChangeLog
gcc/gcov.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gcov/pr84548.C [new file with mode: 0644]

index 1a8edf3c3442fe4ad46ab106e6bab979e32384ce..a230b12df57f014a9bc3ae99a4767434f3acdc1d 100644 (file)
@@ -1,3 +1,10 @@
+2018-02-27  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/84548
+       * gcov.c (process_file): Allow partial overlap and consider it
+       also as group functions.
+       (output_lines): Properly calculate range of lines for a group.
+
 2018-02-27  Martin Liska  <mliska@suse.cz>
 
        * timevar.c (timer::print_row): Remove 'usr', 'sys', 'wall' and
index 37f431c0e91b43cb5477da0c462b26f208a209e0..6bbfe33ca336d7d3241f8072888344fdeb7b4a23 100644 (file)
@@ -1151,7 +1151,6 @@ process_file (const char *file_name)
        function_info **slot = fn_map.get (needle);
        if (slot)
          {
-           gcc_assert ((*slot)->end_line == (*it)->end_line);
            (*slot)->is_group = 1;
            (*it)->is_group = 1;
          }
@@ -2957,7 +2956,14 @@ output_lines (FILE *gcov_file, const source_info *src)
        {
          fns = src->get_functions_at_location (line_num);
          if (fns.size () > 1)
-           line_start_group = fns[0]->end_line;
+           {
+             /* It's possible to have functions that partially overlap,
+                thus take the maximum end_line of functions starting
+                at LINE_NUM.  */
+             for (unsigned i = 0; i < fns.size (); i++)
+               if (fns[i]->end_line > line_start_group)
+                 line_start_group = fns[i]->end_line;
+           }
          else if (fns.size () == 1)
            {
              function_info *fn = fns[0];
index 84ac3ee6046c98e20f46057dbe93afaa948df680..6506d8f4c6be0ece69b9250d832572547a36be43 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-27  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/84548
+       * g++.dg/gcov/pr84548.C: New test.
+
 2018-02-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/84575
diff --git a/gcc/testsuite/g++.dg/gcov/pr84548.C b/gcc/testsuite/g++.dg/gcov/pr84548.C
new file mode 100644 (file)
index 0000000..6c22c19
--- /dev/null
@@ -0,0 +1,19 @@
+// PR gcov-profile/84548
+// { dg-options "-fprofile-arcs -ftest-coverage" }
+// { dg-do run { target native } }
+// TODO: add support for groups to gcov.exp script
+
+struct A { static int foo () { return 1; }; static int bar () {
+  int x;
+  return 2; } };
+
+int main()
+{
+  int a = A::foo () + A::bar ();
+  if (a != 3)
+    return 1;
+
+  return 0;
+}
+
+// { dg-final { run-gcov remove-gcda pr84548.C } }