Make groups more generic (PR gcov-profile/84548).

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
This commit is contained in:
Martin Liska 2018-02-27 15:11:08 +01:00 committed by Martin Liska
parent 23c3a05908
commit e59b5e24ea
4 changed files with 39 additions and 2 deletions

View 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

View 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];

View 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

View File

@ -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 } }