diff options
author | Martin Liska <mliska@suse.cz> | 2017-11-13 10:05:38 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-11-13 09:05:38 +0000 |
commit | 1e81a283a22723f943643002376fc73427001ba0 (patch) | |
tree | 10270f8a6f85e34cc0945dfcff28311b734245ec /gcc/gcov.c | |
parent | 211bea6b40bfa457a9e8619cf653227206736e76 (diff) | |
download | gcc-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.c | 66 |
1 files changed, 40 insertions, 26 deletions
@@ -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; |