+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
/* 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 ();
"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
@item
@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
@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
@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:
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");
}
/* Last line number. */
unsigned end_line;
+ /* Last line column. */
+ unsigned end_column;
+
/* Index of source file where the function is defined. */
unsigned src;
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)
{
}
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",
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);
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;