gcc/ChangeLog:

2017-11-09  Martin Liska  <mli...@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


Reply via email to