summaryrefslogtreecommitdiff
blob: b67ca411bdaf70462cbc2bbb483355a24de258a2 (plain)
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;