aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcov.c
diff options
context:
space:
mode:
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;