1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
From a5dd9529f9232b8d901a4d6eb9ae54cae179e5b3 Mon Sep 17 00:00:00 2001
From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
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 <oberpar@linux.vnet.ibm.com>
---
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/\*$//;
+
# <exec count>:<line number>:<source code>
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;
|