From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id 61A243858D1E for ; Tue, 25 Apr 2023 11:05:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 61A243858D1E 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 85B39219BA; Tue, 25 Apr 2023 11:05:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1682420732; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=7PGNOo/dOLiJgl+Wcfvw6wosbo7T04EjTCP4MZu8l+k=; b=kduS7QDjUUygQ1ICeGi5jNVr6UNfVnb3ntisd1KcZH3nnLNSCLRPZzP9gS/p7jLN2U6BCI XRBDnmG0zc2yc5n/pL0yGilFVDzUm/8wl0e0VBbKicdWjGOY5tWlUNnM6scd8DbaOuQsrH OA7gp3BZSMpZHH+MnRKFDK9S97XM/zc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1682420732; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=7PGNOo/dOLiJgl+Wcfvw6wosbo7T04EjTCP4MZu8l+k=; b=+VIrZUeCQhwzNlEK+tDDQBfXf/r+maTIIgbf/Jz8dFAVhxg5crTDaslptS7coUqpUOBRvf MBvzvsNe+TYBVYBQ== 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 6791B13466; Tue, 25 Apr 2023 11:05:32 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id c6kSGPyzR2QyPwAAMHmgww (envelope-from ); Tue, 25 Apr 2023 11:05:32 +0000 Content-Type: multipart/mixed; boundary="------------6YYcpjwFg58uWQoQyq87CnPQ" Message-ID: Date: Tue, 25 Apr 2023 13:05:32 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: Re: [PATCH] gcov: add info about "calls" to JSON output format Content-Language: en-US To: Jan Hubicka Cc: Richard Biener , gcc-patches@gcc.gnu.org References: <3041a27a-8599-23da-237b-d802f83c40ae@suse.cz> From: =?UTF-8?Q?Martin_Li=c5=a1ka?= In-Reply-To: X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,SPF_HELO_NONE,SPF_SOFTFAIL,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------6YYcpjwFg58uWQoQyq87CnPQ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 4/14/23 14:34, Jan Hubicka wrote: >> On 4/11/23 11:23, Richard Biener wrote: >>> On Thu, Apr 6, 2023 at 3:58 PM Martin Liška 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 >> >> Yes, all compilers starting with 9.1 emit version 1. >> >>> this in before 13.1 ... >> >> Yep, I would welcome sneaking in. >> >>> >>> Up to Honza. >> >> PING: Honza! > > THe motivation is for external tools to effectively track execution > counts after function calls that does not return normally? Yes, they wanted basically equal information as we present in the human-readable format. > What about other cases we produce fake edges for, like trapping > statements or volatile asms (via stmt_can_terminate_bb_p). Are those > handled as branches with "throw" flag? That's probably something for future. There was not demand for it right now. > > Calls not returning is just one of special cases where control of > function may terminate. Also do we want to handle function returning > twice (fork and setjmp?) Similarly here. Anyway, I'm going to commit a bit enhanced version where I: - added blocks_ids for each line number - for each branch and call source and destination block is added - in human-readable format I change block::index to block::id as the index does not makes sense much Martin > > Patch looks OK. > Honza >> >> Thanks, >> Martin >> >>> >>> 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::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] } { >>>> -- >>>> 2.40.0 >>>> >> --------------6YYcpjwFg58uWQoQyq87CnPQ Content-Type: text/x-patch; charset=UTF-8; name="0001-gcov-add-info-about-calls-to-JSON-output-format.patch" Content-Disposition: attachment; filename*0="0001-gcov-add-info-about-calls-to-JSON-output-format.patch" Content-Transfer-Encoding: base64 RnJvbSBjZTM3MmMyMmJkNjhhZDZiYjM5OGQxMmZiNTIwNTUwNDVjOGU5NGRhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gTGlza2EgPG1saXNrYUBzdXNlLmN6PgpE YXRlOiBUaHUsIDYgQXByIDIwMjMgMTE6NTQ6NTEgKzAyMDAKU3ViamVjdDogW1BBVENIXSBn Y292OiBhZGQgaW5mbyBhYm91dCAiY2FsbHMiIHRvIEpTT04gb3V0cHV0IGZvcm1hdAoKZ2Nj L0NoYW5nZUxvZzoKCgkqIGRvYy9nY292LnRleGk6IERvY3VtZW50IHRoZSBuZXcgImNhbGxz IiBmaWVsZCBhbmQgZG9jdW1lbnQKCXRoZSBBUEkgYnVtcC4gTWVudGlvbiBhbHNvICJibG9j a19pZHMiIGZvciBsaW5lcy4KCSogZ2Nvdi5jYyAob3V0cHV0X2ludGVybWVkaWF0ZV9qc29u X2xpbmUpOiBPdXRwdXQgaW5mbyBhYm91dAoJY2FsbHMgYW5kIGV4dGVuZCBicmFuY2hlcyBh cyB3ZWxsLgoJKGdlbmVyYXRlX3Jlc3VsdHMpOiBCdW1wIHZlcnNpb24gdG8gMi4KCShvdXRw dXRfbGluZV9kZXRhaWxzKTogVXNlIGJsb2NrIElEIGluc3RlYWQgb2YgYSBub24tc2Vuc3Vh bAoJaW5kZXguCgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCgkqIGcrKy5kZy9nY292L2dj b3YtMTcuQzogQWRkIGNhbGwgdG8gYSBub3JldHVybiBmdW5jdGlvbi4KCSogZysrLmRnL2dj b3YvdGVzdC1nY292LTE3LnB5OiBDb3ZlciBuZXcgZm9ybWF0LgoJKiBsaWIvZ2Nvdi5leHA6 IEFkZCBvcHRpb25zIGZvciBnY292IHRoYXQgZW1pdCB0aGUgZXh0cmEgaW5mby4KLS0tCiBn Y2MvZG9jL2djb3YudGV4aSAgICAgICAgICAgICAgICAgICAgICAgICB8IDQ3ICsrKysrKysr KysrKysrKysrKysrKystCiBnY2MvZ2Nvdi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDMxICsrKysrKysrKysrKy0tLQogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvZ2Nvdi9n Y292LTE3LkMgICAgICAgfCAgNyArKysrCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L3Rl c3QtZ2Nvdi0xNy5weSB8IDIwICsrKysrKysrLS0KIGdjYy90ZXN0c3VpdGUvbGliL2djb3Yu ZXhwICAgICAgICAgICAgICAgIHwgIDIgKy0KIDUgZmlsZXMgY2hhbmdlZCwgOTUgaW5zZXJ0 aW9ucygrKSwgMTIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9nY292LnRl eGkgYi9nY2MvZG9jL2djb3YudGV4aQppbmRleCBkMzljY2UzYTY4My4uMzAxOWVmYzQ2NzQg MTAwNjQ0Ci0tLSBhL2djYy9kb2MvZ2Nvdi50ZXhpCisrKyBiL2djYy9kb2MvZ2Nvdi50ZXhp CkBAIC0xOTUsNyArMTk1LDcgQEAgU3RydWN0dXJlIG9mIHRoZSBKU09OIGlzIGZvbGxvd2lu ZzoKIEB7CiAgICJjdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5IjogImZvby9iYXIiLAogICAi ZGF0YV9maWxlIjogImEub3V0IiwKLSAgImZvcm1hdF92ZXJzaW9uIjogIjEiLAorICAiZm9y bWF0X3ZlcnNpb24iOiAiMiIsCiAgICJnY2NfdmVyc2lvbiI6ICIxMS4xLjEgMjAyMTA1MTAi CiAgICJmaWxlcyI6IFsiJGZpbGUiXQogQH0KQEAgLTIxNCw2ICsyMTQsMTIgQEAgYSBjb21w aWxhdGlvbiB1bml0IHdhcyBjb21waWxlZAogQGl0ZW0KIEB2YXJ7Zm9ybWF0X3ZlcnNpb259 OiBzZW1hbnRpYyB2ZXJzaW9uIG9mIHRoZSBmb3JtYXQKIAorQ2hhbmdlcyBpbiB2ZXJzaW9u IEBlbXBoezJ9OgorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0B2YXJ7Y2FsbHN9OiBpbmZv cm1hdGlvbiBhYm91dCBmdW5jdGlvbiBjYWxscyBpcyBhZGRlZAorQGVuZCBpdGVtaXplCisK IEBpdGVtCiBAdmFye2djY192ZXJzaW9ufTogdmVyc2lvbiBvZiB0aGUgR0NDIGNvbXBpbGVy CiBAZW5kIGl0ZW1pemUKQEAgLTI5MSw3ICsyOTcsOSBAQCBFYWNoIEB2YXJ7bGluZX0gaGFz IHRoZSBmb2xsb3dpbmcgZm9ybToKIAogQHNtYWxsZXhhbXBsZQogQHsKKyAgImJsb2NrX2lk cyI6IFsiJGJsb2NrX2lkIl0sCiAgICJicmFuY2hlcyI6IFsiJGJyYW5jaCJdLAorICAiY2Fs bHMiOiBbIiRjYWxsIl0sCiAgICJjb3VudCI6IDIsCiAgICJsaW5lX251bWJlciI6IDE1LAog ICAidW5leGVjdXRlZF9ibG9jayI6IGZhbHNlLApAQCAtMjk5LDEwICszMDcsMTMgQEAgRWFj aCBAdmFye2xpbmV9IGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CiBAfQogQGVuZCBzbWFsbGV4 YW1wbGUKIAotQnJhbmNoZXMgYXJlIHByZXNlbnQgb25seSB3aXRoIEB2YXJ7LWJ9IG9wdGlv bi4KK0JyYW5jaGVzIGFuZCBjYWxscyBhcmUgcHJlc2VudCBvbmx5IHdpdGggQHZhcnstYn0g b3B0aW9uLgogRmllbGRzIG9mIHRoZSBAdmFye2xpbmV9IGVsZW1lbnQgaGF2ZSBmb2xsb3dp bmcgc2VtYW50aWNzOgogCiBAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQHZhcntibG9ja19p ZHN9OiBJRHMgb2YgYmFzaWMgYmxvY2tzIHRoYXQgYmVsb25nIHRvIHRoZSBsaW5lCisKIEBp dGVtCiBAdmFye2NvdW50fTogbnVtYmVyIG9mIGV4ZWN1dGlvbnMgb2YgdGhlIGxpbmUKIApA QCAtMzIzLDcgKzMzNCw5IEBAIEVhY2ggQHZhcnticmFuY2h9IGhhcyB0aGUgZm9sbG93aW5n IGZvcm06CiBAc21hbGxleGFtcGxlCiBAewogICAiY291bnQiOiAxMSwKKyAgImRlc3RpbmF0 aW9uX2Jsb2NrX2lkIjogMTcsCiAgICJmYWxsdGhyb3VnaCI6IHRydWUsCisgICJzb3VyY2Vf YmxvY2tfaWQiOiAxMywKICAgInRocm93IjogZmFsc2UKIEB9CiBAZW5kIHNtYWxsZXhhbXBs ZQpAQCAtMzM5LDYgKzM1MiwzNiBAQCBGaWVsZHMgb2YgdGhlIEB2YXJ7YnJhbmNofSBlbGVt ZW50IGhhdmUgZm9sbG93aW5nIHNlbWFudGljczoKIAogQGl0ZW0KIEB2YXJ7dGhyb3d9OiB0 cnVlIHdoZW4gdGhlIGJyYW5jaCBpcyBhbiBleGNlcHRpb25hbCBicmFuY2gKKworQGl0ZW0K K0B2YXJ7aXNvdXJjZV9ibG9ja19pZH06IElEIG9mIHRoZSBiYXNpYyBibG9jayB3aGVyZSB0 aGlzIGJyYW5jaCBoYXBwZW5zCisKK0BpdGVtCitAdmFye2Rlc3RpbmF0aW9uX2Jsb2NrX2lk fTogSUQgb2YgdGhlIGJhc2ljIGJsb2NrIHRoaXMgYnJhbmNoIGp1bXBzIHRvCitAZW5kIGl0 ZW1pemUKKworRWFjaCBAdmFye2NhbGx9IGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CisKK0Bz bWFsbGV4YW1wbGUKK0B7CisgICJkZXN0aW5hdGlvbl9ibG9ja19pZCI6IDEsCisgICJyZXR1 cm5lZCI6IDExLAorICAic291cmNlX2Jsb2NrX2lkIjogMTMKK0B9CitAZW5kIHNtYWxsZXhh bXBsZQorCitGaWVsZHMgb2YgdGhlIEB2YXJ7Y2FsbH0gZWxlbWVudCBoYXZlIGZvbGxvd2lu ZyBzZW1hbnRpY3M6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitAdmFye3JldHVybmVk fTogbnVtYmVyIG9mIHRpbWVzIGEgZnVuY3Rpb24gY2FsbCByZXR1cm5lZCAoY2FsbCBjb3Vu dCBpcyBlcXVhbAordG8gQHZhcntsaW5lOjpjb3VudH0pCisKK0BpdGVtCitAdmFye2lzb3Vy Y2VfYmxvY2tfaWR9OiBJRCBvZiB0aGUgYmFzaWMgYmxvY2sgd2hlcmUgdGhpcyBjYWxsIGhh cHBlbnMKKworQGl0ZW0KK0B2YXJ7ZGVzdGluYXRpb25fYmxvY2tfaWR9OiBJRCBvZiB0aGUg YmFzaWMgYmxvY2sgdGhpcyBjYWxscyBjb250aW51ZXMgYWZ0ZXIgcmV0dXJuCiBAZW5kIGl0 ZW1pemUKIAogQGl0ZW0gLUgKZGlmZiAtLWdpdCBhL2djYy9nY292LmNjIGIvZ2NjL2djb3Yu Y2MKaW5kZXggMmVjNzI0OGNjMGUuLmQ5NmI0Zjc3ZTNiIDEwMDY0NAotLS0gYS9nY2MvZ2Nv di5jYworKysgYi9nY2MvZ2Nvdi5jYwpAQCAtMTExMyw5ICsxMTEzLDE3IEBAIG91dHB1dF9p bnRlcm1lZGlhdGVfanNvbl9saW5lIChqc29uOjphcnJheSAqb2JqZWN0LAogICBsaW5lby0+ c2V0ICgidW5leGVjdXRlZF9ibG9jayIsCiAJICAgICAgbmV3IGpzb246OmxpdGVyYWwgKGxp bmUtPmhhc191bmV4ZWN1dGVkX2Jsb2NrKSk7CiAKKyAganNvbjo6YXJyYXkgKmJiX2lkcyA9 IG5ldyBqc29uOjphcnJheSAoKTsKKyAgZm9yIChjb25zdCBibG9ja19pbmZvICpibG9jayA6 IGxpbmUtPmJsb2NrcykKKyAgICBiYl9pZHMtPmFwcGVuZCAobmV3IGpzb246OmludGVnZXJf bnVtYmVyIChibG9jay0+aWQpKTsKKyAgbGluZW8tPnNldCAoImJsb2NrX2lkcyIsIGJiX2lk cyk7CisKICAganNvbjo6YXJyYXkgKmJyYW5jaGVzID0gbmV3IGpzb246OmFycmF5ICgpOwog ICBsaW5lby0+c2V0ICgiYnJhbmNoZXMiLCBicmFuY2hlcyk7CiAKKyAganNvbjo6YXJyYXkg KmNhbGxzID0gbmV3IGpzb246OmFycmF5ICgpOworICBsaW5lby0+c2V0ICgiY2FsbHMiLCBj YWxscyk7CisKICAgdmVjdG9yPGFyY19pbmZvICo+Ojpjb25zdF9pdGVyYXRvciBpdDsKICAg aWYgKGZsYWdfYnJhbmNoZXMpCiAgICAgZm9yIChpdCA9IGxpbmUtPmJyYW5jaGVzLmJlZ2lu ICgpOyBpdCAhPSBsaW5lLT5icmFuY2hlcy5lbmQgKCk7CkBAIC0xMTI4LDggKzExMzYsMjMg QEAgb3V0cHV0X2ludGVybWVkaWF0ZV9qc29uX2xpbmUgKGpzb246OmFycmF5ICpvYmplY3Qs CiAJICAgIGJyYW5jaC0+c2V0ICgidGhyb3ciLCBuZXcganNvbjo6bGl0ZXJhbCAoKCppdCkt PmlzX3Rocm93KSk7CiAJICAgIGJyYW5jaC0+c2V0ICgiZmFsbHRocm91Z2giLAogCQkJIG5l dyBqc29uOjpsaXRlcmFsICgoKml0KS0+ZmFsbF90aHJvdWdoKSk7CisJICAgIGJyYW5jaC0+ c2V0ICgic291cmNlX2Jsb2NrX2lkIiwKKwkJCSBuZXcganNvbjo6aW50ZWdlcl9udW1iZXIg KCgqaXQpLT5zcmMtPmlkKSk7CisJICAgIGJyYW5jaC0+c2V0ICgiZGVzdGluYXRpb25fYmxv Y2tfaWQiLAorCQkJIG5ldyBqc29uOjppbnRlZ2VyX251bWJlciAoKCppdCktPmRzdC0+aWQp KTsKIAkgICAgYnJhbmNoZXMtPmFwcGVuZCAoYnJhbmNoKTsKIAkgIH0KKwllbHNlIGlmICgo Kml0KS0+aXNfY2FsbF9ub25fcmV0dXJuKQorCSAgeworCSAgICBqc29uOjpvYmplY3QgKmNh bGwgPSBuZXcganNvbjo6b2JqZWN0ICgpOworCSAgICBnY292X3R5cGUgcmV0dXJucyA9ICgq aXQpLT5zcmMtPmNvdW50IC0gKCppdCktPmNvdW50OworCSAgICBjYWxsLT5zZXQgKCJzb3Vy Y2VfYmxvY2tfaWQiLAorCQkgICAgICAgbmV3IGpzb246OmludGVnZXJfbnVtYmVyICgoKml0 KS0+c3JjLT5pZCkpOworCSAgICBjYWxsLT5zZXQgKCJkZXN0aW5hdGlvbl9ibG9ja19pZCIs CisJCSAgICAgICBuZXcganNvbjo6aW50ZWdlcl9udW1iZXIgKCgqaXQpLT5kc3QtPmlkKSk7 CisJICAgIGNhbGwtPnNldCAoInJldHVybmVkIiwgbmV3IGpzb246OmludGVnZXJfbnVtYmVy IChyZXR1cm5zKSk7CisJICAgIGNhbGxzLT5hcHBlbmQgKGNhbGwpOworCSAgfQogICAgICAg fQogCiAgIG9iamVjdC0+YXBwZW5kIChsaW5lbyk7CkBAIC0xNTIzLDcgKzE1NDYsNyBAQCBn ZW5lcmF0ZV9yZXN1bHRzIChjb25zdCBjaGFyICpmaWxlX25hbWUpCiAgIGdjb3ZfaW50ZXJt ZWRpYXRlX2ZpbGVuYW1lID0gZ2V0X2djb3ZfaW50ZXJtZWRpYXRlX2ZpbGVuYW1lIChmaWxl X25hbWUpOwogCiAgIGpzb246Om9iamVjdCAqcm9vdCA9IG5ldyBqc29uOjpvYmplY3QgKCk7 Ci0gIHJvb3QtPnNldCAoImZvcm1hdF92ZXJzaW9uIiwgbmV3IGpzb246OnN0cmluZyAoIjEi KSk7CisgIHJvb3QtPnNldCAoImZvcm1hdF92ZXJzaW9uIiwgbmV3IGpzb246OnN0cmluZyAo IjIiKSk7CiAgIHJvb3QtPnNldCAoImdjY192ZXJzaW9uIiwgbmV3IGpzb246OnN0cmluZyAo dmVyc2lvbl9zdHJpbmcpKTsKIAogICBpZiAoYmJnX2N3ZCAhPSBOVUxMKQpAQCAtMzA2MCw5 ICszMDgzLDcgQEAgb3V0cHV0X2xpbmVfZGV0YWlscyAoRklMRSAqZiwgY29uc3QgbGluZV9p bmZvICpsaW5lLCB1bnNpZ25lZCBsaW5lX251bSkKICAgaWYgKGZsYWdfYWxsX2Jsb2NrcykK ICAgICB7CiAgICAgICBhcmNfaW5mbyAqYXJjOwotICAgICAgaW50IGl4LCBqeDsKLQotICAg ICAgaXggPSBqeCA9IDA7CisgICAgICBpbnQganggPSAwOwogICAgICAgZm9yICh2ZWN0b3I8 YmxvY2tfaW5mbyAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaW5lLT5ibG9ja3MuYmVnaW4g KCk7CiAJICAgaXQgIT0gbGluZS0+YmxvY2tzLmVuZCAoKTsgaXQrKykKIAl7CkBAIC0zMDcy LDcgKzMwOTMsNyBAQCBvdXRwdXRfbGluZV9kZXRhaWxzIChGSUxFICpmLCBjb25zdCBsaW5l X2luZm8gKmxpbmUsIHVuc2lnbmVkIGxpbmVfbnVtKQogCQkJCSAgICAgKCppdCktPmV4Y2Vw dGlvbmFsLCBmYWxzZSwKIAkJCQkgICAgICgqaXQpLT5jb3VudCwgbGluZV9udW0sCiAJCQkJ ICAgICAiJSUlJSUiLCAiJCQkJCQiLCAwKTsKLQkgICAgICBmcHJpbnRmIChmLCAiLWJsb2Nr ICUyZCIsIGl4KyspOworCSAgICAgIGZwcmludGYgKGYsICItYmxvY2sgJWQiLCAoKml0KS0+ aWQpOwogCSAgICAgIGlmIChmbGFnX3ZlcmJvc2UpCiAJCWZwcmludGYgKGYsICIgKEJCICV1 KSIsICgqaXQpLT5pZCk7CiAJICAgICAgZnByaW50ZiAoZiwgIlxuIik7CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTcuQyBiL2djYy90ZXN0c3VpdGUv ZysrLmRnL2djb3YvZ2Nvdi0xNy5DCmluZGV4IGQxMTg4M2NmZDM5Li5lZmUwMTk1OTlhNSAx MDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE3LkMKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE3LkMKQEAgLTE1LDYgKzE1LDExIEBA IHByaXZhdGU6CiB0ZW1wbGF0ZSBjbGFzcyBGb288aW50PjsKIHRlbXBsYXRlIGNsYXNzIEZv bzxjaGFyPjsKIAorc3RhdGljIHZvaWQgbm9yZXQoKQoreworICBfX2J1aWx0aW5fZXhpdCAo MCk7Cit9CisKIGludAogbWFpbiAodm9pZCkKIHsKQEAgLTM0LDYgKzM5LDggQEAgbWFpbiAo dm9pZCkKICAgICBfX2J1aWx0aW5fcHJpbnRmICgiRmFpbHVyZVxuIik7CiAgIGVsc2UKICAg ICBfX2J1aWx0aW5fcHJpbnRmICgiU3VjY2Vzc1xuIik7CisKKyAgbm9yZXQgKCk7CiAgIHJl dHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L3Rl c3QtZ2Nvdi0xNy5weSBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2djb3YvdGVzdC1nY292LTE3 LnB5CmluZGV4IGVjNWRmM2RlYzAzLi5hZDA2NWIwZjQ0MyAxMDA2NDQKLS0tIGEvZ2NjL3Rl c3RzdWl0ZS9nKysuZGcvZ2Nvdi90ZXN0LWdjb3YtMTcucHkKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nKysuZGcvZ2Nvdi90ZXN0LWdjb3YtMTcucHkKQEAgLTEyLDcgKzEyLDcgQEAgZGVmIHRl c3RfYmFzaWNzKGdjb3YpOgogICAgIGZpbGVzID0gZ2NvdlsnZmlsZXMnXQogICAgIGFzc2Vy dCBsZW4oZmlsZXMpID09IDEKICAgICBmdW5jdGlvbnMgPSBmaWxlc1swXVsnZnVuY3Rpb25z J10KLSAgICBhc3NlcnQgbGVuKGZ1bmN0aW9ucykgPT0gNQorICAgIGFzc2VydCBsZW4oZnVu Y3Rpb25zKSA9PSA2CiAKIAogZGVmIHRlc3RfbGluZXMoZ2Nvdik6CkBAIC0zMSw3ICszMSwx OSBAQCBkZWYgdGVzdF9saW5lcyhnY292KToKICAgICBhc3NlcnQgbGluZTlbMV1bJ2NvdW50 J10gPT0gMgogICAgIGFzc2VydCBsaW5lOVswXVsndW5leGVjdXRlZF9ibG9jayddCiAgICAg YXNzZXJ0IG5vdCBsaW5lOVsxXVsndW5leGVjdXRlZF9ibG9jayddCi0gICAgYXNzZXJ0IGxp bmVzZGljdFszMV1bMF1bJ3VuZXhlY3V0ZWRfYmxvY2snXQotICAgIGFzc2VydCBsaW5lc2Rp Y3RbMzRdWzBdWyd1bmV4ZWN1dGVkX2Jsb2NrJ10KLSAgICBhc3NlcnQgbm90IGxpbmVzZGlj dFszN11bMF1bJ3VuZXhlY3V0ZWRfYmxvY2snXQorICAgIGFzc2VydCBsaW5lc2RpY3RbMzZd WzBdWyd1bmV4ZWN1dGVkX2Jsb2NrJ10KKyAgICBhc3NlcnQgbGluZXNkaWN0WzM5XVswXVsn dW5leGVjdXRlZF9ibG9jayddCisgICAgYXNzZXJ0IG5vdCBsaW5lc2RpY3RbNDFdWzBdWyd1 bmV4ZWN1dGVkX2Jsb2NrJ10KICAgICBhc3NlcnQgMzIgbm90IGluIGxpbmVzZGljdAorICAg IHByaW50KGxpbmVzKQorCisgICAgbGluZTQxID0gbGluZXNkaWN0WzQxXVswXQorICAgIGFz c2VydCBsaW5lNDFbJ2NvdW50J10gPT0gMQorICAgIGFzc2VydCBsaW5lNDFbJ2NhbGxzJ11b MF1bJ3JldHVybmVkJ10gPT0gMQorICAgIGFzc2VydCBsaW5lNDFbJ2NhbGxzJ11bMF1bJ3Nv dXJjZV9ibG9ja19pZCddID09IDEzCisgICAgYXNzZXJ0IGxpbmU0MVsnY2FsbHMnXVswXVsn ZGVzdGluYXRpb25fYmxvY2tfaWQnXSA9PSAxCisgICAgYXNzZXJ0IGxlbihsaW5lNDFbJ2Js b2NrX2lkcyddKSA+IDAKKworICAgIGxpbmU0MyA9IGxpbmVzZGljdFs0M11bMF0KKyAgICBh c3NlcnQgbGluZTQzWydjb3VudCddID09IDEKKyAgICBhc3NlcnQgbGluZTQzWydjYWxscydd WzBdWydyZXR1cm5lZCddID09IDAKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvbGliL2dj b3YuZXhwIGIvZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5leHAKaW5kZXggODBlNzRhZWIyMjAu LmU1ZTk0ZmE1YTc2IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2xpYi9nY292LmV4cAor KysgYi9nY2MvdGVzdHN1aXRlL2xpYi9nY292LmV4cApAQCAtMjc0LDcgKzI3NCw3IEBAIHBy b2MgcnVuLWdjb3YtcHl0ZXN0IHsgYXJncyB9IHsKIAogICAgIHZlcmJvc2UgIlJ1bm5pbmcg JEdDT1YgJHRlc3RjYXNlIGluICRzcmNkaXIvJHN1YmRpciIgMgogICAgIHNldCB0ZXN0Y2Fz ZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHRlc3RjYXNlXQotICAgIHNldCByZXN1bHQgW3Jl bW90ZV9leGVjIGhvc3QgJEdDT1YgIiR0ZXN0Y2FzZSAtaSJdCisgICAgc2V0IHJlc3VsdCBb cmVtb3RlX2V4ZWMgaG9zdCAkR0NPViAiJHRlc3RjYXNlIC1pIC1hYmMiXQogCiAgICAgc2V0 IHB5dGVzdF9zY3JpcHQgW2xpbmRleCAkYXJncyAxXQogICAgIGlmIHsgIVtjaGVja19lZmZl Y3RpdmVfdGFyZ2V0X3B5dGVzdDNdIH0gewotLSAKMi40MC4wCgo= --------------6YYcpjwFg58uWQoQyq87CnPQ--