From patchwork Thu Apr 6 13:58:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 80251 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1045798vqo; Thu, 6 Apr 2023 06:59:11 -0700 (PDT) X-Google-Smtp-Source: AKy350ZY8MTXqLFpsgCEdsjnEdxsDs4Ocj4DiK2J9i7eok4lpCILHlHpCMByor5akXywuuhmkf4y X-Received: by 2002:aa7:dcc4:0:b0:4ad:1e35:771f with SMTP id w4-20020aa7dcc4000000b004ad1e35771fmr5529270edu.35.1680789550904; Thu, 06 Apr 2023 06:59:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680789550; cv=none; d=google.com; s=arc-20160816; b=dWmh0gzukOg7eWco/FnjHRDP/OiMF6v5AuFuvqZGiOwQxrLyi2hGtcQzuLuXPJaVZj 2w8z4LkImnZXKE1TyPtdnvq2cNZYjXEpQPR9V1ZpeH+HIaAhqCROYKRy+qqhFoMJ6RRy 0kt/GZDPNHJbZzlZQG8D7+4AEVnPPGT9HzUKO3RwdswnAMYaYnl75EQwGmun2oggApC6 LD9zxfLyZ1cWl3auFjscC1Bjc47Pmik7/FxA+SPKUbIUNV7PVz6cInKfugTRV1EbNGKD WO+KasuJhUaMHgScOeLWeRXeE7VH3OVYxOpLD52v+xauULimysK4b0t8EefIdITnKh3h IVrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding:cc :content-language:to:subject:from:user-agent:mime-version:date :message-id:dkim-signature:dkim-signature:dmarc-filter:delivered-to; bh=HnjBoi7BfJ/ui6OQ76lFBbf8CJF0+19uBuqA9Pm8kZA=; b=XDm6ICaadtqpFWttoNPNvftUQeZLdUbzOToEHmoHbM2kau0ZbnQS+K1Zr7vpHFwJSm 8UkPgTDx86tfwCZ44KIO36KpuTwBkjVLRefwmoc6JBgf/tXvxJwEAg9AKK25soEEMDWZ eCzpbB7VreRD9wbPUxZBA6qOKNHAn1E81bLqvlNIY4qhpMixFu4GiRPAKzBUBhOVy34X Ed/JfA0UtakbrfeTqRHSPt6tuhXBTIMFh4gu1J4pHLUr7X19PkICj18zxnnsKyLdXDlV jRsPEuCvKNQAYgl5zgNOovEgnnU9gUnrDMqrWrjvHq+EJxQGQsIZVbueD+ny2kdDr/cX DDrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=QIyHhDJW; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519 header.b=AaQsSowM; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id u6-20020aa7d0c6000000b004fba7349857si1140559edo.421.2023.04.06.06.59.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Apr 2023 06:59:10 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=QIyHhDJW; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519 header.b=AaQsSowM; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 55C433857344 for ; Thu, 6 Apr 2023 13:59:05 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id 6F87B3858D28 for ; Thu, 6 Apr 2023 13:58:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6F87B3858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 1910F22723; Thu, 6 Apr 2023 13:58:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1680789516; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=HnjBoi7BfJ/ui6OQ76lFBbf8CJF0+19uBuqA9Pm8kZA=; b=QIyHhDJWtKGw7pGopGgt7iOxcDH+7f0E/hcYbkQZ2zXAlRhyt/jcSTvjHIofQIS82ECTNN sVrOumkPYgOIstoiwQPg1UZJzB1b8Sij7aTDymdTmlY9Nydm1xCunZkaMf3fHU1QaZ6Wam IWt+m4Q4mg7KqZ/dAC/1ABU9meKOQjc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1680789516; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=HnjBoi7BfJ/ui6OQ76lFBbf8CJF0+19uBuqA9Pm8kZA=; b=AaQsSowMwAI0y17Ch+HxmuWccJCokohav+MBFv8hvLP1SHEXH5ap4Gl1DfRpOKIS9mjUHL 7pdtr1er92JaJzCg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 057421351F; Thu, 6 Apr 2023 13:58:35 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 89M4OwvQLmRxHAAAMHmgww (envelope-from ); Thu, 06 Apr 2023 13:58:35 +0000 Message-ID: <3041a27a-8599-23da-237b-d802f83c40ae@suse.cz> Date: Thu, 6 Apr 2023 15:58:35 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH] gcov: add info about "calls" to JSON output format To: gcc-patches@gcc.gnu.org Content-Language: en-US Cc: Jan Hubicka , Richard Biener X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762435584214052144?= X-GMAIL-MSGID: =?utf-8?q?1762435584214052144?= Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed after stage1 opens? 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::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; template class Foo; +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] } {