Hi.

The patch adds missing information into JSON intermediate format.
Before the patch one can't assign 'lines' to 'functions' in case
one has a group function (e.g. a template function).

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
I will install it if not objections.

Thanks,
Martin

gcc/ChangeLog:

2019-02-27  Martin Liska  <mli...@suse.cz>

        * gcov.c (output_intermediate_json_line): When a line
        belongs to a group of functions, print function name
        for each of such line entry.
        (output_json_intermediate_file): Add new argument.
        * doc/gcov.texi: Document the change.
---
 gcc/doc/gcov.texi |  5 +++++
 gcc/gcov.c        | 14 ++++++++++----
 2 files changed, 15 insertions(+), 4 deletions(-)


diff --git a/gcc/doc/gcov.texi b/gcc/doc/gcov.texi
index a128f5f4f83..bbb1941246b 100644
--- a/gcc/doc/gcov.texi
+++ b/gcc/doc/gcov.texi
@@ -276,6 +276,7 @@ Each @var{line} has the following form:
   "count": @var{count},
   "line_number": @var{line_number},
   "unexecuted_block": @var{unexecuted_block}
+  "function_name": @var{function_name},
 @}
 @end smallexample
 
@@ -294,6 +295,10 @@ Fields of the @var{line} element have following semantics:
 (not all statements on the line are executed)
 @end itemize
 
+@item
+@var{function_name}: when a @var{line} contains multiple functions, each
+such @var{line} entry contains name of the function
+
 Each @var{branch} has the following form:
 
 @smallexample
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 9e27a826ea4..9c372356eb5 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -1041,17 +1041,21 @@ process_args (int argc, char **argv)
   return optind;
 }
 
-/* Output intermediate LINE sitting on LINE_NUM to JSON OBJECT.  */
+/* Output intermediate LINE sitting on LINE_NUM to JSON OBJECT.
+   When FUNCTION_NAME is non null, add the name to the LINE.  */
 
 static void
 output_intermediate_json_line (json::array *object,
-			       line_info *line, unsigned line_num)
+			       line_info *line, unsigned line_num,
+			       const char *function_name)
 {
   if (!line->exists)
     return;
 
   json::object *lineo = new json::object ();
   lineo->set ("line_number", new json::number (line_num));
+  if (function_name != NULL)
+    lineo->set ("function_name", new json::string (function_name));
   lineo->set ("count", new json::number (line->count));
   lineo->set ("unexecuted_block",
 	      new json::literal (line->has_unexecuted_block));
@@ -1154,13 +1158,15 @@ output_json_intermediate_file (json::array *json_files, source_info *src)
 	    for (unsigned i = 0; i < lines.size (); i++)
 	      {
 		line_info *line = &lines[i];
-		output_intermediate_json_line (lineso, line, line_num + i);
+		output_intermediate_json_line (lineso, line, line_num + i,
+					       (*it2)->m_name);
 	      }
 	  }
 
       /* Follow with lines associated with the source file.  */
       if (line_num < src->lines.size ())
-	output_intermediate_json_line (lineso, &src->lines[line_num], line_num);
+	output_intermediate_json_line (lineso, &src->lines[line_num], line_num,
+				       NULL);
     }
 }
 

Reply via email to