This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 2/7] GCOV: simplify usage of function_info::artificial.
- From: marxin <mliska at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Cc: nathan at acm dot org
- Date: Thu, 9 Nov 2017 11:24:05 +0100
- Subject: [PATCH 2/7] GCOV: simplify usage of function_info::artificial.
- Authentication-results: sourceware.org; auth=none
- References: <cover.1510223055.git.mliska@suse.cz>
- Resent-user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0
gcc/ChangeLog:
2017-11-09 Martin Liska <mliska@suse.cz>
* gcov.c (is_artificial): New function.
(process_file): Erase all artificial early.
(generate_results): Skip as all artificial are already
removed.
---
gcc/gcov.c | 66 +++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 40 insertions(+), 26 deletions(-)
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 83239639247..3dc159726c7 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -1088,6 +1088,14 @@ struct function_start_pair_hash : typed_noop_remove <function_start>
}
};
+/* Function filter based on function_info::artificial variable. */
+
+static bool
+is_artificial (function_info *fn)
+{
+ return fn->artificial;
+}
+
/* Process a single input file. */
static void
@@ -1122,33 +1130,40 @@ process_file (const char *file_name)
fn_map.put (needle, *it);
}
+ /* Remove all artificial function. */
+ functions.erase (remove_if (functions.begin (), functions.end (),
+ 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
@@ -1162,17 +1177,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
{
@@ -1221,8 +1237,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;
--
2.14.3