annotate gcc/gcov.c @ 132:d34655255c78

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