aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcov.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-11-13 10:05:38 +0100
committerMartin Liska <marxin@gcc.gnu.org>2017-11-13 09:05:38 +0000
commit1e81a283a22723f943643002376fc73427001ba0 (patch)
tree10270f8a6f85e34cc0945dfcff28311b734245ec /gcc/gcov.c
parent211bea6b40bfa457a9e8619cf653227206736e76 (diff)
downloadgcc-1e81a283a22723f943643002376fc73427001ba0.zip
gcc-1e81a283a22723f943643002376fc73427001ba0.tar.gz
gcc-1e81a283a22723f943643002376fc73427001ba0.tar.bz2
GCOV: simplify usage of function_info::artificial.
2017-11-13 Martin Liska <mliska@suse.cz> * gcov.c (function_info::is_artificial): New function. (process_file): Erase all artificial early. (generate_results): Skip as all artificial are already removed. From-SVN: r254673
Diffstat (limited to 'gcc/gcov.c')
-rw-r--r--gcc/gcov.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 71239cf..01901ed 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -232,6 +232,14 @@ typedef struct function_info
The line must be defined in body of the function, can't be inlined. */
bool group_line_p (unsigned n, unsigned src_idx);
+ /* Function filter based on function_info::artificial variable. */
+
+ static inline bool
+ is_artificial (function_info *fn)
+ {
+ return fn->artificial;
+ }
+
/* Name of function. */
char *name;
char *demangled_name;
@@ -1152,33 +1160,40 @@ process_file (const char *file_name)
fn_map.put (needle, *it);
}
+ /* Remove all artificial function. */
+ functions.erase (remove_if (functions.begin (), functions.end (),
+ function_info::is_artificial), functions.end ());
+
for (vector<function_t *>::iterator it = functions.begin ();
it != functions.end (); it++)
{
function_t *fn = *it;
+ unsigned src = fn->src;
if (fn->counts || no_data_file)
{
- unsigned src = fn->src;
- unsigned block_no;
+ source_info *s = &sources[src];
+ s->functions.push_back (fn);
- /* Process only non-artificial functions. */
- if (!fn->artificial)
+ /* Mark last line in files touched by function. */
+ for (unsigned block_no = 0; block_no != fn->blocks.size ();
+ block_no++)
{
- source_info *s = &sources[src];
- s->functions.push_back (fn);
-
- /* Mark last line in files touched by function. */
- for (block_no = 0; block_no != fn->blocks.size (); block_no++)
+ block_t *block = &fn->blocks[block_no];
+ for (unsigned i = 0; i < block->locations.size (); i++)
{
- block_t *block = &fn->blocks[block_no];
- for (unsigned i = 0; i < block->locations.size (); i++)
+ /* Sort lines of locations. */
+ sort (block->locations[i].lines.begin (),
+ block->locations[i].lines.end ());
+
+ if (!block->locations[i].lines.empty ())
{
- /* Sort lines of locations. */
- sort (block->locations[i].lines.begin (),
- block->locations[i].lines.end ());
+ s = &sources[block->locations[i].source_file_idx];
+ unsigned last_line
+ = block->locations[i].lines.back ();
- if (!block->locations[i].lines.empty ())
+ /* Record new lines for the function. */
+ if (last_line >= s->lines.size ())
{
s = &sources[block->locations[i].source_file_idx];
unsigned last_line
@@ -1192,17 +1207,18 @@ process_file (const char *file_name)
}
}
}
-
- /* Allocate lines for group function, following start_line
- and end_line information of the function. */
- if (fn->is_group)
- fn->lines.resize (fn->end_line - fn->start_line + 1);
}
-
- solve_flow_graph (fn);
- if (fn->has_catch)
- find_exception_blocks (fn);
}
+
+ /* Allocate lines for group function, following start_line
+ and end_line information of the function. */
+ if (fn->is_group)
+ fn->lines.resize (fn->end_line - fn->start_line + 1);
+
+
+ solve_flow_graph (fn);
+ if (fn->has_catch)
+ find_exception_blocks (fn);
}
else
{
@@ -1251,8 +1267,6 @@ generate_results (const char *file_name)
{
function_t *fn = *it;
coverage_t coverage;
- if (fn->artificial)
- continue;
memset (&coverage, 0, sizeof (coverage));
coverage.name = flag_demangled_names ? fn->demangled_name : fn->name;