From a5dd9529f9232b8d901a4d6eb9ae54cae179e5b3 Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Wed, 7 Mar 2018 14:18:55 +0100 Subject: [PATCH] geninfo: Add gcc 8 support Fix errors and incorrect data when trying to collect coverage data for programs compiled with gcc 8. Covers the following gcov-related changes in gcc: .gcov-file format: - Line coverage data can appear multiple times for the same line - Line coverage count can be suffixed by '*' to indicated unexecuted basic blocks in that line .gcno-file format: - new header field 'support unexecuted blocks flag' - new function record fields 'column number', 'ending line number', and 'compiler-generated entity flag' Signed-off-by: Peter Oberparleiter --- bin/geninfo | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/bin/geninfo b/bin/geninfo index 8562560..ef6a818 100755 --- a/bin/geninfo +++ b/bin/geninfo @@ -68,6 +68,7 @@ our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $gcov_tool = "gcov"; our $tool_name = basename($0); +our $GCOV_VERSION_8_0_0 = 0x80000; our $GCOV_VERSION_4_7_0 = 0x40700; our $GCOV_VERSION_3_4_0 = 0x30400; our $GCOV_VERSION_3_3_0 = 0x30300; @@ -1934,6 +1935,9 @@ sub read_gcov_file($) { my ($count, $line, $code) = ($1, $2, $3); + # Skip instance-specific counts + next if ($line == $last_line); + $last_line = $line; $last_block = $UNNAMED_BLOCK; # Check for exclusion markers @@ -1963,6 +1967,9 @@ sub read_gcov_file($) } } + # Strip unexecuted basic block marker + $count =~ s/\*$//; + # :: if ($line eq "0") { @@ -3537,6 +3544,10 @@ sub read_gcno_function_record(*$$$$$) graph_expect("function name"); $function = read_gcno_string($handle, $big_endian); return undef if (!defined($function)); + if ($version >= $GCOV_VERSION_8_0_0) { + graph_skip($handle, 4, "compiler-generated entity flag") + or return undef; + } # Read filename graph_expect("filename"); $filename = read_gcno_string($handle, $big_endian); @@ -3544,6 +3555,11 @@ sub read_gcno_function_record(*$$$$$) # Read first line number $lineno = read_gcno_value($handle, $big_endian, "initial line number"); return undef if (!defined($lineno)); + # Skip column and ending line number + if ($version >= $GCOV_VERSION_8_0_0) { + graph_skip($handle, 4, "column number") or return undef; + graph_skip($handle, 4, "ending line number") or return undef; + } # Add to list push(@{$bb->{$function}->{$filename}}, $lineno); graph_add_order($fileorder, $function, $filename); @@ -3631,6 +3647,10 @@ sub read_gcno($) debug(sprintf("found version 0x%08x\n", $version)); # Skip stamp graph_skip(*HANDLE, 4, "file timestamp") or goto incomplete; + if ($version >= $GCOV_VERSION_8_0_0) { + graph_skip(*HANDLE, 4, "support unexecuted blocks flag") + or goto incomplete; + } while (!eof(HANDLE)) { my $next_pos; my $curr_pos;