annotate gcc/gcov.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Gcov.c: prepend line execution counts and branch probabilities to a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 source file.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 1990-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 Contributed by James E. Wilson of Cygnus Support.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 Mangled by Bob Manson of Cygnus Support.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 Mangled further by Nathan Sidwell <nathan@codesourcery.com>
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Gcov is free software; you can redistribute it and/or modify
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 Gcov is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 along with Gcov; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 /* ??? Print a list of the ten blocks with the highest execution counts,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 and list the line numbers corresponding to those blocks. Also, perhaps
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 list the line numbers with the highest execution counts, only printing
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 the first if there are several which are all listed in the same block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 /* ??? Should have an option to print the number of basic blocks, and the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 percent of them that are covered. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 /* Need an option to show individual block counts, and show
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 probabilities of fall through arcs. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 #include "config.h"
111
kono
parents: 67
diff changeset
34 #define INCLUDE_ALGORITHM
kono
parents: 67
diff changeset
35 #define INCLUDE_VECTOR
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
36 #define INCLUDE_STRING
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
37 #define INCLUDE_MAP
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
38 #define INCLUDE_SET
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 #include "coretypes.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 #include "tm.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 #include "intl.h"
111
kono
parents: 67
diff changeset
43 #include "diagnostic.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 #include "version.h"
111
kono
parents: 67
diff changeset
45 #include "demangle.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46 #include "color-macros.h"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
47 #include "pretty-print.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48 #include "json.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 #include <zlib.h>
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 #include <getopt.h>
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
111
kono
parents: 67
diff changeset
53 #include "md5.h"
kono
parents: 67
diff changeset
54
kono
parents: 67
diff changeset
55 using namespace std;
kono
parents: 67
diff changeset
56
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 #define IN_GCOV 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 #include "gcov-io.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 #include "gcov-io.c"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 /* The gcno file is generated by -ftest-coverage option. The gcda file is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 generated by a program compiled with -fprofile-arcs. Their formats
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 are documented in gcov-io.h. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 /* The functions in this file for creating and solution program flow graphs
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 are very similar to functions in the gcc source file profile.c. In
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 some places we make use of the knowledge of how profile.c works to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 select particular algorithms here. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
111
kono
parents: 67
diff changeset
70 /* The code validates that the profile information read in corresponds
kono
parents: 67
diff changeset
71 to the code currently being compiled. Rather than checking for
kono
parents: 67
diff changeset
72 identical files, the code below compares a checksum on the CFG
kono
parents: 67
diff changeset
73 (based on the order of basic blocks and the arcs in the CFG). If
kono
parents: 67
diff changeset
74 the CFG checksum in the gcda file match the CFG checksum in the
kono
parents: 67
diff changeset
75 gcno file, the profile data will be used. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
111
kono
parents: 67
diff changeset
77 /* This is the size of the buffer used to read in source file lines. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79 class function_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 class block_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
81 class source_info;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 /* Describes an arc between two basic blocks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 struct arc_info
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 /* source and destination blocks. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88 class block_info *src;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89 class block_info *dst;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 /* transition counts. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 gcov_type count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 /* used in cycle search, so that we do not clobber original counts. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 gcov_type cs_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 unsigned int count_valid : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 unsigned int on_tree : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 unsigned int fake : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 unsigned int fall_through : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
111
kono
parents: 67
diff changeset
101 /* Arc to a catch handler. */
kono
parents: 67
diff changeset
102 unsigned int is_throw : 1;
kono
parents: 67
diff changeset
103
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 /* Arc is for a function that abnormally returns. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 unsigned int is_call_non_return : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 /* Arc is for catch/setjmp. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 unsigned int is_nonlocal_return : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 /* Is an unconditional branch. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 unsigned int is_unconditional : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 /* Loop making arc. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 unsigned int cycle : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 /* Links to next arc on src and dst lists. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 struct arc_info *succ_next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 struct arc_info *pred_next;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
111
kono
parents: 67
diff changeset
121 /* Describes which locations (lines and files) are associated with
kono
parents: 67
diff changeset
122 a basic block. */
kono
parents: 67
diff changeset
123
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
124 class block_location_info
111
kono
parents: 67
diff changeset
125 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 public:
111
kono
parents: 67
diff changeset
127 block_location_info (unsigned _source_file_idx):
kono
parents: 67
diff changeset
128 source_file_idx (_source_file_idx)
kono
parents: 67
diff changeset
129 {}
kono
parents: 67
diff changeset
130
kono
parents: 67
diff changeset
131 unsigned source_file_idx;
kono
parents: 67
diff changeset
132 vector<unsigned> lines;
kono
parents: 67
diff changeset
133 };
kono
parents: 67
diff changeset
134
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 /* Describes a basic block. Contains lists of arcs to successor and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 predecessor blocks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 class block_info
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 public:
111
kono
parents: 67
diff changeset
141 /* Constructor. */
kono
parents: 67
diff changeset
142 block_info ();
kono
parents: 67
diff changeset
143
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 /* Chain of exit and entry arcs. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 arc_info *succ;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 arc_info *pred;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 /* Number of unprocessed exit and entry arcs. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 gcov_type num_succ;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 gcov_type num_pred;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
111
kono
parents: 67
diff changeset
152 unsigned id;
kono
parents: 67
diff changeset
153
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 /* Block execution count. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 gcov_type count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 unsigned count_valid : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 unsigned valid_chain : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 unsigned invalid_chain : 1;
111
kono
parents: 67
diff changeset
159 unsigned exceptional : 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 /* Block is a call instrumenting site. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 unsigned is_call_site : 1; /* Does the call. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 unsigned is_call_return : 1; /* Is the return. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 /* Block is a landing pad for longjmp or throw. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 unsigned is_nonlocal_return : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
111
kono
parents: 67
diff changeset
168 vector<block_location_info> locations;
kono
parents: 67
diff changeset
169
kono
parents: 67
diff changeset
170 struct
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 {
111
kono
parents: 67
diff changeset
172 /* Single line graph cycle workspace. Used for all-blocks
kono
parents: 67
diff changeset
173 mode. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 arc_info *arc;
111
kono
parents: 67
diff changeset
175 unsigned ident;
kono
parents: 67
diff changeset
176 } cycle; /* Used in all-blocks mode, after blocks are linked onto
kono
parents: 67
diff changeset
177 lines. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 /* Temporary chain for solving graph, and for chaining blocks on one
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 line. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 class block_info *chain;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
111
kono
parents: 67
diff changeset
185 block_info::block_info (): succ (NULL), pred (NULL), num_succ (0), num_pred (0),
kono
parents: 67
diff changeset
186 id (0), count (0), count_valid (0), valid_chain (0), invalid_chain (0),
kono
parents: 67
diff changeset
187 exceptional (0), is_call_site (0), is_call_return (0), is_nonlocal_return (0),
kono
parents: 67
diff changeset
188 locations (), chain (NULL)
kono
parents: 67
diff changeset
189 {
kono
parents: 67
diff changeset
190 cycle.arc = NULL;
kono
parents: 67
diff changeset
191 }
kono
parents: 67
diff changeset
192
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
193 /* Describes a single line of source. Contains a chain of basic blocks
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 with code on it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
195
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 class line_info
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
197 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 public:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
199 /* Default constructor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
200 line_info ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
201
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
202 /* Return true when NEEDLE is one of basic blocks the line belongs to. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
203 bool has_block (block_info *needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
204
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
205 /* Execution count. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
206 gcov_type count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
207
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
208 /* Branches from blocks that end on this line. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
209 vector<arc_info *> branches;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
210
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 /* blocks which start on this line. Used in all-blocks mode. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
212 vector<block_info *> blocks;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
213
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
214 unsigned exists : 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
215 unsigned unexceptional : 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
216 unsigned has_unexecuted_block : 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
217 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
218
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
219 line_info::line_info (): count (0), branches (), blocks (), exists (false),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
220 unexceptional (0), has_unexecuted_block (0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
221 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
222 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
223
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
224 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
225 line_info::has_block (block_info *needle)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
226 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
227 return std::find (blocks.begin (), blocks.end (), needle) != blocks.end ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
228 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
229
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 /* Output demangled function names. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 static int flag_demangled_names = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 /* Describes a single function. Contains an array of basic blocks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 class function_info
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238 public:
111
kono
parents: 67
diff changeset
239 function_info ();
kono
parents: 67
diff changeset
240 ~function_info ();
kono
parents: 67
diff changeset
241
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
242 /* Return true when line N belongs to the function in source file SRC_IDX.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
243 The line must be defined in body of the function, can't be inlined. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
244 bool group_line_p (unsigned n, unsigned src_idx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
245
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
246 /* Function filter based on function_info::artificial variable. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
247
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
248 static inline bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
249 is_artificial (function_info *fn)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
251 return fn->artificial;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
252 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
253
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 /* Name of function. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 char *m_name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 char *m_demangled_name;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 unsigned ident;
111
kono
parents: 67
diff changeset
258 unsigned lineno_checksum;
kono
parents: 67
diff changeset
259 unsigned cfg_checksum;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
111
kono
parents: 67
diff changeset
261 /* The graph contains at least one fake incoming edge. */
kono
parents: 67
diff changeset
262 unsigned has_catch : 1;
kono
parents: 67
diff changeset
263
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
264 /* True when the function is artificial and does not exist
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
265 in a source file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
266 unsigned artificial : 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
267
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
268 /* True when multiple functions start at a line in a source file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
269 unsigned is_group : 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
270
111
kono
parents: 67
diff changeset
271 /* Array of basic blocks. Like in GCC, the entry block is
kono
parents: 67
diff changeset
272 at blocks[0] and the exit block is at blocks[1]. */
kono
parents: 67
diff changeset
273 #define ENTRY_BLOCK (0)
kono
parents: 67
diff changeset
274 #define EXIT_BLOCK (1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
275 vector<block_info> blocks;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 unsigned blocks_executed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 /* Raw arc coverage counts. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 vector<gcov_type> counts;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 /* First line number. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 unsigned start_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284 /* First line column. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285 unsigned start_column;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
286
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
287 /* Last line number. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
288 unsigned end_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
289
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290 /* Last line column. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
291 unsigned end_column;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
292
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
293 /* Index of source file where the function is defined. */
111
kono
parents: 67
diff changeset
294 unsigned src;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
296 /* Vector of line information. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
297 vector<line_info> lines;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 /* Next function. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 class function_info *next;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 /* Get demangled name of a function. The demangled name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 is converted when it is used for the first time. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 char *get_demangled_name ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
306 if (m_demangled_name == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
307 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
308 m_demangled_name = cplus_demangle (m_name, DMGL_PARAMS);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
309 if (!m_demangled_name)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
310 m_demangled_name = m_name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 return m_demangled_name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 /* Get name of the function based on flag_demangled_names. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 char *get_name ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
318 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
319 return flag_demangled_names ? get_demangled_name () : m_name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
320 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
321
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
322 /* Return number of basic blocks (without entry and exit block). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
323 unsigned get_block_count ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
324 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
325 return blocks.size () - 2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
326 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
328
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
329 /* Function info comparer that will sort functions according to starting
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
330 line. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
331
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
332 struct function_line_start_cmp
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 inline bool operator() (const function_info *lhs,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
335 const function_info *rhs)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337 return (lhs->start_line == rhs->start_line
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
338 ? lhs->start_column < rhs->start_column
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
339 : lhs->start_line < rhs->start_line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
340 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
341 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 /* Describes coverage of a file or function. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
345 struct coverage_info
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 int lines;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 int lines_executed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 int branches;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 int branches_executed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 int branches_taken;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 int calls;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 int calls_executed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 char *name;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 };
111
kono
parents: 67
diff changeset
359
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 /* Describes a file mentioned in the block graph. Contains an array
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 of line info. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 class source_info
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 public:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366 /* Default constructor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367 source_info ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
368
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
369 vector<function_info *> *get_functions_at_location (unsigned line_num) const;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371 /* Register a new function. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 void add_function (function_info *fn);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
374 /* Index of the source_info in sources vector. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
375 unsigned index;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
376
111
kono
parents: 67
diff changeset
377 /* Canonical name of source file. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 char *name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 time_t file_time;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
381 /* Vector of line information. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
382 vector<line_info> lines;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
383
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
384 coverage_info coverage;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
385
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
386 /* Maximum line count in the source file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
387 unsigned int maximum_count;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 /* Functions in this source file. These are in ascending line
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 number order. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391 vector<function_info *> functions;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 /* Line number to functions map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394 vector<vector<function_info *> *> line_to_function_map;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
395 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
396
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
397 source_info::source_info (): index (0), name (NULL), file_time (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
398 lines (), coverage (), maximum_count (0), functions ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
399 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
400 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
401
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
402 /* Register a new function. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
404 source_info::add_function (function_info *fn)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
405 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406 functions.push_back (fn);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
407
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
408 if (fn->start_line >= line_to_function_map.size ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 line_to_function_map.resize (fn->start_line + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 vector<function_info *> **slot = &line_to_function_map[fn->start_line];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412 if (*slot == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413 *slot = new vector<function_info *> ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 (*slot)->push_back (fn);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 vector<function_info *> *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
419 source_info::get_functions_at_location (unsigned line_num) const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
420 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421 if (line_num >= line_to_function_map.size ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 vector<function_info *> *slot = line_to_function_map[line_num];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 if (slot != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 std::sort (slot->begin (), slot->end (), function_line_start_cmp ());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428 return slot;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 class name_map
111
kono
parents: 67
diff changeset
432 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
434 name_map ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
435 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
436 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
437
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
438 name_map (char *_name, unsigned _src): name (_name), src (_src)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
439 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
440 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
442 bool operator== (const name_map &rhs) const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 #if HAVE_DOS_BASED_FILE_SYSTEM
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445 return strcasecmp (this->name, rhs.name) == 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
447 return strcmp (this->name, rhs.name) == 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
448 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
449 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
450
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
451 bool operator< (const name_map &rhs) const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
452 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
453 #if HAVE_DOS_BASED_FILE_SYSTEM
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
454 return strcasecmp (this->name, rhs.name) < 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 #else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
456 return strcmp (this->name, rhs.name) < 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
458 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 const char *name; /* Source file name */
111
kono
parents: 67
diff changeset
461 unsigned src; /* Source file */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
462 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
463
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
464 /* Vector of all functions. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
465 static vector<function_info *> functions;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
466
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
467 /* Function ident to function_info * map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
468 static map<unsigned, function_info *> ident_to_fn;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
469
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
470 /* Vector of source files. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 static vector<source_info> sources;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
472
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
473 /* Mapping of file names to sources */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 static vector<name_map> names;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
476 /* Record all processed files in order to warn about
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
477 a file being read multiple times. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 static vector<char *> processed_files;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 /* This holds data summary information. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481
111
kono
parents: 67
diff changeset
482 static unsigned object_runs;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483
111
kono
parents: 67
diff changeset
484 static unsigned total_lines;
kono
parents: 67
diff changeset
485 static unsigned total_executed;
kono
parents: 67
diff changeset
486
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 /* Modification time of graph file. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 static time_t bbg_file_time;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490
111
kono
parents: 67
diff changeset
491 /* Name of the notes (gcno) output file. The "bbg" prefix is for
kono
parents: 67
diff changeset
492 historical reasons, when the notes file contained only the
kono
parents: 67
diff changeset
493 basic block graph notes. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 static char *bbg_file_name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
496
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 /* Stamp of the bbg file */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 static unsigned bbg_stamp;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
500 /* Supports has_unexecuted_blocks functionality. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
501 static unsigned bbg_supports_has_unexecuted_blocks;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
502
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503 /* Working directory in which a TU was compiled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
504 static const char *bbg_cwd;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
505
111
kono
parents: 67
diff changeset
506 /* Name and file pointer of the input file for the count data (gcda). */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 static char *da_file_name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
509
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 /* Data file is missing. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 static int no_data_file;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 /* If there is several input files, compute and display results after
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 reading all data files. This way if two or more gcda file refer to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 the same source file (eg inline subprograms in a .h file), the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 counts are added. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 static int multiple_files = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 /* Output branch probabilities. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
522
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 static int flag_branches = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
524
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 /* Show unconditional branches too. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 static int flag_unconditional = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 /* Output a gcov file if this is true. This is on by default, and can
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 be turned off by the -n option. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 static int flag_gcov_file = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
532
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 /* Output to stdout instead to a gcov file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535 static int flag_use_stdout = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
537 /* Output progress indication if this is true. This is off by default
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
538 and can be turned on by the -d option. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
539
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
540 static int flag_display_progress = 0;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
541
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542 /* Output *.gcov file in JSON intermediate format used by consumers. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
544 static int flag_json_format = 0;
111
kono
parents: 67
diff changeset
545
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 /* For included files, make the gcov output file name include the name
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 of the input source file. For example, if x.h is included in a.c,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 then the output file name is a.c##x.h.gcov instead of x.h.gcov. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
549
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 static int flag_long_names = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551
111
kono
parents: 67
diff changeset
552 /* For situations when a long name can potentially hit filesystem path limit,
kono
parents: 67
diff changeset
553 let's calculate md5sum of the path and append it to a file name. */
kono
parents: 67
diff changeset
554
kono
parents: 67
diff changeset
555 static int flag_hash_filenames = 0;
kono
parents: 67
diff changeset
556
kono
parents: 67
diff changeset
557 /* Print verbose informations. */
kono
parents: 67
diff changeset
558
kono
parents: 67
diff changeset
559 static int flag_verbose = 0;
kono
parents: 67
diff changeset
560
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 /* Print colored output. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 static int flag_use_colors = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 /* Use perf-like colors to indicate hot lines. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567 static int flag_use_hotness_colors = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 /* Output count information for every basic block, not merely those
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 that contain line number information. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 static int flag_all_blocks = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
573
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574 /* Output human readable numbers. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
575
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
576 static int flag_human_readable_numbers = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 /* Output summary info for each function. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 static int flag_function_summary = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 /* Object directory file prefix. This is the directory/file where the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 graph and data files are looked for, if nonzero. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 static char *object_directory = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586
111
kono
parents: 67
diff changeset
587 /* Source directory prefix. This is removed from source pathnames
kono
parents: 67
diff changeset
588 that match, when generating the output file name. */
kono
parents: 67
diff changeset
589
kono
parents: 67
diff changeset
590 static char *source_prefix = 0;
kono
parents: 67
diff changeset
591 static size_t source_length = 0;
kono
parents: 67
diff changeset
592
kono
parents: 67
diff changeset
593 /* Only show data for sources with relative pathnames. Absolute ones
kono
parents: 67
diff changeset
594 usually indicate a system header file, which although it may
kono
parents: 67
diff changeset
595 contain inline functions, is usually uninteresting. */
kono
parents: 67
diff changeset
596 static int flag_relative_only = 0;
kono
parents: 67
diff changeset
597
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 /* Preserve all pathname components. Needed when object files and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 source files are in subdirectories. '/' is mangled as '#', '.' is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 elided and '..' mangled to '^'. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 static int flag_preserve_paths = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 /* Output the number of times a branch was taken as opposed to the percentage
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 of times it was taken. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 static int flag_counts = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 /* Forward declarations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
610 static int process_args (int, char **);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 static void print_usage (int) ATTRIBUTE_NORETURN;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 static void print_version (void) ATTRIBUTE_NORETURN;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 static void process_file (const char *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 static void process_all_functions (void);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 static void generate_results (const char *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616 static void create_file_names (const char *);
111
kono
parents: 67
diff changeset
617 static char *canonicalize_name (const char *);
kono
parents: 67
diff changeset
618 static unsigned find_source (const char *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
619 static void read_graph_file (void);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
620 static int read_count_file (void);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
621 static void solve_flow_graph (function_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
622 static void find_exception_blocks (function_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
623 static void add_branch_counts (coverage_info *, const arc_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 static void add_line_counts (coverage_info *, function_info *);
111
kono
parents: 67
diff changeset
625 static void executed_summary (unsigned, unsigned);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 static void function_summary (const coverage_info *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 static void file_summary (const coverage_info *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 static const char *format_gcov (gcov_type, gcov_type, int);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629 static void accumulate_line_counts (source_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630 static void output_gcov_file (const char *, source_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631 static int output_branch_count (FILE *, int, const arc_info *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 static void output_lines (FILE *, const source_info *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 static char *make_gcov_file_name (const char *, const char *);
111
kono
parents: 67
diff changeset
634 static char *mangle_name (const char *, char *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
635 static void release_structures (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 extern int main (int, char **);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
637
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
638 function_info::function_info (): m_name (NULL), m_demangled_name (NULL),
111
kono
parents: 67
diff changeset
639 ident (0), lineno_checksum (0), cfg_checksum (0), has_catch (0),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640 artificial (0), is_group (0),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 blocks (), blocks_executed (0), counts (),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
642 start_line (0), start_column (0), end_line (0), end_column (0),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
643 src (0), lines (), next (NULL)
111
kono
parents: 67
diff changeset
644 {
kono
parents: 67
diff changeset
645 }
kono
parents: 67
diff changeset
646
kono
parents: 67
diff changeset
647 function_info::~function_info ()
kono
parents: 67
diff changeset
648 {
kono
parents: 67
diff changeset
649 for (int i = blocks.size () - 1; i >= 0; i--)
kono
parents: 67
diff changeset
650 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651 arc_info *arc, *arc_n;
111
kono
parents: 67
diff changeset
652
kono
parents: 67
diff changeset
653 for (arc = blocks[i].succ; arc; arc = arc_n)
kono
parents: 67
diff changeset
654 {
kono
parents: 67
diff changeset
655 arc_n = arc->succ_next;
kono
parents: 67
diff changeset
656 free (arc);
kono
parents: 67
diff changeset
657 }
kono
parents: 67
diff changeset
658 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
659 if (m_demangled_name != m_name)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660 free (m_demangled_name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
661 free (m_name);
111
kono
parents: 67
diff changeset
662 }
kono
parents: 67
diff changeset
663
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664 bool function_info::group_line_p (unsigned n, unsigned src_idx)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
665 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 return is_group && src == src_idx && start_line <= n && n <= end_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668
111
kono
parents: 67
diff changeset
669 /* Cycle detection!
kono
parents: 67
diff changeset
670 There are a bajillion algorithms that do this. Boost's function is named
kono
parents: 67
diff changeset
671 hawick_cycles, so I used the algorithm by K. A. Hawick and H. A. James in
kono
parents: 67
diff changeset
672 "Enumerating Circuits and Loops in Graphs with Self-Arcs and Multiple-Arcs"
kono
parents: 67
diff changeset
673 (url at <http://complexity.massey.ac.nz/cstn/013/cstn-013.pdf>).
kono
parents: 67
diff changeset
674
kono
parents: 67
diff changeset
675 The basic algorithm is simple: effectively, we're finding all simple paths
kono
parents: 67
diff changeset
676 in a subgraph (that shrinks every iteration). Duplicates are filtered by
kono
parents: 67
diff changeset
677 "blocking" a path when a node is added to the path (this also prevents non-
kono
parents: 67
diff changeset
678 simple paths)--the node is unblocked only when it participates in a cycle.
kono
parents: 67
diff changeset
679 */
kono
parents: 67
diff changeset
680
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
681 typedef vector<arc_info *> arc_vector_t;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
682 typedef vector<const block_info *> block_vector_t;
111
kono
parents: 67
diff changeset
683
kono
parents: 67
diff changeset
684 /* Handle cycle identified by EDGES, where the function finds minimum cs_count
kono
parents: 67
diff changeset
685 and subtract the value from all counts. The subtracted value is added
kono
parents: 67
diff changeset
686 to COUNT. Returns type of loop. */
kono
parents: 67
diff changeset
687
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 static void
111
kono
parents: 67
diff changeset
689 handle_cycle (const arc_vector_t &edges, int64_t &count)
kono
parents: 67
diff changeset
690 {
kono
parents: 67
diff changeset
691 /* Find the minimum edge of the cycle, and reduce all nodes in the cycle by
kono
parents: 67
diff changeset
692 that amount. */
kono
parents: 67
diff changeset
693 int64_t cycle_count = INTTYPE_MAXIMUM (int64_t);
kono
parents: 67
diff changeset
694 for (unsigned i = 0; i < edges.size (); i++)
kono
parents: 67
diff changeset
695 {
kono
parents: 67
diff changeset
696 int64_t ecount = edges[i]->cs_count;
kono
parents: 67
diff changeset
697 if (cycle_count > ecount)
kono
parents: 67
diff changeset
698 cycle_count = ecount;
kono
parents: 67
diff changeset
699 }
kono
parents: 67
diff changeset
700 count += cycle_count;
kono
parents: 67
diff changeset
701 for (unsigned i = 0; i < edges.size (); i++)
kono
parents: 67
diff changeset
702 edges[i]->cs_count -= cycle_count;
kono
parents: 67
diff changeset
703
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 gcc_assert (cycle_count > 0);
111
kono
parents: 67
diff changeset
705 }
kono
parents: 67
diff changeset
706
kono
parents: 67
diff changeset
707 /* Unblock a block U from BLOCKED. Apart from that, iterate all blocks
kono
parents: 67
diff changeset
708 blocked by U in BLOCK_LISTS. */
kono
parents: 67
diff changeset
709
kono
parents: 67
diff changeset
710 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 unblock (const block_info *u, block_vector_t &blocked,
111
kono
parents: 67
diff changeset
712 vector<block_vector_t > &block_lists)
kono
parents: 67
diff changeset
713 {
kono
parents: 67
diff changeset
714 block_vector_t::iterator it = find (blocked.begin (), blocked.end (), u);
kono
parents: 67
diff changeset
715 if (it == blocked.end ())
kono
parents: 67
diff changeset
716 return;
kono
parents: 67
diff changeset
717
kono
parents: 67
diff changeset
718 unsigned index = it - blocked.begin ();
kono
parents: 67
diff changeset
719 blocked.erase (it);
kono
parents: 67
diff changeset
720
kono
parents: 67
diff changeset
721 block_vector_t to_unblock (block_lists[index]);
kono
parents: 67
diff changeset
722
kono
parents: 67
diff changeset
723 block_lists.erase (block_lists.begin () + index);
kono
parents: 67
diff changeset
724
kono
parents: 67
diff changeset
725 for (block_vector_t::iterator it = to_unblock.begin ();
kono
parents: 67
diff changeset
726 it != to_unblock.end (); it++)
kono
parents: 67
diff changeset
727 unblock (*it, blocked, block_lists);
kono
parents: 67
diff changeset
728 }
kono
parents: 67
diff changeset
729
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 /* Return true when PATH contains a zero cycle arc count. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 path_contains_zero_or_negative_cycle_arc (arc_vector_t &path)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 for (unsigned i = 0; i < path.size (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 if (path[i]->cs_count <= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740
111
kono
parents: 67
diff changeset
741 /* Find circuit going to block V, PATH is provisional seen cycle.
kono
parents: 67
diff changeset
742 BLOCKED is vector of blocked vertices, BLOCK_LISTS contains vertices
kono
parents: 67
diff changeset
743 blocked by a block. COUNT is accumulated count of the current LINE.
kono
parents: 67
diff changeset
744 Returns what type of loop it contains. */
kono
parents: 67
diff changeset
745
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747 circuit (block_info *v, arc_vector_t &path, block_info *start,
111
kono
parents: 67
diff changeset
748 block_vector_t &blocked, vector<block_vector_t> &block_lists,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 line_info &linfo, int64_t &count)
111
kono
parents: 67
diff changeset
750 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 bool loop_found = false;
111
kono
parents: 67
diff changeset
752
kono
parents: 67
diff changeset
753 /* Add v to the block list. */
kono
parents: 67
diff changeset
754 gcc_assert (find (blocked.begin (), blocked.end (), v) == blocked.end ());
kono
parents: 67
diff changeset
755 blocked.push_back (v);
kono
parents: 67
diff changeset
756 block_lists.push_back (block_vector_t ());
kono
parents: 67
diff changeset
757
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 for (arc_info *arc = v->succ; arc; arc = arc->succ_next)
111
kono
parents: 67
diff changeset
759 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 block_info *w = arc->dst;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 if (w < start
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762 || arc->cs_count <= 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 || !linfo.has_block (w))
111
kono
parents: 67
diff changeset
764 continue;
kono
parents: 67
diff changeset
765
kono
parents: 67
diff changeset
766 path.push_back (arc);
kono
parents: 67
diff changeset
767 if (w == start)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 /* Cycle has been found. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 handle_cycle (path, count);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 loop_found = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 else if (!path_contains_zero_or_negative_cycle_arc (path)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 && find (blocked.begin (), blocked.end (), w) == blocked.end ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 loop_found |= circuit (w, path, start, blocked, block_lists, linfo,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 count);
111
kono
parents: 67
diff changeset
777
kono
parents: 67
diff changeset
778 path.pop_back ();
kono
parents: 67
diff changeset
779 }
kono
parents: 67
diff changeset
780
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
781 if (loop_found)
111
kono
parents: 67
diff changeset
782 unblock (v, blocked, block_lists);
kono
parents: 67
diff changeset
783 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 for (arc_info *arc = v->succ; arc; arc = arc->succ_next)
111
kono
parents: 67
diff changeset
785 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 block_info *w = arc->dst;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787 if (w < start
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
788 || arc->cs_count <= 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 || !linfo.has_block (w))
111
kono
parents: 67
diff changeset
790 continue;
kono
parents: 67
diff changeset
791
kono
parents: 67
diff changeset
792 size_t index
kono
parents: 67
diff changeset
793 = find (blocked.begin (), blocked.end (), w) - blocked.begin ();
kono
parents: 67
diff changeset
794 gcc_assert (index < blocked.size ());
kono
parents: 67
diff changeset
795 block_vector_t &list = block_lists[index];
kono
parents: 67
diff changeset
796 if (find (list.begin (), list.end (), v) == list.end ())
kono
parents: 67
diff changeset
797 list.push_back (v);
kono
parents: 67
diff changeset
798 }
kono
parents: 67
diff changeset
799
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
800 return loop_found;
111
kono
parents: 67
diff changeset
801 }
kono
parents: 67
diff changeset
802
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
803 /* Find cycles for a LINFO. */
111
kono
parents: 67
diff changeset
804
kono
parents: 67
diff changeset
805 static gcov_type
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 get_cycles_count (line_info &linfo)
111
kono
parents: 67
diff changeset
807 {
kono
parents: 67
diff changeset
808 /* Note that this algorithm works even if blocks aren't in sorted order.
kono
parents: 67
diff changeset
809 Each iteration of the circuit detection is completely independent
kono
parents: 67
diff changeset
810 (except for reducing counts, but that shouldn't matter anyways).
kono
parents: 67
diff changeset
811 Therefore, operating on a permuted order (i.e., non-sorted) only
kono
parents: 67
diff changeset
812 has the effect of permuting the output cycles. */
kono
parents: 67
diff changeset
813
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 bool loop_found = false;
111
kono
parents: 67
diff changeset
815 gcov_type count = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
816 for (vector<block_info *>::iterator it = linfo.blocks.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
817 it != linfo.blocks.end (); it++)
111
kono
parents: 67
diff changeset
818 {
kono
parents: 67
diff changeset
819 arc_vector_t path;
kono
parents: 67
diff changeset
820 block_vector_t blocked;
kono
parents: 67
diff changeset
821 vector<block_vector_t > block_lists;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
822 loop_found |= circuit (*it, path, *it, blocked, block_lists, linfo,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
823 count);
111
kono
parents: 67
diff changeset
824 }
kono
parents: 67
diff changeset
825
kono
parents: 67
diff changeset
826 return count;
kono
parents: 67
diff changeset
827 }
kono
parents: 67
diff changeset
828
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
829 int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
830 main (int argc, char **argv)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
831 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
832 int argno;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
833 int first_arg;
111
kono
parents: 67
diff changeset
834 const char *p;
kono
parents: 67
diff changeset
835
kono
parents: 67
diff changeset
836 p = argv[0] + strlen (argv[0]);
kono
parents: 67
diff changeset
837 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
kono
parents: 67
diff changeset
838 --p;
kono
parents: 67
diff changeset
839 progname = p;
kono
parents: 67
diff changeset
840
kono
parents: 67
diff changeset
841 xmalloc_set_program_name (progname);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
842
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
843 /* Unlock the stdio streams. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 unlock_std_streams ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846 gcc_init_libintl ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
847
111
kono
parents: 67
diff changeset
848 diagnostic_initialize (global_dc, 0);
kono
parents: 67
diff changeset
849
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850 /* Handle response files. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 expandargv (&argc, &argv);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853 argno = process_args (argc, argv);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
854 if (optind == argc)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
855 print_usage (true);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
856
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
857 if (argc - argno > 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858 multiple_files = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
859
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
860 first_arg = argno;
111
kono
parents: 67
diff changeset
861
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862 for (; argno != argc; argno++)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
863 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
864 if (flag_display_progress)
111
kono
parents: 67
diff changeset
865 printf ("Processing file %d out of %d\n", argno - first_arg + 1,
kono
parents: 67
diff changeset
866 argc - first_arg);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
867 process_file (argv[argno]);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 if (flag_json_format || argno == argc - 1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 process_all_functions ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 generate_results (argv[argno]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 release_structures ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
875 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
876
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 /* Print a usage message and exit. If ERROR_P is nonzero, this is an error,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 otherwise the output of --help. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
884 print_usage (int error_p)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 FILE *file = error_p ? stderr : stdout;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 int status = error_p ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
888
111
kono
parents: 67
diff changeset
889 fnotice (file, "Usage: gcov [OPTION...] SOURCE|OBJ...\n\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 fnotice (file, "Print code coverage information.\n\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891 fnotice (file, " -a, --all-blocks Show information for every basic block\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
892 fnotice (file, " -b, --branch-probabilities Include branch probabilities in output\n");
111
kono
parents: 67
diff changeset
893 fnotice (file, " -c, --branch-counts Output counts of branches taken\n\
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 rather than percentages\n");
111
kono
parents: 67
diff changeset
895 fnotice (file, " -d, --display-progress Display progress information\n");
kono
parents: 67
diff changeset
896 fnotice (file, " -f, --function-summaries Output summaries for each function\n");
kono
parents: 67
diff changeset
897 fnotice (file, " -h, --help Print this help, then exit\n");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 fnotice (file, " -i, --json-format Output JSON intermediate format into .gcov.json.gz file\n");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 fnotice (file, " -j, --human-readable Output human readable numbers\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
900 fnotice (file, " -k, --use-colors Emit colored output\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
901 fnotice (file, " -l, --long-file-names Use long output file names for included\n\
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
902 source files\n");
111
kono
parents: 67
diff changeset
903 fnotice (file, " -m, --demangled-names Output demangled function names\n");
kono
parents: 67
diff changeset
904 fnotice (file, " -n, --no-output Do not create an output file\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
905 fnotice (file, " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
906 fnotice (file, " -p, --preserve-paths Preserve all pathname components\n");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907 fnotice (file, " -q, --use-hotness-colors Emit perf-like colored output for hot lines\n");
111
kono
parents: 67
diff changeset
908 fnotice (file, " -r, --relative-only Only show data for relative sources\n");
kono
parents: 67
diff changeset
909 fnotice (file, " -s, --source-prefix DIR Source prefix to elide\n");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910 fnotice (file, " -t, --stdout Output to stdout instead of a file\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 fnotice (file, " -u, --unconditional-branches Show unconditional branch counts too\n");
111
kono
parents: 67
diff changeset
912 fnotice (file, " -v, --version Print version number, then exit\n");
kono
parents: 67
diff changeset
913 fnotice (file, " -w, --verbose Print verbose informations\n");
kono
parents: 67
diff changeset
914 fnotice (file, " -x, --hash-filenames Hash long pathnames\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 bug_report_url);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 exit (status);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 /* Print version information and exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
921
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
922 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 print_version (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925 fnotice (stdout, "gcov %s%s\n", pkgversion_string, version_string);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926 fprintf (stdout, "Copyright %s 2020 Free Software Foundation, Inc.\n",
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927 _("(C)"));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928 fnotice (stdout,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 _("This is free software; see the source for copying conditions.\n"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930 "There is NO warranty; not even for MERCHANTABILITY or \n"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931 "FITNESS FOR A PARTICULAR PURPOSE.\n\n"));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 exit (SUCCESS_EXIT_CODE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935 static const struct option options[] =
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 { "help", no_argument, NULL, 'h' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 { "version", no_argument, NULL, 'v' },
111
kono
parents: 67
diff changeset
939 { "verbose", no_argument, NULL, 'w' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
940 { "all-blocks", no_argument, NULL, 'a' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
941 { "branch-probabilities", no_argument, NULL, 'b' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 { "branch-counts", no_argument, NULL, 'c' },
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943 { "json-format", no_argument, NULL, 'i' },
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 { "human-readable", no_argument, NULL, 'j' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 { "no-output", no_argument, NULL, 'n' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946 { "long-file-names", no_argument, NULL, 'l' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
947 { "function-summaries", no_argument, NULL, 'f' },
111
kono
parents: 67
diff changeset
948 { "demangled-names", no_argument, NULL, 'm' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 { "preserve-paths", no_argument, NULL, 'p' },
111
kono
parents: 67
diff changeset
950 { "relative-only", no_argument, NULL, 'r' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951 { "object-directory", required_argument, NULL, 'o' },
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
952 { "object-file", required_argument, NULL, 'o' },
111
kono
parents: 67
diff changeset
953 { "source-prefix", required_argument, NULL, 's' },
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 { "stdout", no_argument, NULL, 't' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
955 { "unconditional-branches", no_argument, NULL, 'u' },
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
956 { "display-progress", no_argument, NULL, 'd' },
111
kono
parents: 67
diff changeset
957 { "hash-filenames", no_argument, NULL, 'x' },
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 { "use-colors", no_argument, NULL, 'k' },
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 { "use-hotness-colors", no_argument, NULL, 'q' },
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
960 { 0, 0, 0, 0 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
962
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
963 /* Process args, return index to first non-arg. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
964
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
965 static int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
966 process_args (int argc, char **argv)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
967 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 int opt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
969
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 const char *opts = "abcdfhijklmno:pqrs:tuvwx";
111
kono
parents: 67
diff changeset
971 while ((opt = getopt_long (argc, argv, opts, options, NULL)) != -1)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
972 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
973 switch (opt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
974 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 case 'a':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 flag_all_blocks = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 case 'b':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
979 flag_branches = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
980 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 case 'c':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 flag_counts = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
983 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
984 case 'f':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
985 flag_function_summary = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
986 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 case 'h':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 print_usage (false);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 /* print_usage will exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 case 'l':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 flag_long_names = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 case 'j':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 flag_human_readable_numbers = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 case 'k':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 flag_use_colors = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 case 'q':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 flag_use_hotness_colors = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 break;
111
kono
parents: 67
diff changeset
1002 case 'm':
kono
parents: 67
diff changeset
1003 flag_demangled_names = 1;
kono
parents: 67
diff changeset
1004 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1005 case 'n':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1006 flag_gcov_file = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 case 'o':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009 object_directory = optarg;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010 break;
111
kono
parents: 67
diff changeset
1011 case 's':
kono
parents: 67
diff changeset
1012 source_prefix = optarg;
kono
parents: 67
diff changeset
1013 source_length = strlen (source_prefix);
kono
parents: 67
diff changeset
1014 break;
kono
parents: 67
diff changeset
1015 case 'r':
kono
parents: 67
diff changeset
1016 flag_relative_only = 1;
kono
parents: 67
diff changeset
1017 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018 case 'p':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019 flag_preserve_paths = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 case 'u':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022 flag_unconditional = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023 break;
111
kono
parents: 67
diff changeset
1024 case 'i':
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1025 flag_json_format = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1026 flag_gcov_file = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1027 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1028 case 'd':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1029 flag_display_progress = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1030 break;
111
kono
parents: 67
diff changeset
1031 case 'x':
kono
parents: 67
diff changeset
1032 flag_hash_filenames = 1;
kono
parents: 67
diff changeset
1033 break;
kono
parents: 67
diff changeset
1034 case 'w':
kono
parents: 67
diff changeset
1035 flag_verbose = 1;
kono
parents: 67
diff changeset
1036 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1037 case 't':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1038 flag_use_stdout = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1039 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1040 case 'v':
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041 print_version ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1042 /* print_version will exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1043 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1044 print_usage (true);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 /* print_usage will exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1047 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1048
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 return optind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1052 /* Output intermediate LINE sitting on LINE_NUM to JSON OBJECT.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1053 Add FUNCTION_NAME to the LINE. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1054
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1055 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1056 output_intermediate_json_line (json::array *object,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1057 line_info *line, unsigned line_num,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1058 const char *function_name)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1059 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1060 if (!line->exists)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1061 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1062
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1063 json::object *lineo = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1064 lineo->set ("line_number", new json::integer_number (line_num));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1065 if (function_name != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1066 lineo->set ("function_name", new json::string (function_name));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1067 lineo->set ("count", new json::integer_number (line->count));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1068 lineo->set ("unexecuted_block",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1069 new json::literal (line->has_unexecuted_block));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1070
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1071 json::array *branches = new json::array ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1072 lineo->set ("branches", branches);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1074 vector<arc_info *>::const_iterator it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075 if (flag_branches)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1076 for (it = line->branches.begin (); it != line->branches.end ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077 it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1078 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1079 if (!(*it)->is_unconditional && !(*it)->is_call_non_return)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1080 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1081 json::object *branch = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1082 branch->set ("count", new json::integer_number ((*it)->count));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1083 branch->set ("throw", new json::literal ((*it)->is_throw));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1084 branch->set ("fallthrough",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1085 new json::literal ((*it)->fall_through));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1086 branches->append (branch);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1087 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1088 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1089
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1090 object->append (lineo);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093 /* Get the name of the gcov file. The return value must be free'd.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1095 It appends the '.gcov' extension to the *basename* of the file.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1096 The resulting file name will be in PWD.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1097
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1098 e.g.,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1099 input: foo.da, output: foo.da.gcov
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1100 input: a/b/foo.cc, output: foo.cc.gcov */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1101
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1102 static char *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1103 get_gcov_intermediate_filename (const char *file_name)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1105 const char *gcov = ".gcov.json.gz";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106 char *result;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1107 const char *cptr;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1108
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1109 /* Find the 'basename'. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1110 cptr = lbasename (file_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1112 result = XNEWVEC (char, strlen (cptr) + strlen (gcov) + 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1113 sprintf (result, "%s%s", cptr, gcov);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1114
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1115 return result;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1116 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1117
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1118 /* Output the result in JSON intermediate format.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1119 Source info SRC is dumped into JSON_FILES which is JSON array. */
111
kono
parents: 67
diff changeset
1120
kono
parents: 67
diff changeset
1121 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1122 output_json_intermediate_file (json::array *json_files, source_info *src)
111
kono
parents: 67
diff changeset
1123 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1124 json::object *root = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1125 json_files->append (root);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1126
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1127 root->set ("file", new json::string (src->name));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1128
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1129 json::array *functions = new json::array ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1130 root->set ("functions", functions);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1132 std::sort (src->functions.begin (), src->functions.end (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1133 function_line_start_cmp ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1134 for (vector<function_info *>::iterator it = src->functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1135 it != src->functions.end (); it++)
111
kono
parents: 67
diff changeset
1136 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1137 json::object *function = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1138 function->set ("name", new json::string ((*it)->m_name));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1139 function->set ("demangled_name",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1140 new json::string ((*it)->get_demangled_name ()));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1141 function->set ("start_line",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1142 new json::integer_number ((*it)->start_line));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1143 function->set ("start_column",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1144 new json::integer_number ((*it)->start_column));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1145 function->set ("end_line", new json::integer_number ((*it)->end_line));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1146 function->set ("end_column",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1147 new json::integer_number ((*it)->end_column));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1148 function->set ("blocks",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1149 new json::integer_number ((*it)->get_block_count ()));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1150 function->set ("blocks_executed",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1151 new json::integer_number ((*it)->blocks_executed));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1152 function->set ("execution_count",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1153 new json::integer_number ((*it)->blocks[0].count));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1154
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1155 functions->append (function);
111
kono
parents: 67
diff changeset
1156 }
kono
parents: 67
diff changeset
1157
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1158 json::array *lineso = new json::array ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1159 root->set ("lines", lineso);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1160
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1161 function_info *last_non_group_fn = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1162
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1163 for (unsigned line_num = 1; line_num <= src->lines.size (); line_num++)
111
kono
parents: 67
diff changeset
1164 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 vector<function_info *> *fns = src->get_functions_at_location (line_num);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1166
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1167 if (fns != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1168 /* Print first group functions that begin on the line. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1169 for (vector<function_info *>::iterator it2 = fns->begin ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1170 it2 != fns->end (); it2++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1171 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1172 if (!(*it2)->is_group)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1173 last_non_group_fn = *it2;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1174
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1175 vector<line_info> &lines = (*it2)->lines;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1176 for (unsigned i = 0; i < lines.size (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1177 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1178 line_info *line = &lines[i];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1179 output_intermediate_json_line (lineso, line, line_num + i,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1180 (*it2)->m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1181 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1182 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1183
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1184 /* Follow with lines associated with the source file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1185 if (line_num < src->lines.size ())
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1186 output_intermediate_json_line (lineso, &src->lines[line_num], line_num,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1187 (last_non_group_fn != NULL
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1188 ? last_non_group_fn->m_name : NULL));
111
kono
parents: 67
diff changeset
1189 }
kono
parents: 67
diff changeset
1190 }
kono
parents: 67
diff changeset
1191
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1192 /* Function start pair. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1193 struct function_start
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1194 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1195 unsigned source_file_idx;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1196 unsigned start_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1197 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1199 /* Traits class for function start hash maps below. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1200
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 struct function_start_pair_hash : typed_noop_remove <function_start>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1202 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1203 typedef function_start value_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1204 typedef function_start compare_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1205
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1206 static hashval_t
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1207 hash (const function_start &ref)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1208 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1209 inchash::hash hstate (0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1210 hstate.add_int (ref.source_file_idx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1211 hstate.add_int (ref.start_line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1212 return hstate.end ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1213 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1214
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1216 equal (const function_start &ref1, const function_start &ref2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1217 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 return (ref1.source_file_idx == ref2.source_file_idx
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219 && ref1.start_line == ref2.start_line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1220 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1221
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1222 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1223 mark_deleted (function_start &ref)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1224 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1225 ref.start_line = ~1U;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1228 static const bool empty_zero_p = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1229
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1230 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1231 mark_empty (function_start &ref)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1232 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1233 ref.start_line = ~2U;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1234 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1235
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1236 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1237 is_deleted (const function_start &ref)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1238 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1239 return ref.start_line == ~1U;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1240 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1241
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1242 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1243 is_empty (const function_start &ref)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1244 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1245 return ref.start_line == ~2U;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1246 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1247 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1248
111
kono
parents: 67
diff changeset
1249 /* Process a single input file. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1250
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1251 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1252 process_file (const char *file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1253 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1254 create_file_names (file_name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1255
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1256 for (unsigned i = 0; i < processed_files.size (); i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1257 if (strcmp (da_file_name, processed_files[i]) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1258 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1259 fnotice (stderr, "'%s' file is already processed\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1260 file_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1261 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1262 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1263
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1264 processed_files.push_back (xstrdup (da_file_name));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1265
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1266 read_graph_file ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1267 read_count_file ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1268 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1269
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1270 /* Process all functions in all files. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1271
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1272 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1273 process_all_functions (void)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1274 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1275 hash_map<function_start_pair_hash, function_info *> fn_map;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1276
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1277 /* Identify group functions. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1278 for (vector<function_info *>::iterator it = functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 it != functions.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1280 if (!(*it)->artificial)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1281 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1282 function_start needle;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1283 needle.source_file_idx = (*it)->src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284 needle.start_line = (*it)->start_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1285
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1286 function_info **slot = fn_map.get (needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1287 if (slot)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1288 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1289 (*slot)->is_group = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1290 (*it)->is_group = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1291 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1292 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1293 fn_map.put (needle, *it);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1294 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1295
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1296 /* Remove all artificial function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1297 functions.erase (remove_if (functions.begin (), functions.end (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1298 function_info::is_artificial), functions.end ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1299
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1300 for (vector<function_info *>::iterator it = functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1301 it != functions.end (); it++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1302 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1303 function_info *fn = *it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1304 unsigned src = fn->src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1305
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1306 if (!fn->counts.empty () || no_data_file)
111
kono
parents: 67
diff changeset
1307 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1308 source_info *s = &sources[src];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1309 s->add_function (fn);
111
kono
parents: 67
diff changeset
1310
kono
parents: 67
diff changeset
1311 /* Mark last line in files touched by function. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1312 for (unsigned block_no = 0; block_no != fn->blocks.size ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1313 block_no++)
111
kono
parents: 67
diff changeset
1314 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1315 block_info *block = &fn->blocks[block_no];
111
kono
parents: 67
diff changeset
1316 for (unsigned i = 0; i < block->locations.size (); i++)
kono
parents: 67
diff changeset
1317 {
kono
parents: 67
diff changeset
1318 /* Sort lines of locations. */
kono
parents: 67
diff changeset
1319 sort (block->locations[i].lines.begin (),
kono
parents: 67
diff changeset
1320 block->locations[i].lines.end ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1321
111
kono
parents: 67
diff changeset
1322 if (!block->locations[i].lines.empty ())
kono
parents: 67
diff changeset
1323 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1324 s = &sources[block->locations[i].source_file_idx];
111
kono
parents: 67
diff changeset
1325 unsigned last_line
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1326 = block->locations[i].lines.back ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1327
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1328 /* Record new lines for the function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1329 if (last_line >= s->lines.size ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1330 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1331 s = &sources[block->locations[i].source_file_idx];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1332 unsigned last_line
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1333 = block->locations[i].lines.back ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1334
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1335 /* Record new lines for the function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1336 if (last_line >= s->lines.size ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1337 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1338 /* Record new lines for a source file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1339 s->lines.resize (last_line + 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1340 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1341 }
111
kono
parents: 67
diff changeset
1342 }
kono
parents: 67
diff changeset
1343 }
kono
parents: 67
diff changeset
1344 }
kono
parents: 67
diff changeset
1345
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1346 /* Allocate lines for group function, following start_line
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1347 and end_line information of the function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1348 if (fn->is_group)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1349 fn->lines.resize (fn->end_line - fn->start_line + 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1350
111
kono
parents: 67
diff changeset
1351 solve_flow_graph (fn);
kono
parents: 67
diff changeset
1352 if (fn->has_catch)
kono
parents: 67
diff changeset
1353 find_exception_blocks (fn);
kono
parents: 67
diff changeset
1354 }
kono
parents: 67
diff changeset
1355 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1356 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1357 /* The function was not in the executable -- some other
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1358 instance must have been selected. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1359 }
111
kono
parents: 67
diff changeset
1360 }
kono
parents: 67
diff changeset
1361 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1362
111
kono
parents: 67
diff changeset
1363 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 output_gcov_file (const char *file_name, source_info *src)
111
kono
parents: 67
diff changeset
1365 {
kono
parents: 67
diff changeset
1366 char *gcov_file_name = make_gcov_file_name (file_name, src->coverage.name);
kono
parents: 67
diff changeset
1367
kono
parents: 67
diff changeset
1368 if (src->coverage.lines)
kono
parents: 67
diff changeset
1369 {
kono
parents: 67
diff changeset
1370 FILE *gcov_file = fopen (gcov_file_name, "w");
kono
parents: 67
diff changeset
1371 if (gcov_file)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1372 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1373 fnotice (stdout, "Creating '%s'\n", gcov_file_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1374 output_lines (gcov_file, src);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1375 if (ferror (gcov_file))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1376 fnotice (stderr, "Error writing output file '%s'\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1377 gcov_file_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1378 fclose (gcov_file);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1379 }
111
kono
parents: 67
diff changeset
1380 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1381 fnotice (stderr, "Could not open output file '%s'\n", gcov_file_name);
111
kono
parents: 67
diff changeset
1382 }
kono
parents: 67
diff changeset
1383 else
kono
parents: 67
diff changeset
1384 {
kono
parents: 67
diff changeset
1385 unlink (gcov_file_name);
kono
parents: 67
diff changeset
1386 fnotice (stdout, "Removing '%s'\n", gcov_file_name);
kono
parents: 67
diff changeset
1387 }
kono
parents: 67
diff changeset
1388 free (gcov_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1389 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1390
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1391 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1392 generate_results (const char *file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1393 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1394 char *gcov_intermediate_filename;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1395
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1396 for (vector<function_info *>::iterator it = functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1397 it != functions.end (); it++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1398 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1399 function_info *fn = *it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1400 coverage_info coverage;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1401
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1402 memset (&coverage, 0, sizeof (coverage));
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1403 coverage.name = fn->get_name ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1404 add_line_counts (flag_function_summary ? &coverage : NULL, fn);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1405 if (flag_function_summary)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1406 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1407 function_summary (&coverage);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1408 fnotice (stdout, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1409 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1410 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1411
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412 name_map needle;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1413
111
kono
parents: 67
diff changeset
1414 if (file_name)
kono
parents: 67
diff changeset
1415 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416 needle.name = file_name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 vector<name_map>::iterator it = std::find (names.begin (), names.end (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1418 needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1419 if (it != names.end ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 file_name = sources[it->src].coverage.name;
111
kono
parents: 67
diff changeset
1421 else
kono
parents: 67
diff changeset
1422 file_name = canonicalize_name (file_name);
kono
parents: 67
diff changeset
1423 }
kono
parents: 67
diff changeset
1424
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1425 gcov_intermediate_filename = get_gcov_intermediate_filename (file_name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1426
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1427 json::object *root = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1428 root->set ("format_version", new json::string ("1"));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1429 root->set ("gcc_version", new json::string (version_string));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1430
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1431 if (bbg_cwd != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1432 root->set ("current_working_directory", new json::string (bbg_cwd));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1433 root->set ("data_file", new json::string (file_name));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1434
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1435 json::array *json_files = new json::array ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1436 root->set ("files", json_files);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438 for (vector<source_info>::iterator it = sources.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 it != sources.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1440 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1441 source_info *src = &(*it);
111
kono
parents: 67
diff changeset
1442 if (flag_relative_only)
kono
parents: 67
diff changeset
1443 {
kono
parents: 67
diff changeset
1444 /* Ignore this source, if it is an absolute path (after
kono
parents: 67
diff changeset
1445 source prefix removal). */
kono
parents: 67
diff changeset
1446 char first = src->coverage.name[0];
kono
parents: 67
diff changeset
1447
kono
parents: 67
diff changeset
1448 #if HAVE_DOS_BASED_FILE_SYSTEM
kono
parents: 67
diff changeset
1449 if (first && src->coverage.name[1] == ':')
kono
parents: 67
diff changeset
1450 first = src->coverage.name[2];
kono
parents: 67
diff changeset
1451 #endif
kono
parents: 67
diff changeset
1452 if (IS_DIR_SEPARATOR (first))
kono
parents: 67
diff changeset
1453 continue;
kono
parents: 67
diff changeset
1454 }
kono
parents: 67
diff changeset
1455
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1456 accumulate_line_counts (src);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1457
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1458 if (!flag_use_stdout)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1459 file_summary (&src->coverage);
111
kono
parents: 67
diff changeset
1460 total_lines += src->coverage.lines;
kono
parents: 67
diff changeset
1461 total_executed += src->coverage.lines_executed;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1462 if (flag_gcov_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1463 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1464 if (flag_json_format)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1465 output_json_intermediate_file (json_files, src);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1466 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1467 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1468 if (flag_use_stdout)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1469 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1470 if (src->coverage.lines)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1471 output_lines (stdout, src);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1472 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1473 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1475 output_gcov_file (file_name, src);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1476 fnotice (stdout, "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1477 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1478 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1479 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1480 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1481
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1482 if (flag_gcov_file && flag_json_format)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1483 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1484 if (flag_use_stdout)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1485 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1486 root->dump (stdout);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1487 printf ("\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1488 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1489 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1490 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1491 pretty_printer pp;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1492 root->print (&pp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1493 pp_formatted_text (&pp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1494
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1495 gzFile output = gzopen (gcov_intermediate_filename, "w");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1496 if (output == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1497 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1498 fnotice (stderr, "Cannot open JSON output file %s\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1499 gcov_intermediate_filename);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1500 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1501 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1502
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1503 if (gzputs (output, pp_formatted_text (&pp)) == EOF
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1504 || gzclose (output))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1505 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1506 fnotice (stderr, "Error writing JSON output file %s\n",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1507 gcov_intermediate_filename);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1508 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1509 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1510 }
111
kono
parents: 67
diff changeset
1511 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1512
111
kono
parents: 67
diff changeset
1513 if (!file_name)
kono
parents: 67
diff changeset
1514 executed_summary (total_lines, total_executed);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1515 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1516
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1517 /* Release all memory used. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1518
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1519 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1520 release_structures (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1521 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 for (vector<function_info *>::iterator it = functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 it != functions.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1524 delete (*it);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1525
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 sources.resize (0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1527 names.resize (0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1528 functions.resize (0);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1529 ident_to_fn.clear ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1530 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1531
111
kono
parents: 67
diff changeset
1532 /* Generate the names of the graph and data files. If OBJECT_DIRECTORY
kono
parents: 67
diff changeset
1533 is not specified, these are named from FILE_NAME sans extension. If
kono
parents: 67
diff changeset
1534 OBJECT_DIRECTORY is specified and is a directory, the files are in that
kono
parents: 67
diff changeset
1535 directory, but named from the basename of the FILE_NAME, sans extension.
kono
parents: 67
diff changeset
1536 Otherwise OBJECT_DIRECTORY is taken to be the name of the object *file*
kono
parents: 67
diff changeset
1537 and the data files are named from that. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1538
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1539 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1540 create_file_names (const char *file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1541 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1542 char *cptr;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1543 char *name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1544 int length = strlen (file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1545 int base;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1546
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1547 /* Free previous file names. */
111
kono
parents: 67
diff changeset
1548 free (bbg_file_name);
kono
parents: 67
diff changeset
1549 free (da_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1550 da_file_name = bbg_file_name = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1551 bbg_file_time = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1552 bbg_stamp = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1553
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1554 if (object_directory && object_directory[0])
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1555 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1556 struct stat status;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1557
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1558 length += strlen (object_directory) + 2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1559 name = XNEWVEC (char, length);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1560 name[0] = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1561
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1562 base = !stat (object_directory, &status) && S_ISDIR (status.st_mode);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1563 strcat (name, object_directory);
111
kono
parents: 67
diff changeset
1564 if (base && (!IS_DIR_SEPARATOR (name[strlen (name) - 1])))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1565 strcat (name, "/");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1566 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1567 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1568 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1569 name = XNEWVEC (char, length + 1);
111
kono
parents: 67
diff changeset
1570 strcpy (name, file_name);
kono
parents: 67
diff changeset
1571 base = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1572 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1573
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1574 if (base)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1575 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1576 /* Append source file name. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1577 const char *cptr = lbasename (file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1578 strcat (name, cptr ? cptr : file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1579 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1580
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1581 /* Remove the extension. */
111
kono
parents: 67
diff changeset
1582 cptr = strrchr (CONST_CAST (char *, lbasename (name)), '.');
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1583 if (cptr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1584 *cptr = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1585
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1586 length = strlen (name);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1587
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1588 bbg_file_name = XNEWVEC (char, length + strlen (GCOV_NOTE_SUFFIX) + 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1589 strcpy (bbg_file_name, name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1590 strcpy (bbg_file_name + length, GCOV_NOTE_SUFFIX);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1591
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1592 da_file_name = XNEWVEC (char, length + strlen (GCOV_DATA_SUFFIX) + 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1593 strcpy (da_file_name, name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1594 strcpy (da_file_name + length, GCOV_DATA_SUFFIX);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1595
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1596 free (name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1597 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1598 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1599
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1600 /* Find or create a source file structure for FILE_NAME. Copies
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1601 FILE_NAME on creation */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1602
111
kono
parents: 67
diff changeset
1603 static unsigned
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1604 find_source (const char *file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1605 {
111
kono
parents: 67
diff changeset
1606 char *canon;
kono
parents: 67
diff changeset
1607 unsigned idx;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1608 struct stat status;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1609
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1610 if (!file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1611 file_name = "<unknown>";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613 name_map needle;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1614 needle.name = file_name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1615
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1616 vector<name_map>::iterator it = std::find (names.begin (), names.end (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 if (it != names.end ())
111
kono
parents: 67
diff changeset
1619 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620 idx = it->src;
111
kono
parents: 67
diff changeset
1621 goto check_date;
kono
parents: 67
diff changeset
1622 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1623
111
kono
parents: 67
diff changeset
1624 /* Not found, try the canonical name. */
kono
parents: 67
diff changeset
1625 canon = canonicalize_name (file_name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1626 needle.name = canon;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1627 it = std::find (names.begin (), names.end (), needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1628 if (it == names.end ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1629 {
111
kono
parents: 67
diff changeset
1630 /* Not found with canonical name, create a new source. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1631 source_info *src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1632
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1633 idx = sources.size ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1634 needle = name_map (canon, idx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635 names.push_back (needle);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1636
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 sources.push_back (source_info ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1638 src = &sources.back ();
111
kono
parents: 67
diff changeset
1639 src->name = canon;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1640 src->coverage.name = src->name;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1641 src->index = idx;
111
kono
parents: 67
diff changeset
1642 if (source_length
kono
parents: 67
diff changeset
1643 #if HAVE_DOS_BASED_FILE_SYSTEM
kono
parents: 67
diff changeset
1644 /* You lose if separators don't match exactly in the
kono
parents: 67
diff changeset
1645 prefix. */
kono
parents: 67
diff changeset
1646 && !strncasecmp (source_prefix, src->coverage.name, source_length)
kono
parents: 67
diff changeset
1647 #else
kono
parents: 67
diff changeset
1648 && !strncmp (source_prefix, src->coverage.name, source_length)
kono
parents: 67
diff changeset
1649 #endif
kono
parents: 67
diff changeset
1650 && IS_DIR_SEPARATOR (src->coverage.name[source_length]))
kono
parents: 67
diff changeset
1651 src->coverage.name += source_length + 1;
kono
parents: 67
diff changeset
1652 if (!stat (src->name, &status))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1653 src->file_time = status.st_mtime;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654 }
111
kono
parents: 67
diff changeset
1655 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1656 idx = it->src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1657
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1658 needle.name = file_name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1659 if (std::find (names.begin (), names.end (), needle) == names.end ())
111
kono
parents: 67
diff changeset
1660 {
kono
parents: 67
diff changeset
1661 /* Append the non-canonical name. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1662 names.push_back (name_map (xstrdup (file_name), idx));
111
kono
parents: 67
diff changeset
1663 }
kono
parents: 67
diff changeset
1664
kono
parents: 67
diff changeset
1665 /* Resort the name map. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1666 std::sort (names.begin (), names.end ());
111
kono
parents: 67
diff changeset
1667
kono
parents: 67
diff changeset
1668 check_date:
kono
parents: 67
diff changeset
1669 if (sources[idx].file_time > bbg_file_time)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1670 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 static int info_emitted;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672
111
kono
parents: 67
diff changeset
1673 fnotice (stderr, "%s:source file is newer than notes file '%s'\n",
kono
parents: 67
diff changeset
1674 file_name, bbg_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1675 if (!info_emitted)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1677 fnotice (stderr,
111
kono
parents: 67
diff changeset
1678 "(the message is displayed only once per source file)\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 info_emitted = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680 }
111
kono
parents: 67
diff changeset
1681 sources[idx].file_time = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683
111
kono
parents: 67
diff changeset
1684 return idx;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1686
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1687 /* Read the notes file. Save functions to FUNCTIONS global vector. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1688
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1689 static void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690 read_graph_file (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1692 unsigned version;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693 unsigned current_tag = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 unsigned tag;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1696 if (!gcov_open (bbg_file_name, 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1697 {
111
kono
parents: 67
diff changeset
1698 fnotice (stderr, "%s:cannot open notes file\n", bbg_file_name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1699 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 bbg_file_time = gcov_time ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 if (!gcov_magic (gcov_read_unsigned (), GCOV_NOTE_MAGIC))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 {
111
kono
parents: 67
diff changeset
1704 fnotice (stderr, "%s:not a gcov notes file\n", bbg_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 gcov_close ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1706 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1707 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1708
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 version = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1710 if (version != GCOV_VERSION)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1712 char v[4], e[4];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1713
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1714 GCOV_UNSIGNED2STRING (v, version);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717 fnotice (stderr, "%s:version '%.4s', prefer '%.4s'\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718 bbg_file_name, v, e);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1719 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1720 bbg_stamp = gcov_read_unsigned ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1721 bbg_cwd = xstrdup (gcov_read_string ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1722 bbg_supports_has_unexecuted_blocks = gcov_read_unsigned ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1723
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1724 function_info *fn = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1725 while ((tag = gcov_read_unsigned ()))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1726 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1727 unsigned length = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1728 gcov_position_t base = gcov_position ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1729
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1730 if (tag == GCOV_TAG_FUNCTION)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732 char *function_name;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1733 unsigned ident;
111
kono
parents: 67
diff changeset
1734 unsigned lineno_checksum, cfg_checksum;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1735
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1736 ident = gcov_read_unsigned ();
111
kono
parents: 67
diff changeset
1737 lineno_checksum = gcov_read_unsigned ();
kono
parents: 67
diff changeset
1738 cfg_checksum = gcov_read_unsigned ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1739 function_name = xstrdup (gcov_read_string ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1740 unsigned artificial = gcov_read_unsigned ();
111
kono
parents: 67
diff changeset
1741 unsigned src_idx = find_source (gcov_read_string ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1742 unsigned start_line = gcov_read_unsigned ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1743 unsigned start_column = gcov_read_unsigned ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1744 unsigned end_line = gcov_read_unsigned ();
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1745 unsigned end_column = gcov_read_unsigned ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1746
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1747 fn = new function_info ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1748 functions.push_back (fn);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1749 ident_to_fn[ident] = fn;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1750
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1751 fn->m_name = function_name;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1752 fn->ident = ident;
111
kono
parents: 67
diff changeset
1753 fn->lineno_checksum = lineno_checksum;
kono
parents: 67
diff changeset
1754 fn->cfg_checksum = cfg_checksum;
kono
parents: 67
diff changeset
1755 fn->src = src_idx;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1756 fn->start_line = start_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1757 fn->start_column = start_column;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1758 fn->end_line = end_line;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1759 fn->end_column = end_column;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1760 fn->artificial = artificial;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1761
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1762 current_tag = tag;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1763 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1764 else if (fn && tag == GCOV_TAG_BLOCKS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1765 {
111
kono
parents: 67
diff changeset
1766 if (!fn->blocks.empty ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1767 fnotice (stderr, "%s:already seen blocks for '%s'\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1768 bbg_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1769 else
111
kono
parents: 67
diff changeset
1770 fn->blocks.resize (gcov_read_unsigned ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1771 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1772 else if (fn && tag == GCOV_TAG_ARCS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1773 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1774 unsigned src = gcov_read_unsigned ();
111
kono
parents: 67
diff changeset
1775 fn->blocks[src].id = src;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1776 unsigned num_dests = GCOV_TAG_ARCS_NUM (length);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1777 block_info *src_blk = &fn->blocks[src];
111
kono
parents: 67
diff changeset
1778 unsigned mark_catches = 0;
kono
parents: 67
diff changeset
1779 struct arc_info *arc;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1780
111
kono
parents: 67
diff changeset
1781 if (src >= fn->blocks.size () || fn->blocks[src].succ)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782 goto corrupt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1783
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1784 while (num_dests--)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1785 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 unsigned dest = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787 unsigned flags = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788
111
kono
parents: 67
diff changeset
1789 if (dest >= fn->blocks.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1790 goto corrupt;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1791 arc = XCNEW (arc_info);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1792
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1793 arc->dst = &fn->blocks[dest];
111
kono
parents: 67
diff changeset
1794 arc->src = src_blk;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1795
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1796 arc->count = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1797 arc->count_valid = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1798 arc->on_tree = !!(flags & GCOV_ARC_ON_TREE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1799 arc->fake = !!(flags & GCOV_ARC_FAKE);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1800 arc->fall_through = !!(flags & GCOV_ARC_FALLTHROUGH);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1801
111
kono
parents: 67
diff changeset
1802 arc->succ_next = src_blk->succ;
kono
parents: 67
diff changeset
1803 src_blk->succ = arc;
kono
parents: 67
diff changeset
1804 src_blk->num_succ++;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1805
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1806 arc->pred_next = fn->blocks[dest].pred;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1807 fn->blocks[dest].pred = arc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1808 fn->blocks[dest].num_pred++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1809
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1810 if (arc->fake)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1811 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812 if (src)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1813 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1814 /* Exceptional exit from this function, the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1815 source block must be a call. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1816 fn->blocks[src].is_call_site = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1817 arc->is_call_non_return = 1;
111
kono
parents: 67
diff changeset
1818 mark_catches = 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1819 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1820 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1821 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1822 /* Non-local return from a callee of this
111
kono
parents: 67
diff changeset
1823 function. The destination block is a setjmp. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1824 arc->is_nonlocal_return = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1825 fn->blocks[dest].is_nonlocal_return = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1826 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1827 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1828
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1829 if (!arc->on_tree)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1830 fn->counts.push_back (0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1831 }
111
kono
parents: 67
diff changeset
1832
kono
parents: 67
diff changeset
1833 if (mark_catches)
kono
parents: 67
diff changeset
1834 {
kono
parents: 67
diff changeset
1835 /* We have a fake exit from this block. The other
kono
parents: 67
diff changeset
1836 non-fall through exits must be to catch handlers.
kono
parents: 67
diff changeset
1837 Mark them as catch arcs. */
kono
parents: 67
diff changeset
1838
kono
parents: 67
diff changeset
1839 for (arc = src_blk->succ; arc; arc = arc->succ_next)
kono
parents: 67
diff changeset
1840 if (!arc->fake && !arc->fall_through)
kono
parents: 67
diff changeset
1841 {
kono
parents: 67
diff changeset
1842 arc->is_throw = 1;
kono
parents: 67
diff changeset
1843 fn->has_catch = 1;
kono
parents: 67
diff changeset
1844 }
kono
parents: 67
diff changeset
1845 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1846 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1847 else if (fn && tag == GCOV_TAG_LINES)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1848 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1849 unsigned blockno = gcov_read_unsigned ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1850 block_info *block = &fn->blocks[blockno];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1851
111
kono
parents: 67
diff changeset
1852 if (blockno >= fn->blocks.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1853 goto corrupt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1854
111
kono
parents: 67
diff changeset
1855 while (true)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1856 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1857 unsigned lineno = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1858
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1859 if (lineno)
111
kono
parents: 67
diff changeset
1860 block->locations.back ().lines.push_back (lineno);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1861 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1862 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1863 const char *file_name = gcov_read_string ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1864
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1865 if (!file_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1866 break;
111
kono
parents: 67
diff changeset
1867 block->locations.push_back (block_location_info
kono
parents: 67
diff changeset
1868 (find_source (file_name)));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1869 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1870 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1871 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1872 else if (current_tag && !GCOV_TAG_IS_SUBTAG (current_tag, tag))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1873 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1874 fn = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1875 current_tag = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1876 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1877 gcov_sync (base, length);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1878 if (gcov_is_error ())
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1880 corrupt:;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1881 fnotice (stderr, "%s:corrupted\n", bbg_file_name);
111
kono
parents: 67
diff changeset
1882 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1883 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1884 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1885 gcov_close ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1886
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1887 if (functions.empty ())
111
kono
parents: 67
diff changeset
1888 fnotice (stderr, "%s:no functions found\n", bbg_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1889 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1890
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1891 /* Reads profiles from the count file and attach to each
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1892 function. Return nonzero if fatal error. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1893
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1894 static int
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1895 read_count_file (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1896 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1897 unsigned ix;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1898 unsigned version;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1899 unsigned tag;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1900 function_info *fn = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1901 int error = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1902 map<unsigned, function_info *>::iterator it;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1903
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1904 if (!gcov_open (da_file_name, 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1905 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1906 fnotice (stderr, "%s:cannot open data file, assuming not executed\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1907 da_file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1908 no_data_file = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1909 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1910 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1911 if (!gcov_magic (gcov_read_unsigned (), GCOV_DATA_MAGIC))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1912 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1913 fnotice (stderr, "%s:not a gcov data file\n", da_file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1914 cleanup:;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1915 gcov_close ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1916 return 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1917 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1918 version = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1919 if (version != GCOV_VERSION)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1920 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1921 char v[4], e[4];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1922
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1923 GCOV_UNSIGNED2STRING (v, version);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1924 GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1925
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1926 fnotice (stderr, "%s:version '%.4s', prefer version '%.4s'\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1927 da_file_name, v, e);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1928 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1929 tag = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1930 if (tag != bbg_stamp)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1931 {
111
kono
parents: 67
diff changeset
1932 fnotice (stderr, "%s:stamp mismatch with notes file\n", da_file_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1933 goto cleanup;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1934 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1935
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1936 while ((tag = gcov_read_unsigned ()))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1937 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1938 unsigned length = gcov_read_unsigned ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1939 unsigned long base = gcov_position ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1940
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1941 if (tag == GCOV_TAG_OBJECT_SUMMARY)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1942 {
111
kono
parents: 67
diff changeset
1943 struct gcov_summary summary;
kono
parents: 67
diff changeset
1944 gcov_read_summary (&summary);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1945 object_runs = summary.runs;
111
kono
parents: 67
diff changeset
1946 }
kono
parents: 67
diff changeset
1947 else if (tag == GCOV_TAG_FUNCTION && !length)
kono
parents: 67
diff changeset
1948 ; /* placeholder */
kono
parents: 67
diff changeset
1949 else if (tag == GCOV_TAG_FUNCTION && length == GCOV_TAG_FUNCTION_LENGTH)
kono
parents: 67
diff changeset
1950 {
kono
parents: 67
diff changeset
1951 unsigned ident;
kono
parents: 67
diff changeset
1952 ident = gcov_read_unsigned ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1953 fn = NULL;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1954 it = ident_to_fn.find (ident);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1955 if (it != ident_to_fn.end ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1956 fn = it->second;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1957
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1958 if (!fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1959 ;
111
kono
parents: 67
diff changeset
1960 else if (gcov_read_unsigned () != fn->lineno_checksum
kono
parents: 67
diff changeset
1961 || gcov_read_unsigned () != fn->cfg_checksum)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1962 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1963 mismatch:;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1964 fnotice (stderr, "%s:profile mismatch for '%s'\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1965 da_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1966 goto cleanup;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1967 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1968 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1969 else if (tag == GCOV_TAG_FOR_COUNTER (GCOV_COUNTER_ARCS) && fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1970 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1971 if (length != GCOV_TAG_COUNTER_LENGTH (fn->counts.size ()))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1972 goto mismatch;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1973
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1974 for (ix = 0; ix != fn->counts.size (); ix++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1975 fn->counts[ix] += gcov_read_counter ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1976 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1977 gcov_sync (base, length);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1978 if ((error = gcov_is_error ()))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1979 {
111
kono
parents: 67
diff changeset
1980 fnotice (stderr,
kono
parents: 67
diff changeset
1981 error < 0
kono
parents: 67
diff changeset
1982 ? N_("%s:overflowed\n")
kono
parents: 67
diff changeset
1983 : N_("%s:corrupted\n"),
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1984 da_file_name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1985 goto cleanup;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1986 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1987 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1988
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1989 gcov_close ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1990 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1991 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1992
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1993 /* Solve the flow graph. Propagate counts from the instrumented arcs
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1994 to the blocks and the uninstrumented arcs. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1995
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1996 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1997 solve_flow_graph (function_info *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1998 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1999 unsigned ix;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2000 arc_info *arc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2001 gcov_type *count_ptr = &fn->counts.front ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2002 block_info *blk;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2003 block_info *valid_blocks = NULL; /* valid, but unpropagated blocks. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2004 block_info *invalid_blocks = NULL; /* invalid, but inferable blocks. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2005
111
kono
parents: 67
diff changeset
2006 /* The arcs were built in reverse order. Fix that now. */
kono
parents: 67
diff changeset
2007 for (ix = fn->blocks.size (); ix--;)
kono
parents: 67
diff changeset
2008 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2009 arc_info *arc_p, *arc_n;
111
kono
parents: 67
diff changeset
2010
kono
parents: 67
diff changeset
2011 for (arc_p = NULL, arc = fn->blocks[ix].succ; arc;
kono
parents: 67
diff changeset
2012 arc_p = arc, arc = arc_n)
kono
parents: 67
diff changeset
2013 {
kono
parents: 67
diff changeset
2014 arc_n = arc->succ_next;
kono
parents: 67
diff changeset
2015 arc->succ_next = arc_p;
kono
parents: 67
diff changeset
2016 }
kono
parents: 67
diff changeset
2017 fn->blocks[ix].succ = arc_p;
kono
parents: 67
diff changeset
2018
kono
parents: 67
diff changeset
2019 for (arc_p = NULL, arc = fn->blocks[ix].pred; arc;
kono
parents: 67
diff changeset
2020 arc_p = arc, arc = arc_n)
kono
parents: 67
diff changeset
2021 {
kono
parents: 67
diff changeset
2022 arc_n = arc->pred_next;
kono
parents: 67
diff changeset
2023 arc->pred_next = arc_p;
kono
parents: 67
diff changeset
2024 }
kono
parents: 67
diff changeset
2025 fn->blocks[ix].pred = arc_p;
kono
parents: 67
diff changeset
2026 }
kono
parents: 67
diff changeset
2027
kono
parents: 67
diff changeset
2028 if (fn->blocks.size () < 2)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2029 fnotice (stderr, "%s:'%s' lacks entry and/or exit blocks\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2030 bbg_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2031 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2032 {
111
kono
parents: 67
diff changeset
2033 if (fn->blocks[ENTRY_BLOCK].num_pred)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2034 fnotice (stderr, "%s:'%s' has arcs to entry block\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2035 bbg_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2036 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2037 /* We can't deduce the entry block counts from the lack of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2038 predecessors. */
111
kono
parents: 67
diff changeset
2039 fn->blocks[ENTRY_BLOCK].num_pred = ~(unsigned)0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2040
111
kono
parents: 67
diff changeset
2041 if (fn->blocks[EXIT_BLOCK].num_succ)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2042 fnotice (stderr, "%s:'%s' has arcs from exit block\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2043 bbg_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2044 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2045 /* Likewise, we can't deduce exit block counts from the lack
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2046 of its successors. */
111
kono
parents: 67
diff changeset
2047 fn->blocks[EXIT_BLOCK].num_succ = ~(unsigned)0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2048 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2049
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2050 /* Propagate the measured counts, this must be done in the same
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2051 order as the code in profile.c */
111
kono
parents: 67
diff changeset
2052 for (unsigned i = 0; i < fn->blocks.size (); i++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2053 {
111
kono
parents: 67
diff changeset
2054 blk = &fn->blocks[i];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2055 block_info const *prev_dst = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2056 int out_of_order = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2057 int non_fake_succ = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2058
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2059 for (arc = blk->succ; arc; arc = arc->succ_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2060 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2061 if (!arc->fake)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2062 non_fake_succ++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2063
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2064 if (!arc->on_tree)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2065 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2066 if (count_ptr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2067 arc->count = *count_ptr++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2068 arc->count_valid = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2069 blk->num_succ--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2070 arc->dst->num_pred--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2071 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2072 if (prev_dst && prev_dst > arc->dst)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2073 out_of_order = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2074 prev_dst = arc->dst;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2075 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2076 if (non_fake_succ == 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2077 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2078 /* If there is only one non-fake exit, it is an
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2079 unconditional branch. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2080 for (arc = blk->succ; arc; arc = arc->succ_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2081 if (!arc->fake)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2082 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2083 arc->is_unconditional = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2084 /* If this block is instrumenting a call, it might be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2085 an artificial block. It is not artificial if it has
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2086 a non-fallthrough exit, or the destination of this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2087 arc has more than one entry. Mark the destination
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2088 block as a return site, if none of those conditions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2089 hold. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2090 if (blk->is_call_site && arc->fall_through
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2091 && arc->dst->pred == arc && !arc->pred_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2092 arc->dst->is_call_return = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2093 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2094 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2095
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2096 /* Sort the successor arcs into ascending dst order. profile.c
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2097 normally produces arcs in the right order, but sometimes with
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2098 one or two out of order. We're not using a particularly
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2099 smart sort. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2100 if (out_of_order)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2101 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2102 arc_info *start = blk->succ;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2103 unsigned changes = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2104
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2105 while (changes)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2106 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2107 arc_info *arc, *arc_p, *arc_n;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2108
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2109 changes = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2110 for (arc_p = NULL, arc = start; (arc_n = arc->succ_next);)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2111 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2112 if (arc->dst > arc_n->dst)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2113 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2114 changes = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2115 if (arc_p)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2116 arc_p->succ_next = arc_n;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2117 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2118 start = arc_n;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2119 arc->succ_next = arc_n->succ_next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2120 arc_n->succ_next = arc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2121 arc_p = arc_n;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2122 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2123 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2124 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2125 arc_p = arc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2126 arc = arc_n;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2127 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2128 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2129 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2130 blk->succ = start;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2131 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2132
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2133 /* Place it on the invalid chain, it will be ignored if that's
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2134 wrong. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2135 blk->invalid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2136 blk->chain = invalid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2137 invalid_blocks = blk;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2138 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2139
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2140 while (invalid_blocks || valid_blocks)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2141 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2142 while ((blk = invalid_blocks))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2143 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2144 gcov_type total = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2145 const arc_info *arc;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2146
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2147 invalid_blocks = blk->chain;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2148 blk->invalid_chain = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2149 if (!blk->num_succ)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2150 for (arc = blk->succ; arc; arc = arc->succ_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2151 total += arc->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2152 else if (!blk->num_pred)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2153 for (arc = blk->pred; arc; arc = arc->pred_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2154 total += arc->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2155 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2156 continue;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2157
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2158 blk->count = total;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2159 blk->count_valid = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2160 blk->chain = valid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2161 blk->valid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2162 valid_blocks = blk;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2163 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2164 while ((blk = valid_blocks))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2165 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2166 gcov_type total;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2167 arc_info *arc, *inv_arc;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2168
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2169 valid_blocks = blk->chain;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2170 blk->valid_chain = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2171 if (blk->num_succ == 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2172 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2173 block_info *dst;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2174
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2175 total = blk->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2176 inv_arc = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2177 for (arc = blk->succ; arc; arc = arc->succ_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2178 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2179 total -= arc->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2180 if (!arc->count_valid)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2181 inv_arc = arc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2182 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2183 dst = inv_arc->dst;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2184 inv_arc->count_valid = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2185 inv_arc->count = total;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2186 blk->num_succ--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2187 dst->num_pred--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2188 if (dst->count_valid)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2189 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2190 if (dst->num_pred == 1 && !dst->valid_chain)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2191 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2192 dst->chain = valid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2193 dst->valid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2194 valid_blocks = dst;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2195 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2196 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2197 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2198 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2199 if (!dst->num_pred && !dst->invalid_chain)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2200 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2201 dst->chain = invalid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2202 dst->invalid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2203 invalid_blocks = dst;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2204 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2205 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2206 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2207 if (blk->num_pred == 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2208 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2209 block_info *src;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2210
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2211 total = blk->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2212 inv_arc = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2213 for (arc = blk->pred; arc; arc = arc->pred_next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2214 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2215 total -= arc->count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2216 if (!arc->count_valid)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2217 inv_arc = arc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2218 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2219 src = inv_arc->src;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2220 inv_arc->count_valid = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2221 inv_arc->count = total;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2222 blk->num_pred--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2223 src->num_succ--;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2224 if (src->count_valid)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2225 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2226 if (src->num_succ == 1 && !src->valid_chain)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2227 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2228 src->chain = valid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2229 src->valid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2230 valid_blocks = src;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2231 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2232 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2233 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2234 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2235 if (!src->num_succ && !src->invalid_chain)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2236 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2237 src->chain = invalid_blocks;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2238 src->invalid_chain = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2239 invalid_blocks = src;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2240 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2241 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2242 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2243 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2244 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2245
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2246 /* If the graph has been correctly solved, every block will have a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2247 valid count. */
111
kono
parents: 67
diff changeset
2248 for (unsigned i = 0; ix < fn->blocks.size (); i++)
kono
parents: 67
diff changeset
2249 if (!fn->blocks[i].count_valid)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2250 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2251 fnotice (stderr, "%s:graph is unsolvable for '%s'\n",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2252 bbg_file_name, fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2253 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2254 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2255 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2256
111
kono
parents: 67
diff changeset
2257 /* Mark all the blocks only reachable via an incoming catch. */
kono
parents: 67
diff changeset
2258
kono
parents: 67
diff changeset
2259 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2260 find_exception_blocks (function_info *fn)
111
kono
parents: 67
diff changeset
2261 {
kono
parents: 67
diff changeset
2262 unsigned ix;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2263 block_info **queue = XALLOCAVEC (block_info *, fn->blocks.size ());
111
kono
parents: 67
diff changeset
2264
kono
parents: 67
diff changeset
2265 /* First mark all blocks as exceptional. */
kono
parents: 67
diff changeset
2266 for (ix = fn->blocks.size (); ix--;)
kono
parents: 67
diff changeset
2267 fn->blocks[ix].exceptional = 1;
kono
parents: 67
diff changeset
2268
kono
parents: 67
diff changeset
2269 /* Now mark all the blocks reachable via non-fake edges */
kono
parents: 67
diff changeset
2270 queue[0] = &fn->blocks[0];
kono
parents: 67
diff changeset
2271 queue[0]->exceptional = 0;
kono
parents: 67
diff changeset
2272 for (ix = 1; ix;)
kono
parents: 67
diff changeset
2273 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2274 block_info *block = queue[--ix];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2275 const arc_info *arc;
111
kono
parents: 67
diff changeset
2276
kono
parents: 67
diff changeset
2277 for (arc = block->succ; arc; arc = arc->succ_next)
kono
parents: 67
diff changeset
2278 if (!arc->fake && !arc->is_throw && arc->dst->exceptional)
kono
parents: 67
diff changeset
2279 {
kono
parents: 67
diff changeset
2280 arc->dst->exceptional = 0;
kono
parents: 67
diff changeset
2281 queue[ix++] = arc->dst;
kono
parents: 67
diff changeset
2282 }
kono
parents: 67
diff changeset
2283 }
kono
parents: 67
diff changeset
2284 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2285
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2286
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2287 /* Increment totals in COVERAGE according to arc ARC. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2288
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2289 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2290 add_branch_counts (coverage_info *coverage, const arc_info *arc)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2291 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2292 if (arc->is_call_non_return)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2293 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2294 coverage->calls++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2295 if (arc->src->count)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2296 coverage->calls_executed++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2297 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2298 else if (!arc->is_unconditional)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2299 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2300 coverage->branches++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2301 if (arc->src->count)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2302 coverage->branches_executed++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2303 if (arc->count)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2304 coverage->branches_taken++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2305 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2306 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2307
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2308 /* Format COUNT, if flag_human_readable_numbers is set, return it human
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2309 readable format. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2310
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2311 static char const *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2312 format_count (gcov_type count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2313 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2314 static char buffer[64];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2315 const char *units = " kMGTPEZY";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2316
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2317 if (count < 1000 || !flag_human_readable_numbers)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2318 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2319 sprintf (buffer, "%" PRId64, count);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2320 return buffer;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2321 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2322
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2323 unsigned i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2324 gcov_type divisor = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2325 for (i = 0; units[i+1]; i++, divisor *= 1000)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2326 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2327 if (count + divisor / 2 < 1000 * divisor)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2328 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2329 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2330 float r = 1.0f * count / divisor;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2331 sprintf (buffer, "%.1f%c", r, units[i]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2332 return buffer;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2333 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2334
111
kono
parents: 67
diff changeset
2335 /* Format a GCOV_TYPE integer as either a percent ratio, or absolute
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2336 count. If DECIMAL_PLACES >= 0, format TOP/BOTTOM * 100 to DECIMAL_PLACES.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2337 If DECIMAL_PLACES is zero, no decimal point is printed. Only print 100% when
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2338 TOP==BOTTOM and only print 0% when TOP=0. If DECIMAL_PLACES < 0, then simply
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2339 format TOP. Return pointer to a static string. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2340
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2341 static char const *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2342 format_gcov (gcov_type top, gcov_type bottom, int decimal_places)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2343 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2344 static char buffer[20];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2345
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2346 if (decimal_places >= 0)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2347 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2348 float ratio = bottom ? 100.0f * top / bottom: 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2349
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2350 /* Round up to 1% if there's a small non-zero value. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2351 if (ratio > 0.0f && ratio < 0.5f && decimal_places == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2352 ratio = 1.0f;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2353 sprintf (buffer, "%.*f%%", decimal_places, ratio);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2354 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2355 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2356 return format_count (top);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2357
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2358 return buffer;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2359 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2360
111
kono
parents: 67
diff changeset
2361 /* Summary of execution */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2362
111
kono
parents: 67
diff changeset
2363 static void
kono
parents: 67
diff changeset
2364 executed_summary (unsigned lines, unsigned executed)
kono
parents: 67
diff changeset
2365 {
kono
parents: 67
diff changeset
2366 if (lines)
kono
parents: 67
diff changeset
2367 fnotice (stdout, "Lines executed:%s of %d\n",
kono
parents: 67
diff changeset
2368 format_gcov (executed, lines, 2), lines);
kono
parents: 67
diff changeset
2369 else
kono
parents: 67
diff changeset
2370 fnotice (stdout, "No executable lines\n");
kono
parents: 67
diff changeset
2371 }
kono
parents: 67
diff changeset
2372
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2373 /* Output summary info for a function. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2374
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2375 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2376 function_summary (const coverage_info *coverage)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2377 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2378 fnotice (stdout, "%s '%s'\n", "Function", coverage->name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2379 executed_summary (coverage->lines, coverage->lines_executed);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2380 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2381
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2382 /* Output summary info for a file. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2383
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2384 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2385 file_summary (const coverage_info *coverage)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2386 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2387 fnotice (stdout, "%s '%s'\n", "File", coverage->name);
111
kono
parents: 67
diff changeset
2388 executed_summary (coverage->lines, coverage->lines_executed);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2389
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2390 if (flag_branches)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2391 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2392 if (coverage->branches)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2393 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2394 fnotice (stdout, "Branches executed:%s of %d\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2395 format_gcov (coverage->branches_executed,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2396 coverage->branches, 2),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2397 coverage->branches);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2398 fnotice (stdout, "Taken at least once:%s of %d\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2399 format_gcov (coverage->branches_taken,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2400 coverage->branches, 2),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2401 coverage->branches);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2402 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2403 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2404 fnotice (stdout, "No branches\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2405 if (coverage->calls)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2406 fnotice (stdout, "Calls executed:%s of %d\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2407 format_gcov (coverage->calls_executed, coverage->calls, 2),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2408 coverage->calls);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2409 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2410 fnotice (stdout, "No calls\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2411 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2412 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2413
111
kono
parents: 67
diff changeset
2414 /* Canonicalize the filename NAME by canonicalizing directory
kono
parents: 67
diff changeset
2415 separators, eliding . components and resolving .. components
kono
parents: 67
diff changeset
2416 appropriately. Always returns a unique string. */
kono
parents: 67
diff changeset
2417
kono
parents: 67
diff changeset
2418 static char *
kono
parents: 67
diff changeset
2419 canonicalize_name (const char *name)
kono
parents: 67
diff changeset
2420 {
kono
parents: 67
diff changeset
2421 /* The canonical name cannot be longer than the incoming name. */
kono
parents: 67
diff changeset
2422 char *result = XNEWVEC (char, strlen (name) + 1);
kono
parents: 67
diff changeset
2423 const char *base = name, *probe;
kono
parents: 67
diff changeset
2424 char *ptr = result;
kono
parents: 67
diff changeset
2425 char *dd_base;
kono
parents: 67
diff changeset
2426 int slash = 0;
kono
parents: 67
diff changeset
2427
kono
parents: 67
diff changeset
2428 #if HAVE_DOS_BASED_FILE_SYSTEM
kono
parents: 67
diff changeset
2429 if (base[0] && base[1] == ':')
kono
parents: 67
diff changeset
2430 {
kono
parents: 67
diff changeset
2431 result[0] = base[0];
kono
parents: 67
diff changeset
2432 result[1] = ':';
kono
parents: 67
diff changeset
2433 base += 2;
kono
parents: 67
diff changeset
2434 ptr += 2;
kono
parents: 67
diff changeset
2435 }
kono
parents: 67
diff changeset
2436 #endif
kono
parents: 67
diff changeset
2437 for (dd_base = ptr; *base; base = probe)
kono
parents: 67
diff changeset
2438 {
kono
parents: 67
diff changeset
2439 size_t len;
kono
parents: 67
diff changeset
2440
kono
parents: 67
diff changeset
2441 for (probe = base; *probe; probe++)
kono
parents: 67
diff changeset
2442 if (IS_DIR_SEPARATOR (*probe))
kono
parents: 67
diff changeset
2443 break;
kono
parents: 67
diff changeset
2444
kono
parents: 67
diff changeset
2445 len = probe - base;
kono
parents: 67
diff changeset
2446 if (len == 1 && base[0] == '.')
kono
parents: 67
diff changeset
2447 /* Elide a '.' directory */
kono
parents: 67
diff changeset
2448 ;
kono
parents: 67
diff changeset
2449 else if (len == 2 && base[0] == '.' && base[1] == '.')
kono
parents: 67
diff changeset
2450 {
kono
parents: 67
diff changeset
2451 /* '..', we can only elide it and the previous directory, if
kono
parents: 67
diff changeset
2452 we're not a symlink. */
kono
parents: 67
diff changeset
2453 struct stat ATTRIBUTE_UNUSED buf;
kono
parents: 67
diff changeset
2454
kono
parents: 67
diff changeset
2455 *ptr = 0;
kono
parents: 67
diff changeset
2456 if (dd_base == ptr
kono
parents: 67
diff changeset
2457 #if defined (S_ISLNK)
kono
parents: 67
diff changeset
2458 /* S_ISLNK is not POSIX.1-1996. */
kono
parents: 67
diff changeset
2459 || stat (result, &buf) || S_ISLNK (buf.st_mode)
kono
parents: 67
diff changeset
2460 #endif
kono
parents: 67
diff changeset
2461 )
kono
parents: 67
diff changeset
2462 {
kono
parents: 67
diff changeset
2463 /* Cannot elide, or unreadable or a symlink. */
kono
parents: 67
diff changeset
2464 dd_base = ptr + 2 + slash;
kono
parents: 67
diff changeset
2465 goto regular;
kono
parents: 67
diff changeset
2466 }
kono
parents: 67
diff changeset
2467 while (ptr != dd_base && *ptr != '/')
kono
parents: 67
diff changeset
2468 ptr--;
kono
parents: 67
diff changeset
2469 slash = ptr != result;
kono
parents: 67
diff changeset
2470 }
kono
parents: 67
diff changeset
2471 else
kono
parents: 67
diff changeset
2472 {
kono
parents: 67
diff changeset
2473 regular:
kono
parents: 67
diff changeset
2474 /* Regular pathname component. */
kono
parents: 67
diff changeset
2475 if (slash)
kono
parents: 67
diff changeset
2476 *ptr++ = '/';
kono
parents: 67
diff changeset
2477 memcpy (ptr, base, len);
kono
parents: 67
diff changeset
2478 ptr += len;
kono
parents: 67
diff changeset
2479 slash = 1;
kono
parents: 67
diff changeset
2480 }
kono
parents: 67
diff changeset
2481
kono
parents: 67
diff changeset
2482 for (; IS_DIR_SEPARATOR (*probe); probe++)
kono
parents: 67
diff changeset
2483 continue;
kono
parents: 67
diff changeset
2484 }
kono
parents: 67
diff changeset
2485 *ptr = 0;
kono
parents: 67
diff changeset
2486
kono
parents: 67
diff changeset
2487 return result;
kono
parents: 67
diff changeset
2488 }
kono
parents: 67
diff changeset
2489
kono
parents: 67
diff changeset
2490 /* Print hex representation of 16 bytes from SUM and write it to BUFFER. */
kono
parents: 67
diff changeset
2491
kono
parents: 67
diff changeset
2492 static void
kono
parents: 67
diff changeset
2493 md5sum_to_hex (const char *sum, char *buffer)
kono
parents: 67
diff changeset
2494 {
kono
parents: 67
diff changeset
2495 for (unsigned i = 0; i < 16; i++)
kono
parents: 67
diff changeset
2496 sprintf (buffer + (2 * i), "%02x", (unsigned char)sum[i]);
kono
parents: 67
diff changeset
2497 }
kono
parents: 67
diff changeset
2498
kono
parents: 67
diff changeset
2499 /* Generate an output file name. INPUT_NAME is the canonicalized main
kono
parents: 67
diff changeset
2500 input file and SRC_NAME is the canonicalized file name.
kono
parents: 67
diff changeset
2501 LONG_OUTPUT_NAMES and PRESERVE_PATHS affect name generation. With
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2502 long_output_names we prepend the processed name of the input file
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2503 to each output name (except when the current source file is the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2504 input file, so you don't get a double concatenation). The two
111
kono
parents: 67
diff changeset
2505 components are separated by '##'. With preserve_paths we create a
kono
parents: 67
diff changeset
2506 filename from all path components of the source file, replacing '/'
kono
parents: 67
diff changeset
2507 with '#', and .. with '^', without it we simply take the basename
kono
parents: 67
diff changeset
2508 component. (Remember, the canonicalized name will already have
kono
parents: 67
diff changeset
2509 elided '.' components and converted \\ separators.) */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2510
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2511 static char *
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2512 make_gcov_file_name (const char *input_name, const char *src_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2513 {
111
kono
parents: 67
diff changeset
2514 char *ptr;
kono
parents: 67
diff changeset
2515 char *result;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2516
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2517 if (flag_long_names && input_name && strcmp (src_name, input_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2518 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2519 /* Generate the input filename part. */
111
kono
parents: 67
diff changeset
2520 result = XNEWVEC (char, strlen (input_name) + strlen (src_name) + 10);
kono
parents: 67
diff changeset
2521
kono
parents: 67
diff changeset
2522 ptr = result;
kono
parents: 67
diff changeset
2523 ptr = mangle_name (input_name, ptr);
kono
parents: 67
diff changeset
2524 ptr[0] = ptr[1] = '#';
kono
parents: 67
diff changeset
2525 ptr += 2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2526 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2527 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2528 {
111
kono
parents: 67
diff changeset
2529 result = XNEWVEC (char, strlen (src_name) + 10);
kono
parents: 67
diff changeset
2530 ptr = result;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2531 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2532
111
kono
parents: 67
diff changeset
2533 ptr = mangle_name (src_name, ptr);
kono
parents: 67
diff changeset
2534 strcpy (ptr, ".gcov");
kono
parents: 67
diff changeset
2535
kono
parents: 67
diff changeset
2536 /* When hashing filenames, we shorten them by only using the filename
kono
parents: 67
diff changeset
2537 component and appending a hash of the full (mangled) pathname. */
kono
parents: 67
diff changeset
2538 if (flag_hash_filenames)
kono
parents: 67
diff changeset
2539 {
kono
parents: 67
diff changeset
2540 md5_ctx ctx;
kono
parents: 67
diff changeset
2541 char md5sum[16];
kono
parents: 67
diff changeset
2542 char md5sum_hex[33];
kono
parents: 67
diff changeset
2543
kono
parents: 67
diff changeset
2544 md5_init_ctx (&ctx);
kono
parents: 67
diff changeset
2545 md5_process_bytes (src_name, strlen (src_name), &ctx);
kono
parents: 67
diff changeset
2546 md5_finish_ctx (&ctx, md5sum);
kono
parents: 67
diff changeset
2547 md5sum_to_hex (md5sum, md5sum_hex);
kono
parents: 67
diff changeset
2548 free (result);
kono
parents: 67
diff changeset
2549
kono
parents: 67
diff changeset
2550 result = XNEWVEC (char, strlen (src_name) + 50);
kono
parents: 67
diff changeset
2551 ptr = result;
kono
parents: 67
diff changeset
2552 ptr = mangle_name (src_name, ptr);
kono
parents: 67
diff changeset
2553 ptr[0] = ptr[1] = '#';
kono
parents: 67
diff changeset
2554 ptr += 2;
kono
parents: 67
diff changeset
2555 memcpy (ptr, md5sum_hex, 32);
kono
parents: 67
diff changeset
2556 ptr += 32;
kono
parents: 67
diff changeset
2557 strcpy (ptr, ".gcov");
kono
parents: 67
diff changeset
2558 }
kono
parents: 67
diff changeset
2559
kono
parents: 67
diff changeset
2560 return result;
kono
parents: 67
diff changeset
2561 }
kono
parents: 67
diff changeset
2562
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2563 /* Mangle BASE name, copy it at the beginning of PTR buffer and
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2564 return address of the \0 character of the buffer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2565
111
kono
parents: 67
diff changeset
2566 static char *
kono
parents: 67
diff changeset
2567 mangle_name (char const *base, char *ptr)
kono
parents: 67
diff changeset
2568 {
kono
parents: 67
diff changeset
2569 size_t len;
kono
parents: 67
diff changeset
2570
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2571 /* Generate the source filename part. */
111
kono
parents: 67
diff changeset
2572 if (!flag_preserve_paths)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2573 base = lbasename (base);
111
kono
parents: 67
diff changeset
2574 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2575 base = mangle_path (base);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2576
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2577 len = strlen (base);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2578 memcpy (ptr, base, len);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2579 ptr += len;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2580
111
kono
parents: 67
diff changeset
2581 return ptr;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2582 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2583
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2584 /* Scan through the bb_data for each line in the block, increment
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2585 the line number execution count indicated by the execution count of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2586 the appropriate basic block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2587
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2588 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2589 add_line_counts (coverage_info *coverage, function_info *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2590 {
111
kono
parents: 67
diff changeset
2591 bool has_any_line = false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2592 /* Scan each basic block. */
111
kono
parents: 67
diff changeset
2593 for (unsigned ix = 0; ix != fn->blocks.size (); ix++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2594 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2595 line_info *line = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2596 block_info *block = &fn->blocks[ix];
111
kono
parents: 67
diff changeset
2597 if (block->count && ix && ix + 1 != fn->blocks.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2598 fn->blocks_executed++;
111
kono
parents: 67
diff changeset
2599 for (unsigned i = 0; i < block->locations.size (); i++)
kono
parents: 67
diff changeset
2600 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2601 unsigned src_idx = block->locations[i].source_file_idx;
111
kono
parents: 67
diff changeset
2602 vector<unsigned> &lines = block->locations[i].lines;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2603
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2604 block->cycle.arc = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2605 block->cycle.ident = ~0U;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2606
111
kono
parents: 67
diff changeset
2607 for (unsigned j = 0; j < lines.size (); j++)
kono
parents: 67
diff changeset
2608 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2609 unsigned ln = lines[j];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2610
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2611 /* Line belongs to a function that is in a group. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2612 if (fn->group_line_p (ln, src_idx))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2613 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2614 gcc_assert (lines[j] - fn->start_line < fn->lines.size ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2615 line = &(fn->lines[lines[j] - fn->start_line]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2616 line->exists = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2617 if (!block->exceptional)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2618 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2619 line->unexceptional = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2620 if (block->count == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2621 line->has_unexecuted_block = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2622 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2623 line->count += block->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2624 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2625 else
111
kono
parents: 67
diff changeset
2626 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2627 gcc_assert (ln < sources[src_idx].lines.size ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2628 line = &(sources[src_idx].lines[ln]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2629 if (coverage)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2630 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2631 if (!line->exists)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2632 coverage->lines++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2633 if (!line->count && block->count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2634 coverage->lines_executed++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2635 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2636 line->exists = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2637 if (!block->exceptional)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2638 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2639 line->unexceptional = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2640 if (block->count == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2641 line->has_unexecuted_block = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2642 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2643 line->count += block->count;
111
kono
parents: 67
diff changeset
2644 }
kono
parents: 67
diff changeset
2645 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2646
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2647 has_any_line = true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2648
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2649 if (!ix || ix + 1 == fn->blocks.size ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2650 /* Entry or exit block. */;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2651 else if (line != NULL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2652 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2653 line->blocks.push_back (block);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2654
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2655 if (flag_branches)
111
kono
parents: 67
diff changeset
2656 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2657 arc_info *arc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2658
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2659 for (arc = block->succ; arc; arc = arc->succ_next)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2660 line->branches.push_back (arc);
111
kono
parents: 67
diff changeset
2661 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2662 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2663 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2664 }
111
kono
parents: 67
diff changeset
2665
kono
parents: 67
diff changeset
2666 if (!has_any_line)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2667 fnotice (stderr, "%s:no lines for '%s'\n", bbg_file_name,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2668 fn->get_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2669 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2670
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2671 /* Accumulate info for LINE that belongs to SRC source file. If ADD_COVERAGE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2672 is set to true, update source file summary. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2673
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2674 static void accumulate_line_info (line_info *line, source_info *src,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2675 bool add_coverage)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2676 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2677 if (add_coverage)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2678 for (vector<arc_info *>::iterator it = line->branches.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2679 it != line->branches.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2680 add_branch_counts (&src->coverage, *it);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2681
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2682 if (!line->blocks.empty ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2683 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2684 /* The user expects the line count to be the number of times
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2685 a line has been executed. Simply summing the block count
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2686 will give an artificially high number. The Right Thing
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2687 is to sum the entry counts to the graph of blocks on this
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2688 line, then find the elementary cycles of the local graph
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2689 and add the transition counts of those cycles. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2690 gcov_type count = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2691
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2692 /* Cycle detection. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2693 for (vector<block_info *>::iterator it = line->blocks.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2694 it != line->blocks.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2695 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2696 for (arc_info *arc = (*it)->pred; arc; arc = arc->pred_next)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2697 if (!line->has_block (arc->src))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2698 count += arc->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2699 for (arc_info *arc = (*it)->succ; arc; arc = arc->succ_next)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2700 arc->cs_count = arc->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2701 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2702
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2703 /* Now, add the count of loops entirely on this line. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2704 count += get_cycles_count (*line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2705 line->count = count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2706
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2707 if (line->count > src->maximum_count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2708 src->maximum_count = line->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2709 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2710
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2711 if (line->exists && add_coverage)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2712 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2713 src->coverage.lines++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2714 if (line->count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2715 src->coverage.lines_executed++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2716 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2717 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2718
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2719 /* Accumulate the line counts of a file. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2720
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2721 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2722 accumulate_line_counts (source_info *src)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2723 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2724 /* First work on group functions. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2725 for (vector<function_info *>::iterator it = src->functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2726 it != src->functions.end (); it++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2727 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2728 function_info *fn = *it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2729
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2730 if (fn->src != src->index || !fn->is_group)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2731 continue;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2732
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2733 for (vector<line_info>::iterator it2 = fn->lines.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2734 it2 != fn->lines.end (); it2++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2735 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2736 line_info *line = &(*it2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2737 accumulate_line_info (line, src, false);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2738 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2739 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2740
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2741 /* Work on global lines that line in source file SRC. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2742 for (vector<line_info>::iterator it = src->lines.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2743 it != src->lines.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2744 accumulate_line_info (&(*it), src, true);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2745
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2746 /* If not using intermediate mode, sum lines of group functions and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2747 add them to lines that live in a source file. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2748 if (!flag_json_format)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2749 for (vector<function_info *>::iterator it = src->functions.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2750 it != src->functions.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2751 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2752 function_info *fn = *it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2753
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2754 if (fn->src != src->index || !fn->is_group)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2755 continue;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2756
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2757 for (unsigned i = 0; i < fn->lines.size (); i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2758 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2759 line_info *fn_line = &fn->lines[i];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2760 if (fn_line->exists)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2761 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2762 unsigned ln = fn->start_line + i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2763 line_info *src_line = &src->lines[ln];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2764
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2765 if (!src_line->exists)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2766 src->coverage.lines++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2767 if (!src_line->count && fn_line->count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2768 src->coverage.lines_executed++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2769
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2770 src_line->count += fn_line->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2771 src_line->exists = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2772
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2773 if (fn_line->has_unexecuted_block)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2774 src_line->has_unexecuted_block = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2775
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2776 if (fn_line->unexceptional)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2777 src_line->unexceptional = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2778 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2779 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2780 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2781 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2782
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2783 /* Output information about ARC number IX. Returns nonzero if
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2784 anything is output. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2785
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2786 static int
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2787 output_branch_count (FILE *gcov_file, int ix, const arc_info *arc)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2788 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2789 if (arc->is_call_non_return)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2790 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2791 if (arc->src->count)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2792 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2793 fnotice (gcov_file, "call %2d returned %s\n", ix,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2794 format_gcov (arc->src->count - arc->count,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2795 arc->src->count, -flag_counts));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2796 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2797 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2798 fnotice (gcov_file, "call %2d never executed\n", ix);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2799 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2800 else if (!arc->is_unconditional)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2801 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2802 if (arc->src->count)
111
kono
parents: 67
diff changeset
2803 fnotice (gcov_file, "branch %2d taken %s%s", ix,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2804 format_gcov (arc->count, arc->src->count, -flag_counts),
111
kono
parents: 67
diff changeset
2805 arc->fall_through ? " (fallthrough)"
kono
parents: 67
diff changeset
2806 : arc->is_throw ? " (throw)" : "");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2807 else
111
kono
parents: 67
diff changeset
2808 fnotice (gcov_file, "branch %2d never executed", ix);
kono
parents: 67
diff changeset
2809
kono
parents: 67
diff changeset
2810 if (flag_verbose)
kono
parents: 67
diff changeset
2811 fnotice (gcov_file, " (BB %d)", arc->dst->id);
kono
parents: 67
diff changeset
2812
kono
parents: 67
diff changeset
2813 fnotice (gcov_file, "\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2814 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2815 else if (flag_unconditional && !arc->dst->is_call_return)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2816 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2817 if (arc->src->count)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2818 fnotice (gcov_file, "unconditional %2d taken %s\n", ix,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2819 format_gcov (arc->count, arc->src->count, -flag_counts));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2820 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2821 fnotice (gcov_file, "unconditional %2d never executed\n", ix);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2822 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2823 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2824 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2825 return 1;
111
kono
parents: 67
diff changeset
2826 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2827
111
kono
parents: 67
diff changeset
2828 static const char *
kono
parents: 67
diff changeset
2829 read_line (FILE *file)
kono
parents: 67
diff changeset
2830 {
kono
parents: 67
diff changeset
2831 static char *string;
kono
parents: 67
diff changeset
2832 static size_t string_len;
kono
parents: 67
diff changeset
2833 size_t pos = 0;
kono
parents: 67
diff changeset
2834 char *ptr;
kono
parents: 67
diff changeset
2835
kono
parents: 67
diff changeset
2836 if (!string_len)
kono
parents: 67
diff changeset
2837 {
kono
parents: 67
diff changeset
2838 string_len = 200;
kono
parents: 67
diff changeset
2839 string = XNEWVEC (char, string_len);
kono
parents: 67
diff changeset
2840 }
kono
parents: 67
diff changeset
2841
kono
parents: 67
diff changeset
2842 while ((ptr = fgets (string + pos, string_len - pos, file)))
kono
parents: 67
diff changeset
2843 {
kono
parents: 67
diff changeset
2844 size_t len = strlen (string + pos);
kono
parents: 67
diff changeset
2845
kono
parents: 67
diff changeset
2846 if (len && string[pos + len - 1] == '\n')
kono
parents: 67
diff changeset
2847 {
kono
parents: 67
diff changeset
2848 string[pos + len - 1] = 0;
kono
parents: 67
diff changeset
2849 return string;
kono
parents: 67
diff changeset
2850 }
kono
parents: 67
diff changeset
2851 pos += len;
kono
parents: 67
diff changeset
2852 /* If the file contains NUL characters or an incomplete
kono
parents: 67
diff changeset
2853 last line, which can happen more than once in one run,
kono
parents: 67
diff changeset
2854 we have to avoid doubling the STRING_LEN unnecessarily. */
kono
parents: 67
diff changeset
2855 if (pos > string_len / 2)
kono
parents: 67
diff changeset
2856 {
kono
parents: 67
diff changeset
2857 string_len *= 2;
kono
parents: 67
diff changeset
2858 string = XRESIZEVEC (char, string, string_len);
kono
parents: 67
diff changeset
2859 }
kono
parents: 67
diff changeset
2860 }
kono
parents: 67
diff changeset
2861
kono
parents: 67
diff changeset
2862 return pos ? string : NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2863 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2864
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2865 /* Pad string S with spaces from left to have total width equal to 9. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2866
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2867 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2868 pad_count_string (string &s)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2869 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2870 if (s.size () < 9)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2871 s.insert (0, 9 - s.size (), ' ');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2872 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2873
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2874 /* Print GCOV line beginning to F stream. If EXISTS is set to true, the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2875 line exists in source file. UNEXCEPTIONAL indicated that it's not in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2876 an exceptional statement. The output is printed for LINE_NUM of given
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2877 COUNT of executions. EXCEPTIONAL_STRING and UNEXCEPTIONAL_STRING are
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2878 used to indicate non-executed blocks. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2879
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2880 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2881 output_line_beginning (FILE *f, bool exists, bool unexceptional,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2882 bool has_unexecuted_block,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2883 gcov_type count, unsigned line_num,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2884 const char *exceptional_string,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2885 const char *unexceptional_string,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2886 unsigned int maximum_count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2887 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2888 string s;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2889 if (exists)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2890 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2891 if (count > 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2892 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2893 s = format_gcov (count, 0, -1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2894 if (has_unexecuted_block
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2895 && bbg_supports_has_unexecuted_blocks)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2896 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2897 if (flag_use_colors)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2898 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2899 pad_count_string (s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2900 s.insert (0, SGR_SEQ (COLOR_BG_MAGENTA
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2901 COLOR_SEPARATOR COLOR_FG_WHITE));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2902 s += SGR_RESET;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2903 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2904 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2905 s += "*";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2906 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2907 pad_count_string (s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2908 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2909 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2910 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2911 if (flag_use_colors)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2912 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2913 s = "0";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2914 pad_count_string (s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2915 if (unexceptional)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2916 s.insert (0, SGR_SEQ (COLOR_BG_RED
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2917 COLOR_SEPARATOR COLOR_FG_WHITE));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2918 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2919 s.insert (0, SGR_SEQ (COLOR_BG_CYAN
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2920 COLOR_SEPARATOR COLOR_FG_WHITE));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2921 s += SGR_RESET;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2922 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2923 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2924 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2925 s = unexceptional ? unexceptional_string : exceptional_string;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2926 pad_count_string (s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2927 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2928 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2929 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2930 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2931 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2932 s = "-";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2933 pad_count_string (s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2934 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2935
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2936 /* Format line number in output. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2937 char buffer[16];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2938 sprintf (buffer, "%5u", line_num);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2939 string linestr (buffer);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2940
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2941 if (flag_use_hotness_colors && maximum_count)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2942 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2943 if (count * 2 > maximum_count) /* > 50%. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2944 linestr.insert (0, SGR_SEQ (COLOR_BG_RED));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2945 else if (count * 5 > maximum_count) /* > 20%. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2946 linestr.insert (0, SGR_SEQ (COLOR_BG_YELLOW));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2947 else if (count * 10 > maximum_count) /* > 10%. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2948 linestr.insert (0, SGR_SEQ (COLOR_BG_GREEN));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2949 linestr += SGR_RESET;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2950 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2951
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2952 fprintf (f, "%s:%s", s.c_str (), linestr.c_str ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2953 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2954
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2955 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2956 print_source_line (FILE *f, const vector<const char *> &source_lines,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2957 unsigned line)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2958 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2959 gcc_assert (line >= 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2960 gcc_assert (line <= source_lines.size ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2961
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2962 fprintf (f, ":%s\n", source_lines[line - 1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2963 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2964
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2965 /* Output line details for LINE and print it to F file. LINE lives on
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2966 LINE_NUM. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2967
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2968 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2969 output_line_details (FILE *f, const line_info *line, unsigned line_num)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2970 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2971 if (flag_all_blocks)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2972 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2973 arc_info *arc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2974 int ix, jx;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2975
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2976 ix = jx = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2977 for (vector<block_info *>::const_iterator it = line->blocks.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2978 it != line->blocks.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2979 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2980 if (!(*it)->is_call_return)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2981 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2982 output_line_beginning (f, line->exists,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2983 (*it)->exceptional, false,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2984 (*it)->count, line_num,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2985 "%%%%%", "$$$$$", 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2986 fprintf (f, "-block %2d", ix++);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2987 if (flag_verbose)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2988 fprintf (f, " (BB %u)", (*it)->id);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2989 fprintf (f, "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2990 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2991 if (flag_branches)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2992 for (arc = (*it)->succ; arc; arc = arc->succ_next)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2993 jx += output_branch_count (f, jx, arc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2994 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2995 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2996 else if (flag_branches)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2997 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2998 int ix;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2999
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3000 ix = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3001 for (vector<arc_info *>::const_iterator it = line->branches.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3002 it != line->branches.end (); it++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3003 ix += output_branch_count (f, ix, (*it));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3004 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3005 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3006
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3007 /* Output detail statistics about function FN to file F. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3008
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3009 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3010 output_function_details (FILE *f, function_info *fn)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3011 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3012 if (!flag_branches)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3013 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3014
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3015 arc_info *arc = fn->blocks[EXIT_BLOCK].pred;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3016 gcov_type return_count = fn->blocks[EXIT_BLOCK].count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3017 gcov_type called_count = fn->blocks[ENTRY_BLOCK].count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3018
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3019 for (; arc; arc = arc->pred_next)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3020 if (arc->fake)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3021 return_count -= arc->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3022
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3023 fprintf (f, "function %s", fn->get_name ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3024 fprintf (f, " called %s",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3025 format_gcov (called_count, 0, -1));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3026 fprintf (f, " returned %s",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3027 format_gcov (return_count, called_count, 0));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3028 fprintf (f, " blocks executed %s",
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3029 format_gcov (fn->blocks_executed, fn->get_block_count (), 0));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3030 fprintf (f, "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3031 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3032
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3033 /* Read in the source file one line at a time, and output that line to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3034 the gcov file preceded by its execution count and other
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3035 information. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3036
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3037 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3038 output_lines (FILE *gcov_file, const source_info *src)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3039 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3040 #define DEFAULT_LINE_START " -: 0:"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3041 #define FN_SEPARATOR "------------------\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3042
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3043 FILE *source_file;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3044 const char *retval;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3045
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3046 /* Print colorization legend. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3047 if (flag_use_colors)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3048 fprintf (gcov_file, "%s",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3049 DEFAULT_LINE_START "Colorization: profile count: " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3050 SGR_SEQ (COLOR_BG_CYAN) "zero coverage (exceptional)" SGR_RESET \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3051 " " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3052 SGR_SEQ (COLOR_BG_RED) "zero coverage (unexceptional)" SGR_RESET \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3053 " " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3054 SGR_SEQ (COLOR_BG_MAGENTA) "unexecuted block" SGR_RESET "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3055
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3056 if (flag_use_hotness_colors)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3057 fprintf (gcov_file, "%s",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3058 DEFAULT_LINE_START "Colorization: line numbers: hotness: " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3059 SGR_SEQ (COLOR_BG_RED) "> 50%" SGR_RESET " " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3060 SGR_SEQ (COLOR_BG_YELLOW) "> 20%" SGR_RESET " " \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3061 SGR_SEQ (COLOR_BG_GREEN) "> 10%" SGR_RESET "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3062
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3063 fprintf (gcov_file, DEFAULT_LINE_START "Source:%s\n", src->coverage.name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3064 if (!multiple_files)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3065 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3066 fprintf (gcov_file, DEFAULT_LINE_START "Graph:%s\n", bbg_file_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3067 fprintf (gcov_file, DEFAULT_LINE_START "Data:%s\n",
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3068 no_data_file ? "-" : da_file_name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3069 fprintf (gcov_file, DEFAULT_LINE_START "Runs:%u\n", object_runs);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3070 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3071
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3072 source_file = fopen (src->name, "r");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3073 if (!source_file)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3074 fnotice (stderr, "Cannot open source file %s\n", src->name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3075 else if (src->file_time == 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3076 fprintf (gcov_file, DEFAULT_LINE_START "Source is newer than graph\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3077
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3078 vector<const char *> source_lines;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3079 if (source_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3080 while ((retval = read_line (source_file)) != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3081 source_lines.push_back (xstrdup (retval));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3082
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3083 unsigned line_start_group = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3084 vector<function_info *> *fns;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3085
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3086 for (unsigned line_num = 1; line_num <= source_lines.size (); line_num++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3087 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3088 if (line_num >= src->lines.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3089 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3090 fprintf (gcov_file, "%9s:%5u", "-", line_num);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3091 print_source_line (gcov_file, source_lines, line_num);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3092 continue;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3093 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3094
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3095 const line_info *line = &src->lines[line_num];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3096
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3097 if (line_start_group == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3098 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3099 fns = src->get_functions_at_location (line_num);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3100 if (fns != NULL && fns->size () > 1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3101 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3102 /* It's possible to have functions that partially overlap,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3103 thus take the maximum end_line of functions starting
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3104 at LINE_NUM. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3105 for (unsigned i = 0; i < fns->size (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3106 if ((*fns)[i]->end_line > line_start_group)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3107 line_start_group = (*fns)[i]->end_line;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3108 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3109 else if (fns != NULL && fns->size () == 1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3110 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3111 function_info *fn = (*fns)[0];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3112 output_function_details (gcov_file, fn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3113 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3114 }
111
kono
parents: 67
diff changeset
3115
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3116 /* For lines which don't exist in the .bb file, print '-' before
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3117 the source line. For lines which exist but were never
111
kono
parents: 67
diff changeset
3118 executed, print '#####' or '=====' before the source line.
kono
parents: 67
diff changeset
3119 Otherwise, print the execution count before the source line.
kono
parents: 67
diff changeset
3120 There are 16 spaces of indentation added before the source
kono
parents: 67
diff changeset
3121 line so that tabs won't be messed up. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3122 output_line_beginning (gcov_file, line->exists, line->unexceptional,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3123 line->has_unexecuted_block, line->count,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3124 line_num, "=====", "#####", src->maximum_count);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3126 print_source_line (gcov_file, source_lines, line_num);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3127 output_line_details (gcov_file, line, line_num);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3128
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3129 if (line_start_group == line_num)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3130 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3131 for (vector<function_info *>::iterator it = fns->begin ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3132 it != fns->end (); it++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3133 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3134 function_info *fn = *it;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3135 vector<line_info> &lines = fn->lines;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3136
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3137 fprintf (gcov_file, FN_SEPARATOR);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3138
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3139 string fn_name = fn->get_name ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3140 if (flag_use_colors)
111
kono
parents: 67
diff changeset
3141 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3142 fn_name.insert (0, SGR_SEQ (COLOR_FG_CYAN));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3143 fn_name += SGR_RESET;
111
kono
parents: 67
diff changeset
3144 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3145
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3146 fprintf (gcov_file, "%s:\n", fn_name.c_str ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3147
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3148 output_function_details (gcov_file, fn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3149
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3150 /* Print all lines covered by the function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3151 for (unsigned i = 0; i < lines.size (); i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3152 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3153 line_info *line = &lines[i];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3154 unsigned l = fn->start_line + i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3155
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3156 /* For lines which don't exist in the .bb file, print '-'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3157 before the source line. For lines which exist but
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3158 were never executed, print '#####' or '=====' before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3159 the source line. Otherwise, print the execution count
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3160 before the source line.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3161 There are 16 spaces of indentation added before the source
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3162 line so that tabs won't be messed up. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3163 output_line_beginning (gcov_file, line->exists,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3164 line->unexceptional,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3165 line->has_unexecuted_block,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3166 line->count,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3167 l, "=====", "#####",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3168 src->maximum_count);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3169
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3170 print_source_line (gcov_file, source_lines, l);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3171 output_line_details (gcov_file, line, l);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3172 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3173 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3174
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3175 fprintf (gcov_file, FN_SEPARATOR);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3176 line_start_group = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3177 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3178 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3179
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3180 if (source_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3181 fclose (source_file);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3182 }