GCOV: print {start,end}_column in JSON file and gcov-dump tool.
authorMartin Liska <mliska@suse.cz>
Thu, 14 Mar 2019 09:33:54 +0000 (10:33 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 14 Mar 2019 09:33:54 +0000 (09:33 +0000)
2019-03-14  Martin Liska  <mliska@suse.cz>

* coverage.c (coverage_begin_function): Stream also
end_column.
* doc/gcov.texi: Document 2 new fields in JSON file.  Improve
documentation about function declaration location.
* gcov-dump.c (tag_function): Print whole range
of function declaration.
* gcov.c (struct function_info): Add end_column field.
(function_info::function_info): Initialize it.
(output_json_intermediate_file): Output {start,end}_column
fields.
(read_graph_file): Read end_column.

From-SVN: r269678

gcc/ChangeLog
gcc/coverage.c
gcc/doc/gcov.texi
gcc/gcov-dump.c
gcc/gcov.c

index 2d2495c..86a2319 100644 (file)
@@ -1,3 +1,17 @@
+2019-03-14  Martin Liska  <mliska@suse.cz>
+
+       * coverage.c (coverage_begin_function): Stream also
+       end_column.
+       * doc/gcov.texi: Document 2 new fields in JSON file.  Improve
+       documentation about function declaration location.
+       * gcov-dump.c (tag_function): Print whole range
+       of function declaration.
+       * gcov.c (struct function_info): Add end_column field.
+       (function_info::function_info): Initialize it.
+       (output_json_intermediate_file): Output {start,end}_column
+       fields.
+       (read_graph_file): Read end_column.
+
 2019-03-14  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/89698
index a34c5da..1ffefd5 100644 (file)
@@ -652,8 +652,10 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum)
 
   /* Function can start in a single file and end in another one.  */
   int end_line = endloc.file == xloc.file ? endloc.line : xloc.line;
+  int end_column = endloc.file == xloc.file ? endloc.column: xloc.column;
   gcc_assert (xloc.line <= end_line);
   gcov_write_unsigned (end_line);
+  gcov_write_unsigned (end_column);
   gcov_write_length (offset);
 
   return !gcov_is_error ();
index 0960e4a..ecad5d1 100644 (file)
@@ -236,9 +236,11 @@ Each @var{function} has the following form:
   "blocks": @var{blocks},
   "blocks_executed": @var{blocks_executed},
   "demangled_name": "@var{demangled_name},
+  "end_column": @var{end_column},
   "end_line": @var{end_line},
   "execution_count": @var{execution_count},
   "name": @var{name},
+  "start_column": @var{start_column}
   "start_line": @var{start_line}
 @}
 @end smallexample
@@ -256,6 +258,9 @@ Fields of the @var{function} element have following semantics:
 @var{demangled_name}: demangled name of the function
 
 @item
+@var{end_column}: column in the source file where the function ends
+
+@item
 @var{end_line}: line in the source file where the function ends
 
 @item
@@ -265,9 +270,17 @@ Fields of the @var{function} element have following semantics:
 @var{name}: name of the function
 
 @item
+@var{start_column}: column in the source file where the function begins
+
+@item
 @var{start_line}: line in the source file where the function begins
 @end itemize
 
+Note that line numbers and column numbers number from 1.  In the current
+implementation, @var{start_line} and @var{start_column} do not include
+any template parameters and the leading return type but that
+this is likely to be fixed in the future.
+
 Each @var{line} has the following form:
 
 @smallexample
@@ -293,11 +306,11 @@ Fields of the @var{line} element have following semantics:
 @item
 @var{unexecuted_block}: flag whether the line contains an unexecuted block
 (not all statements on the line are executed)
-@end itemize
 
 @item
 @var{function_name}: a name of a function this @var{line} belongs to
 (for a line with an inlined statements can be not set)
+@end itemize
 
 Each @var{branch} has the following form:
 
index 72d94d9..67b1e88 100644 (file)
@@ -315,7 +315,9 @@ tag_function (const char *filename ATTRIBUTE_UNUSED,
          unsigned line_start = gcov_read_unsigned ();
          unsigned column_start = gcov_read_unsigned ();
          unsigned line_end = gcov_read_unsigned ();
-         printf (":%u:%u:%u", line_start, column_start, line_end);
+         unsigned column_end = gcov_read_unsigned ();
+         printf (":%u:%u-%u:%u", line_start, column_start,
+                 line_end, column_end);
          if (artificial)
            printf (", artificial");
        }
index 37e787a..1d57655 100644 (file)
@@ -283,6 +283,9 @@ struct function_info
   /* Last line number.  */
   unsigned end_line;
 
+  /* Last line column.  */
+  unsigned end_column;
+
   /* Index of source file where the function is defined.  */
   unsigned src;
 
@@ -631,7 +634,8 @@ function_info::function_info (): m_name (NULL), m_demangled_name (NULL),
   ident (0), lineno_checksum (0), cfg_checksum (0), has_catch (0),
   artificial (0), is_group (0),
   blocks (), blocks_executed (0), counts (),
-  start_line (0), start_column (), end_line (0), src (0), lines (), next (NULL)
+  start_line (0), start_column (0), end_line (0), end_column (0),
+  src (0), lines (), next (NULL)
 {
 }
 
@@ -1131,7 +1135,9 @@ output_json_intermediate_file (json::array *json_files, source_info *src)
       function->set ("demangled_name",
                     new json::string ((*it)->get_demangled_name ()));
       function->set ("start_line", new json::number ((*it)->start_line));
+      function->set ("start_column", new json::number ((*it)->start_column));
       function->set ("end_line", new json::number ((*it)->end_line));
+      function->set ("end_column", new json::number ((*it)->end_column));
       function->set ("blocks",
                     new json::number ((*it)->get_block_count ()));
       function->set ("blocks_executed",
@@ -1726,6 +1732,7 @@ read_graph_file (void)
          unsigned start_line = gcov_read_unsigned ();
          unsigned start_column = gcov_read_unsigned ();
          unsigned end_line = gcov_read_unsigned ();
+         unsigned end_column = gcov_read_unsigned ();
 
          fn = new function_info ();
          functions.push_back (fn);
@@ -1739,6 +1746,7 @@ read_graph_file (void)
          fn->start_line = start_line;
          fn->start_column = start_column;
          fn->end_line = end_line;
+         fn->end_column = end_column;
          fn->artificial = artificial;
 
          current_tag = tag;