2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-18 07:20:25 +08:00

GCOV: print {start,end}_column in JSON file and gcov-dump tool.

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
This commit is contained in:
Martin Liska 2019-03-14 10:33:54 +01:00 committed by Martin Liska
parent ea9d9d749c
commit b815471796
5 changed files with 42 additions and 3 deletions

@ -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

@ -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 ();

@ -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
@ -255,6 +257,9 @@ Fields of the @var{function} element have following semantics:
@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
@ -264,10 +269,18 @@ Fields of the @var{function} element have following semantics:
@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
@ -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:

@ -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");
}

@ -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;