From: Richard Biener <richard.guenther@gmail.com>
To: "Martin Liška" <mliska@suse.cz>
Cc: gcc-patches@gcc.gnu.org, Jan Hubicka <hubicka@ucw.cz>
Subject: Re: [PATCH] gcov: add info about "calls" to JSON output format
Date: Tue, 11 Apr 2023 11:23:59 +0200 [thread overview]
Message-ID: <CAFiYyc1fVmBVRe5Z_5jxAkYRuwC-JHp4C=PgdD38Ew0g-6_hng@mail.gmail.com> (raw)
In-Reply-To: <3041a27a-8599-23da-237b-d802f83c40ae@suse.cz>
On Thu, Apr 6, 2023 at 3:58 PM Martin Liška <mliska@suse.cz> wrote:
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed after stage1 opens?
Did we release a compiler with version 1? If not we might want to sneak
this in before 13.1 ...
Up to Honza.
Thanks,
Richard.
> Thanks,
> Martin
>
> gcc/ChangeLog:
>
> * doc/gcov.texi: Document the new "calls" field and document
> the API bump.
> * gcov.cc (output_intermediate_json_line): Output info about
> calls.
> (generate_results): Bump version to 2.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/gcov/gcov-17.C: Add call to a noreturn function.
> * g++.dg/gcov/test-gcov-17.py: Cover new format.
> * lib/gcov.exp: Add options for gcov that emit the extra info.
> ---
> gcc/doc/gcov.texi | 27 +++++++++++++++++++++--
> gcc/gcov.cc | 12 +++++++++-
> gcc/testsuite/g++.dg/gcov/gcov-17.C | 7 ++++++
> gcc/testsuite/g++.dg/gcov/test-gcov-17.py | 17 ++++++++++----
> gcc/testsuite/lib/gcov.exp | 2 +-
> 5 files changed, 57 insertions(+), 8 deletions(-)
>
> diff --git a/gcc/doc/gcov.texi b/gcc/doc/gcov.texi
> index d39cce3a683..6739ebb3643 100644
> --- a/gcc/doc/gcov.texi
> +++ b/gcc/doc/gcov.texi
> @@ -195,7 +195,7 @@ Structure of the JSON is following:
> @{
> "current_working_directory": "foo/bar",
> "data_file": "a.out",
> - "format_version": "1",
> + "format_version": "2",
> "gcc_version": "11.1.1 20210510"
> "files": ["$file"]
> @}
> @@ -214,6 +214,12 @@ a compilation unit was compiled
> @item
> @var{format_version}: semantic version of the format
>
> +Changes in version @emph{2}:
> +@itemize @bullet
> +@item
> +@var{calls}: information about function calls is added
> +@end itemize
> +
> @item
> @var{gcc_version}: version of the GCC compiler
> @end itemize
> @@ -292,6 +298,7 @@ Each @var{line} has the following form:
> @smallexample
> @{
> "branches": ["$branch"],
> + "calls": ["$call"],
> "count": 2,
> "line_number": 15,
> "unexecuted_block": false,
> @@ -299,7 +306,7 @@ Each @var{line} has the following form:
> @}
> @end smallexample
>
> -Branches are present only with @var{-b} option.
> +Branches and calls are present only with @var{-b} option.
> Fields of the @var{line} element have following semantics:
>
> @itemize @bullet
> @@ -341,6 +348,22 @@ Fields of the @var{branch} element have following semantics:
> @var{throw}: true when the branch is an exceptional branch
> @end itemize
>
> +Each @var{call} has the following form:
> +
> +@smallexample
> +@{
> + "returned": 11,
> +@}
> +@end smallexample
> +
> +Fields of the @var{call} element have following semantics:
> +
> +@itemize @bullet
> +@item
> +@var{returned}: number of times a function call returned (call count is equal
> +to @var{line::count})
> +@end itemize
> +
> @item -H
> @itemx --human-readable
> Write counts in human readable format (like 24.6k).
> diff --git a/gcc/gcov.cc b/gcc/gcov.cc
> index 2ec7248cc0e..88324143640 100644
> --- a/gcc/gcov.cc
> +++ b/gcc/gcov.cc
> @@ -1116,6 +1116,9 @@ output_intermediate_json_line (json::array *object,
> json::array *branches = new json::array ();
> lineo->set ("branches", branches);
>
> + json::array *calls = new json::array ();
> + lineo->set ("calls", calls);
> +
> vector<arc_info *>::const_iterator it;
> if (flag_branches)
> for (it = line->branches.begin (); it != line->branches.end ();
> @@ -1130,6 +1133,13 @@ output_intermediate_json_line (json::array *object,
> new json::literal ((*it)->fall_through));
> branches->append (branch);
> }
> + else if ((*it)->is_call_non_return)
> + {
> + json::object *call = new json::object ();
> + gcov_type returns = (*it)->src->count - (*it)->count;
> + call->set ("returned", new json::integer_number (returns));
> + calls->append (call);
> + }
> }
>
> object->append (lineo);
> @@ -1523,7 +1533,7 @@ generate_results (const char *file_name)
> gcov_intermediate_filename = get_gcov_intermediate_filename (file_name);
>
> json::object *root = new json::object ();
> - root->set ("format_version", new json::string ("1"));
> + root->set ("format_version", new json::string ("2"));
> root->set ("gcc_version", new json::string (version_string));
>
> if (bbg_cwd != NULL)
> diff --git a/gcc/testsuite/g++.dg/gcov/gcov-17.C b/gcc/testsuite/g++.dg/gcov/gcov-17.C
> index d11883cfd39..efe019599a5 100644
> --- a/gcc/testsuite/g++.dg/gcov/gcov-17.C
> +++ b/gcc/testsuite/g++.dg/gcov/gcov-17.C
> @@ -15,6 +15,11 @@ private:
> template class Foo<int>;
> template class Foo<char>;
>
> +static void noret()
> +{
> + __builtin_exit (0);
> +}
> +
> int
> main (void)
> {
> @@ -34,6 +39,8 @@ main (void)
> __builtin_printf ("Failure\n");
> else
> __builtin_printf ("Success\n");
> +
> + noret ();
> return 0;
> }
>
> diff --git a/gcc/testsuite/g++.dg/gcov/test-gcov-17.py b/gcc/testsuite/g++.dg/gcov/test-gcov-17.py
> index ec5df3dec03..a0b8b09b85c 100644
> --- a/gcc/testsuite/g++.dg/gcov/test-gcov-17.py
> +++ b/gcc/testsuite/g++.dg/gcov/test-gcov-17.py
> @@ -12,7 +12,7 @@ def test_basics(gcov):
> files = gcov['files']
> assert len(files) == 1
> functions = files[0]['functions']
> - assert len(functions) == 5
> + assert len(functions) == 6
>
>
> def test_lines(gcov):
> @@ -31,7 +31,16 @@ def test_lines(gcov):
> assert line9[1]['count'] == 2
> assert line9[0]['unexecuted_block']
> assert not line9[1]['unexecuted_block']
> - assert linesdict[31][0]['unexecuted_block']
> - assert linesdict[34][0]['unexecuted_block']
> - assert not linesdict[37][0]['unexecuted_block']
> + assert linesdict[36][0]['unexecuted_block']
> + assert linesdict[39][0]['unexecuted_block']
> + assert not linesdict[41][0]['unexecuted_block']
> assert 32 not in linesdict
> + print(lines)
> +
> + line41 = linesdict[41][0]
> + assert line41['count'] == 1
> + assert line41['calls'] == [{'returned': 1}]
> +
> + line43 = linesdict[43][0]
> + assert line43['count'] == 1
> + assert line43['calls'] == [{'returned': 0}]
> diff --git a/gcc/testsuite/lib/gcov.exp b/gcc/testsuite/lib/gcov.exp
> index 80e74aeb220..e5e94fa5a76 100644
> --- a/gcc/testsuite/lib/gcov.exp
> +++ b/gcc/testsuite/lib/gcov.exp
> @@ -274,7 +274,7 @@ proc run-gcov-pytest { args } {
>
> verbose "Running $GCOV $testcase in $srcdir/$subdir" 2
> set testcase [remote_download host $testcase]
> - set result [remote_exec host $GCOV "$testcase -i"]
> + set result [remote_exec host $GCOV "$testcase -i -abc"]
>
> set pytest_script [lindex $args 1]
> if { ![check_effective_target_pytest3] } {
> --
> 2.40.0
>
next prev parent reply other threads:[~2023-04-11 9:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-06 13:58 Martin Liška
2023-04-11 9:23 ` Richard Biener [this message]
2023-04-12 7:20 ` Martin Liška
2023-04-14 12:34 ` Jan Hubicka
2023-04-25 11:05 ` Martin Liška
2023-05-04 8:32 ` Martin Liška
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFiYyc1fVmBVRe5Z_5jxAkYRuwC-JHp4C=PgdD38Ew0g-6_hng@mail.gmail.com' \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hubicka@ucw.cz \
--cc=mliska@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).