This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 2/7] GCOV: simplify usage of function_info::artificial.


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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]