From b81547179688b601af97fc2185489dbea1cd86b2 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 14 Mar 2019 10:33:54 +0100 Subject: [PATCH] GCOV: print {start,end}_column in JSON file and gcov-dump tool. 2019-03-14 Martin Liska * 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 | 14 ++++++++++++++ gcc/coverage.c | 2 ++ gcc/doc/gcov.texi | 15 ++++++++++++++- gcc/gcov-dump.c | 4 +++- gcc/gcov.c | 10 +++++++++- 5 files changed, 42 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d2495c..86a2319 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2019-03-14 Martin Liska + + * 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 PR middle-end/89698 diff --git a/gcc/coverage.c b/gcc/coverage.c index a34c5da..1ffefd5 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -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 (); diff --git a/gcc/doc/gcov.texi b/gcc/doc/gcov.texi index 0960e4a..ecad5d1 100644 --- a/gcc/doc/gcov.texi +++ b/gcc/doc/gcov.texi @@ -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: diff --git a/gcc/gcov-dump.c b/gcc/gcov-dump.c index 72d94d9..67b1e88 100644 --- a/gcc/gcov-dump.c +++ b/gcc/gcov-dump.c @@ -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"); } diff --git a/gcc/gcov.c b/gcc/gcov.c index 37e787a..1d57655 100644 --- a/gcc/gcov.c +++ b/gcc/gcov.c @@ -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; -- 2.7.4