From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 54F1C3858D28 for ; Tue, 7 Dec 2021 03:42:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 54F1C3858D28 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1B73J5Tb032271; Tue, 7 Dec 2021 03:42:23 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3csykgrasr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 07 Dec 2021 03:42:22 +0000 Received: from m0098416.ppops.net (m0098416.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 1B73gM0f010892; Tue, 7 Dec 2021 03:42:22 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0b-001b2d01.pphosted.com with ESMTP id 3csykgrasa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 07 Dec 2021 03:42:22 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 1B73WkZ7005848; Tue, 7 Dec 2021 03:42:20 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma06ams.nl.ibm.com with ESMTP id 3cqykj1whb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 07 Dec 2021 03:42:20 +0000 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 1B73Yaht26083620 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 7 Dec 2021 03:34:36 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 53BF9A405F; Tue, 7 Dec 2021 03:42:16 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6CC1DA405B; Tue, 7 Dec 2021 03:42:12 +0000 (GMT) Received: from KewenLins-MacBook-Pro.local (unknown [9.197.229.3]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 7 Dec 2021 03:42:11 +0000 (GMT) Subject: Re: [PATCH v2] rs6000: Fix some issues in rs6000_can_inline_p [PR102059] To: Segher Boessenkool Cc: GCC Patches , David Edelsohn , Bill Schmidt , Michael Meissner , Peter References: <3f2c6df2-e458-483c-facd-148a3cc3aead@linux.ibm.com> <20211129165712.GU614@gate.crashing.org> <57a263ea-4ef3-c57e-ff4c-2e5833532162@linux.ibm.com> <20211206130638.GP614@gate.crashing.org> From: "Kewen.Lin" Message-ID: <531e1f41-0519-2892-fcfe-f8697b2a8ff7@linux.ibm.com> Date: Tue, 7 Dec 2021 11:42:09 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.0 MIME-Version: 1.0 In-Reply-To: <20211206130638.GP614@gate.crashing.org> Content-Type: multipart/mixed; boundary="------------BA59F6280273FE033FC3B5B2" Content-Language: en-US X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: vU0jCm1a8NAmkjOCvRFYgYuXk23V_4kx X-Proofpoint-GUID: _1VwFmH7GwrAAfz9P08SkXZor0DCz5YO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2021-12-07_01,2021-12-06_02,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 mlxlogscore=999 lowpriorityscore=0 suspectscore=0 bulkscore=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 mlxscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2112070020 X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: , X-List-Received-Date: Tue, 07 Dec 2021 03:42:27 -0000 This is a multi-part message in MIME format. --------------BA59F6280273FE033FC3B5B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Hi Segher, on 2021/12/6 下午9:06, Segher Boessenkool wrote: > On Fri, Dec 03, 2021 at 11:46:53AM +0800, Kewen.Lin wrote: >>>> This patch is to fix the inconsistent behaviors for non-LTO mode >>>> and LTO mode. As Martin pointed out, currently the function >>>> rs6000_can_inline_p simply makes it inlinable if callee_tree is >>>> NULL, but it's wrong, we should use the command line options >>>> from target_option_default_node as default. >>> >>> This is not documented. >> >> Yeah, but according to the document for the target attribute [1], >> "Multiple target back ends implement the target attribute to specify >> that a function is to be compiled with different target options than >> specified on the command line. The original target command-line options >> are ignored. ", it seems to say the function without any target >> attribute/pragma will be compiled with target options specified on the >> command line. I think it's a normal expectation for users. > > The whole target_option_default_node is not documented, I meant. > Ah, you meant that. Yeah, it can be improved separately. >> Excepting for the inconsistent behaviors between LTO and non-LTO, >> it can also make the below case different. >> >> // Option: -O2 -mcpu=power8 -mhtm >> >> int foo(int *b) { >> *b += __builtin_ttest(); >> return *b; >> } >> >> __attribute__((target("no-htm"))) int bar(int *a) { >> *a = foo(a); >> return 0; >> } >> >> Without this fix, bar inlines foo but get the error as below: >> >> In function ‘foo’, >> inlined from ‘bar’ at test.c:8:8: >> test.c:3:9: error: ‘__builtin_ttest’ requires the ‘-mhtm’ option >> 3 | *b += __builtin_ttest(); >> | ^~~~~~~~~~~~~~~~~ >> >> Since bar doesn't support foo's required HTM feature. >> >> With this fix, bar doesn't inline foo and the case gets compiled well. > > And if you inline something no-htm into something that allows htm? That > should work fine, be allowed just fine. > Thanks for helping to answer this, Peter! >>>> It also replaces >>>> rs6000_isa_flags with the one from target_option_default_node >>>> when caller_tree is NULL as rs6000_isa_flags could probably >>>> change since initialization. >>> >>> Is this enough then? Are there no other places that use >>> rs6000_isa_flags? Is it correct for us to have that variable at all >>> anymore? Etc. >> >> Good question, I think the answer is yes. I digged into it and found >> the current target option save/restore scheme would keep rs6000_isa_flags >> to be the same as the one saved in target_option_default_node for the context >> of inlining. So I put one assertion as below: >> >> if (!caller_tree) { >> caller_tree = target_option_default_node; >> gcc_assert (rs6000_isa_flags >> == TREE_TARGET_OPTION (caller_tree)->x_rs6000_isa_flags); >> } >> >> And kicked off regression testings on both BE and LE, the result showed >> only one same failure, which seems to be a latent bug. I've filed PR103515 >> for it. > > Ah cool :-) Please send a patch to add that asser then (well, once we > can bootstrap with it ;-) ) > OK. >> This bug also indicates it's better to use target_option_default_node >> rather than rs6000_isa_flags when the caller_tree is NULL. Since >> the target_option_default_node is straightforward and doesn't rely >> on the assumption that rs6000_isa_flags would be kept as the default >> one correctly, it doesn't suffer from bugs like PR103515. > > So we should not ever use rs6000_isa_flags anymore? > If the question is for the scope in function rs6000_can_inline_p, yes. Before this patch, the only use of rs6000_isa_flags is: /* If the caller has option attributes, then use them. Otherwise, use the command line options. */ if (caller_tree) caller_isa = TREE_TARGET_OPTION (caller_tree)->x_rs6000_isa_flags; else caller_isa = rs6000_isa_flags; This patch changes this part to be like (logically): if (caller_tree) caller_isa = TREE_TARGET_OPTION (caller_tree)->x_rs6000_isa_flags; else caller_isa = TREE_TARGET_OPTION (target_option_default_node)->x_rs6000_isa_flags; If the question is for the others out of function rs6000_can_inline_p, no. The rs6000_isa_flags holds the flags for the current context of either top level or some given function decl. As function rs6000_set_current_function shows, we already consider target_option_default_node for the case that there is NULL DECL_FUNCTION_SPECIFIC_TARGET for one decl. >>> The fusion ones are obvious. The other two are not. Please put those >>> two more obviously separate (not somewhere in the sea of fusion >>> options), and some comment wouldn't hurt either. You can make it >>> separate statements even, make it really stand out. >>> >> >> Fixed by splitting it into: fusion_options_mask and optimization_options_mask. >> I'm not happy for the later name, but poor to get a better in mind. Do you >> have any suggestions on the name and words? > > You dont have to split it into variables, as you found out then you get > the usual naming problem. But you can just split it in the code: > > if (important_condition > || another_important_one > /* comment explaining things */ > || bla1 || bla2 || bla3 || bla4 || bla5) > Got it, thanks. Removed those two variables and updated it to: /* Some features can be tolerated for always inlines. */ unsigned HOST_WIDE_INT always_inline_safe_mask /* Fusion option masks. */ = OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION | OPTION_MASK_P8_FUSION_SIGN | OPTION_MASK_P10_FUSION | OPTION_MASK_P10_FUSION_LD_CMPI | OPTION_MASK_P10_FUSION_2LOGICAL | OPTION_MASK_P10_FUSION_LOGADD | OPTION_MASK_P10_FUSION_ADDLOG | OPTION_MASK_P10_FUSION_2ADD /* Like fusion, some option masks which are just for optimization. */ | OPTION_MASK_SAVE_TOC_INDIRECT | OPTION_MASK_PCREL_OPT; >>> Why are there OPTION_MASKs for separate P10 fusion types here, as well as >>> MASK_P10_FUSION? >> >> Mike helped to explain the history, I've updated all of them using OPTION_MASK_ >> to avoid potential confusion. > > That is one thing, sure, but why are both needed? Both the "main" flag, > and the "details" flags. Because they are taken as independent bits in the below checking with bitwise manipulation, like: (caller_isa & callee_isa) == callee_isa) > > (The latter should soon go away btw). > > > Segher > The updated patch is attached, just changing always_inline_safe_mask should be no any functional changes comparing to the previous version. Does it look good to you? BR, Kewen --- gcc/ChangeLog: PR ipa/102059 * config/rs6000/rs6000.c (rs6000_can_inline_p): Adjust with target_option_default_node and consider always_inline_safe flags. gcc/testsuite/ChangeLog: PR ipa/102059 * gcc.target/powerpc/pr102059-1.c: New test. * gcc.target/powerpc/pr102059-2.c: New test. * gcc.target/powerpc/pr102059-3.c: New test. * gcc.target/powerpc/pr102059-4.c: New test. * gcc.target/powerpc/pr102059-5.c: New test. ----- --------------BA59F6280273FE033FC3B5B2 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="PR102059_v3.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="PR102059_v3.patch" LS0tCiBnY2MvY29uZmlnL3JzNjAwMC9yczYwMDAuYyAgICAgICAgICAgICAgICAgICAgfCA5 MSArKysrKysrKysrKystLS0tLS0KIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9wb3dlcnBj L3ByMTAyMDU5LTEuYyB8IDI0ICsrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcG93 ZXJwYy9wcjEwMjA1OS0yLmMgfCAyMCArKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv cG93ZXJwYy9wcjEwMjA1OS0zLmMgfCA5NSArKysrKysrKysrKysrKysrKysrCiBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvcG93ZXJwYy9wcjEwMjA1OS00LmMgfCAyMiArKysrKwogZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Bvd2VycGMvcHIxMDIwNTktNS5jIHwgMjIgKysrKysK IDYgZmlsZXMgY2hhbmdlZCwgMjQ2IGluc2VydGlvbnMoKyksIDI4IGRlbGV0aW9ucygtKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9wb3dlcnBjL3By MTAyMDU5LTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9wb3dlcnBjL3ByMTAyMDU5LTIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5LTMuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5LTQuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5 LTUuYwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvcnM2MDAwL3JzNjAwMC5jIGIvZ2NjL2Nv bmZpZy9yczYwMDAvcnM2MDAwLmMKaW5kZXggMjg5YzFiM2RmMjQuLjg1NmJkMjcxYTE0IDEw MDY0NAotLS0gYS9nY2MvY29uZmlnL3JzNjAwMC9yczYwMDAuYworKysgYi9nY2MvY29uZmln L3JzNjAwMC9yczYwMDAuYwpAQCAtMjU1MzksNDUgKzI1NTM5LDgwIEBAIHJzNjAwMF9nZW5l cmF0ZV92ZXJzaW9uX2Rpc3BhdGNoZXJfYm9keSAodm9pZCAqbm9kZV9wKQogc3RhdGljIGJv b2wKIHJzNjAwMF9jYW5faW5saW5lX3AgKHRyZWUgY2FsbGVyLCB0cmVlIGNhbGxlZSkKIHsK LSAgYm9vbCByZXQgPSBmYWxzZTsKICAgdHJlZSBjYWxsZXJfdHJlZSA9IERFQ0xfRlVOQ1RJ T05fU1BFQ0lGSUNfVEFSR0VUIChjYWxsZXIpOwogICB0cmVlIGNhbGxlZV90cmVlID0gREVD TF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGNhbGxlZSk7CiAKLSAgLyogSWYgdGhlIGNh bGxlZSBoYXMgbm8gb3B0aW9uIGF0dHJpYnV0ZXMsIHRoZW4gaXQgaXMgb2sgdG8gaW5saW5l LiAgKi8KKyAgLyogSWYgdGhlIGNhbGxlci9jYWxsZWUgaGFzIG9wdGlvbiBhdHRyaWJ1dGVz LCB0aGVuIHVzZSB0aGVtLgorICAgICBPdGhlcndpc2UsIHVzZSB0aGUgY29tbWFuZCBsaW5l IG9wdGlvbnMuICAqLwogICBpZiAoIWNhbGxlZV90cmVlKQotICAgIHJldCA9IHRydWU7Cisg ICAgY2FsbGVlX3RyZWUgPSB0YXJnZXRfb3B0aW9uX2RlZmF1bHRfbm9kZTsKKyAgaWYgKCFj YWxsZXJfdHJlZSkKKyAgICBjYWxsZXJfdHJlZSA9IHRhcmdldF9vcHRpb25fZGVmYXVsdF9u b2RlOworCisgIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uICpjYWxsZXJfb3B0cyA9IFRSRUVf VEFSR0VUX09QVElPTiAoY2FsbGVyX3RyZWUpOworICBzdHJ1Y3QgY2xfdGFyZ2V0X29wdGlv biAqY2FsbGVlX29wdHMgPSBUUkVFX1RBUkdFVF9PUFRJT04gKGNhbGxlZV90cmVlKTsKKyAg SE9TVF9XSURFX0lOVCBjYWxsZXJfaXNhID0gY2FsbGVyX29wdHMtPnhfcnM2MDAwX2lzYV9m bGFnczsKKyAgSE9TVF9XSURFX0lOVCBjYWxsZWVfaXNhID0gY2FsbGVlX29wdHMtPnhfcnM2 MDAwX2lzYV9mbGFnczsKKworICBib29sIGFsd2F5c19pbmxpbmUKKyAgICA9IERFQ0xfRElT UkVHQVJEX0lOTElORV9MSU1JVFMgKGNhbGxlZSkKKyAgICAgICYmIGxvb2t1cF9hdHRyaWJ1 dGUgKCJhbHdheXNfaW5saW5lIiwgREVDTF9BVFRSSUJVVEVTIChjYWxsZWUpKTsKKworICAv KiBTb21lIGZlYXR1cmVzIGNhbiBiZSB0b2xlcmF0ZWQgZm9yIGFsd2F5cyBpbmxpbmVzLiAg Ki8KKyAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhbHdheXNfaW5saW5lX3NhZmVfbWFzawor ICAgIC8qIEZ1c2lvbiBvcHRpb24gbWFza3MuICAqLworICAgID0gT1BUSU9OX01BU0tfUDhf RlVTSU9OIHwgT1BUSU9OX01BU0tfUDEwX0ZVU0lPTgorICAgICAgfCBPUFRJT05fTUFTS19Q OF9GVVNJT05fU0lHTiB8IE9QVElPTl9NQVNLX1AxMF9GVVNJT04KKyAgICAgIHwgT1BUSU9O X01BU0tfUDEwX0ZVU0lPTl9MRF9DTVBJIHwgT1BUSU9OX01BU0tfUDEwX0ZVU0lPTl8yTE9H SUNBTAorICAgICAgfCBPUFRJT05fTUFTS19QMTBfRlVTSU9OX0xPR0FERCB8IE9QVElPTl9N QVNLX1AxMF9GVVNJT05fQURETE9HCisgICAgICB8IE9QVElPTl9NQVNLX1AxMF9GVVNJT05f MkFERAorICAgICAgLyogTGlrZSBmdXNpb24sIHNvbWUgb3B0aW9uIG1hc2tzIHdoaWNoIGFy ZSBqdXN0IGZvciBvcHRpbWl6YXRpb24uICAqLworICAgICAgfCBPUFRJT05fTUFTS19TQVZF X1RPQ19JTkRJUkVDVCB8IE9QVElPTl9NQVNLX1BDUkVMX09QVDsKKworICAvKiBUbyBhZGp1 c3QgY2FsbGVlIGlzIGVub3VnaCBzaW5jZSB3ZSBqdXN0IGNoZWNrIGZvciBzdWJzZXQuICAq LworICBpZiAoYWx3YXlzX2lubGluZSkKKyAgICBjYWxsZWVfaXNhICY9IH5hbHdheXNfaW5s aW5lX3NhZmVfbWFzazsKKworICAvKiBUaGUgY2FsbGVlJ3Mgb3B0aW9ucyBtdXN0IGJlIGEg c3Vic2V0IG9mIHRoZSBjYWxsZXIncyBvcHRpb25zLCBpLmUuCisgICAgIGEgdnN4IGZ1bmN0 aW9uIG1heSBpbmxpbmUgYW4gYWx0aXZlYyBmdW5jdGlvbiwgYnV0IGEgbm8tdnN4IGZ1bmN0 aW9uCisgICAgIG11c3Qgbm90IGlubGluZSBhIHZzeCBmdW5jdGlvbi4gICovCisgIGlmICgo Y2FsbGVyX2lzYSAmIGNhbGxlZV9pc2EpICE9IGNhbGxlZV9pc2EpCisgICAgeworICAgICAg aWYgKFRBUkdFVF9ERUJVR19UQVJHRVQpCisJZnByaW50ZiAoc3RkZXJyLAorCQkgInJzNjAw MF9jYW5faW5saW5lX3A6LCBjYWxsZXIgJXMsIGNhbGxlZSAlcywgY2Fubm90ICIKKwkJICJp bmxpbmUgc2luY2UgY2FsbGVlJ3Mgb3B0aW9ucyBzZXQgaXNuJ3QgYSBzdWJzZXQgb2YgIgor CQkgImNhbGxlcidzIG9wdGlvbnMgc2V0LlxuIiwKKwkJIGdldF9kZWNsX25hbWUgKGNhbGxl ciksIGdldF9kZWNsX25hbWUgKGNhbGxlZSkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAg IH0KIAotICBlbHNlCisgIC8qIEZvciB0aG9zZSBvcHRpb25zIHRoYXQgdGhlIGNhbGxlZSBo YXMgZXhwbGljaXRseSBlbmFibGVkIG9yIGRpc2FibGVkLAorICAgICB0aGVuIHdlIG11c3Qg ZW5mb3JjZSB0aGF0IHRoZSBjYWxsZWUncyBhbmQgY2FsbGVyJ3Mgb3B0aW9ucyBtYXRjaAor ICAgICBleGFjdGx5OyBzZWUgUFI3MDAxMC4gICovCisgIEhPU1RfV0lERV9JTlQgZXhwbGlj aXRfaXNhID0gY2FsbGVlX29wdHMtPnhfcnM2MDAwX2lzYV9mbGFnc19leHBsaWNpdDsKKyAg aWYgKGFsd2F5c19pbmxpbmUpCisgICAgZXhwbGljaXRfaXNhICY9IH5hbHdheXNfaW5saW5l X3NhZmVfbWFzazsKKyAgaWYgKChjYWxsZXJfaXNhICYgZXhwbGljaXRfaXNhKSAhPSAoY2Fs bGVlX2lzYSAmIGV4cGxpY2l0X2lzYSkpCiAgICAgewotICAgICAgSE9TVF9XSURFX0lOVCBj YWxsZXJfaXNhOwotICAgICAgc3RydWN0IGNsX3RhcmdldF9vcHRpb24gKmNhbGxlZV9vcHRz ID0gVFJFRV9UQVJHRVRfT1BUSU9OIChjYWxsZWVfdHJlZSk7Ci0gICAgICBIT1NUX1dJREVf SU5UIGNhbGxlZV9pc2EgPSBjYWxsZWVfb3B0cy0+eF9yczYwMDBfaXNhX2ZsYWdzOwotICAg ICAgSE9TVF9XSURFX0lOVCBleHBsaWNpdF9pc2EgPSBjYWxsZWVfb3B0cy0+eF9yczYwMDBf aXNhX2ZsYWdzX2V4cGxpY2l0OwotCi0gICAgICAvKiBJZiB0aGUgY2FsbGVyIGhhcyBvcHRp b24gYXR0cmlidXRlcywgdGhlbiB1c2UgdGhlbS4KLQkgT3RoZXJ3aXNlLCB1c2UgdGhlIGNv bW1hbmQgbGluZSBvcHRpb25zLiAgKi8KLSAgICAgIGlmIChjYWxsZXJfdHJlZSkKLQljYWxs ZXJfaXNhID0gVFJFRV9UQVJHRVRfT1BUSU9OIChjYWxsZXJfdHJlZSktPnhfcnM2MDAwX2lz YV9mbGFnczsKLSAgICAgIGVsc2UKLQljYWxsZXJfaXNhID0gcnM2MDAwX2lzYV9mbGFnczsK LQotICAgICAgLyogVGhlIGNhbGxlZSdzIG9wdGlvbnMgbXVzdCBiZSBhIHN1YnNldCBvZiB0 aGUgY2FsbGVyJ3Mgb3B0aW9ucywgaS5lLgotCSBhIHZzeCBmdW5jdGlvbiBtYXkgaW5saW5l IGFuIGFsdGl2ZWMgZnVuY3Rpb24sIGJ1dCBhIG5vLXZzeCBmdW5jdGlvbgotCSBtdXN0IG5v dCBpbmxpbmUgYSB2c3ggZnVuY3Rpb24uICBIb3dldmVyLCBmb3IgdGhvc2Ugb3B0aW9ucyB0 aGF0IHRoZQotCSBjYWxsZWUgaGFzIGV4cGxpY2l0bHkgZW5hYmxlZCBvciBkaXNhYmxlZCwg dGhlbiB3ZSBtdXN0IGVuZm9yY2UgdGhhdAotCSB0aGUgY2FsbGVlJ3MgYW5kIGNhbGxlcidz IG9wdGlvbnMgbWF0Y2ggZXhhY3RseTsgc2VlIFBSNzAwMTAuICAqLwotICAgICAgaWYgKCgo Y2FsbGVyX2lzYSAmIGNhbGxlZV9pc2EpID09IGNhbGxlZV9pc2EpCi0JICAmJiAoY2FsbGVy X2lzYSAmIGV4cGxpY2l0X2lzYSkgPT0gKGNhbGxlZV9pc2EgJiBleHBsaWNpdF9pc2EpKQot CXJldCA9IHRydWU7CisgICAgICBpZiAoVEFSR0VUX0RFQlVHX1RBUkdFVCkKKwlmcHJpbnRm IChzdGRlcnIsCisJCSAicnM2MDAwX2Nhbl9pbmxpbmVfcDosIGNhbGxlciAlcywgY2FsbGVl ICVzLCBjYW5ub3QgIgorCQkgImlubGluZSBzaW5jZSBjYWxsZWUncyBvcHRpb25zIHNldCBp c24ndCBhIHN1YnNldCBvZiAiCisJCSAiY2FsbGVyJ3Mgb3B0aW9ucyBzZXQgYnkgY29uc2lk ZXJpbmcgY2FsbGVlJ3MgIgorCQkgImV4cGxpY2l0bHkgc2V0IG9wdGlvbnMuXG4iLAorCQkg Z2V0X2RlY2xfbmFtZSAoY2FsbGVyKSwgZ2V0X2RlY2xfbmFtZSAoY2FsbGVlKSk7CisgICAg ICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgIGlmIChUQVJHRVRfREVCVUdfVEFSR0VUKQot ICAgIGZwcmludGYgKHN0ZGVyciwgInJzNjAwMF9jYW5faW5saW5lX3A6LCBjYWxsZXIgJXMs IGNhbGxlZSAlcywgJXMgaW5saW5lXG4iLAotCSAgICAgZ2V0X2RlY2xfbmFtZSAoY2FsbGVy KSwgZ2V0X2RlY2xfbmFtZSAoY2FsbGVlKSwKLQkgICAgIChyZXQgPyAiY2FuIiA6ICJjYW5u b3QiKSk7CisgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgInJzNjAwMF9jYW5faW5saW5l X3A6LCBjYWxsZXIgJXMsIGNhbGxlZSAlcywgY2FuIGlubGluZS5cbiIsCisJICAgICBnZXRf ZGVjbF9uYW1lIChjYWxsZXIpLCBnZXRfZGVjbF9uYW1lIChjYWxsZWUpKTsKIAotICByZXR1 cm4gcmV0OworICByZXR1cm4gdHJ1ZTsKIH0KKwogDAogLyogQWxsb2NhdGUgYSBzdGFjayB0 ZW1wIGFuZCBmaXh1cCB0aGUgYWRkcmVzcyBzbyBpdCBtZWV0cyB0aGUgcGFydGljdWxhcgog ICAgbWVtb3J5IHJlcXVpcmVtZW50cyAoZWl0aGVyIG9mZmV0YWJsZSBvciBSRUcrUkVHIGFk ZHJlc3NpbmcpLiAgKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9w b3dlcnBjL3ByMTAyMDU5LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9wb3dlcnBj L3ByMTAyMDU5LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZDJhMDAyY2YxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvcG93ZXJwYy9wcjEwMjA1OS0xLmMKQEAgLTAsMCArMSwyNCBAQAorLyogeyBkZy1kbyBj b21waWxlIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHBvd2VycGNf aHRtX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tZGVqYWdudS1jcHU9cG93ZXI4 IiB9ICovCisKKy8qIFZlcmlmeSBpdCBlbWl0cyBpbmxpbmluZyBlcnJvciBtc2cgYXQgbm9u LUxUTyBtb2RlLiAgKi8KKworI2luY2x1ZGUgPGh0bWludHJpbi5oPgorCitzdGF0aWMgaW5s aW5lIGludCBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSkpCitmb28gKGludCAqYikg LyogeyBkZy1lcnJvciAiaW5saW5pbmcgZmFpbGVkIGluIGNhbGwgdG8gLiogdGFyZ2V0IHNw ZWNpZmljIG9wdGlvbiBtaXNtYXRjaCIgfSAqLworeworICBpbnQgcmVzID0gX0hUTV9TVEFU RShfX2J1aWx0aW5fdHRlc3QoKSk7CisgICpiICs9IHJlczsKKyAgcmV0dXJuICpiOworfQor CisjcHJhZ21hIEdDQyB0YXJnZXQgImNwdT1wb3dlcjEwIgoraW50CitiYXIgKGludCAqYSkK K3sKKyAgKmEgPSBmb28gKGEpOyAvKiB7IGRnLW1lc3NhZ2UgImNhbGxlZCBmcm9tIGhlcmUi IH0gKi8KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5LTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9wb3dlcnBjL3ByMTAyMDU5LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uMWQ1ZDZjMzhiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvcG93ZXJwYy9wcjEwMjA1OS0yLmMKQEAgLTAsMCArMSwyMCBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tbm8tdnN4IiB9 ICovCisKKy8qIFZlcmlmeSBpdCBlbWl0cyBpbmxpbmluZyBlcnJvciBtc2cgd2hlbiB0aGUg Y2FsbGVlIGhhcyBleHBsaWNpdAorICAgZGlzYWJsaW5nIG9wdGlvbiBmcm9tIGNvbW1hbmQg bGluZS4gICovCisKK3ZlY3RvciBpbnQgYywgYSwgYjsKKworc3RhdGljIGlubGluZSB2b2lk IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCitmb28gKCkgLyogeyBkZy1l cnJvciAiaW5saW5pbmcgZmFpbGVkIGluIGNhbGwgdG8gLiogdGFyZ2V0IHNwZWNpZmljIG9w dGlvbiBtaXNtYXRjaCIgfSAqLworeworICBjID0gYSArIGI7Cit9CisKK19fYXR0cmlidXRl X18gKCh0YXJnZXQgKCJ2c3giKSkpCitpbnQgbWFpbiAoKQoreworICBmb28gKCk7IC8qIHsg ZGctbWVzc2FnZSAiY2FsbGVkIGZyb20gaGVyZSIgfSAqLworICBjID0gYSArIGI7Cit9CmRp ZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcG93ZXJwYy9wcjEwMjA1OS0z LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcG93ZXJwYy9wcjEwMjA1OS0zLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjk2ODRjYWI5ODZhCi0tLSAv ZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Bvd2VycGMvcHIxMDIw NTktMy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiAt V25vLWF0dHJpYnV0ZXMgc3VwcHJlc3NlcyBhbHdheXNfaW5saW5lIHdhcm5pbmdzLiAgKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1tZGVqYWdudS1jcHU9cG93ZXI4IC1Xbm8tYXR0cmli dXRlcyIgfSAqLworCisvKiBWZXJpZnkgaXQgZG9lc24ndCBlbWl0IGlubGluaW5nIGVycm9y IG1zZyBzaW5jZSBzb21lIG1pc21hdGNoZWQKKyAgIGZlYXR1cmVzIGFyZSBjb25zaWRlcmVk IGFzIHNhZmUgZm9yIGFsd2F5c19pbmxpbmUuICAqLworCisvKiAxLiBDYWxsZWUgZW5hYmxl cyBQb3dlcjggZnVzaW9uIGltcGxpY2l0bHksIHdoaWxlIGNhbGxlcgorICAgICAgd2l0aCBQ b3dlcjkgZG9lc24ndCBzdXBwb3J0IHBvd2VyOCBmdXNpb24gYXQgYWxsLiAgKi8KKworX19h dHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQoraW50IGNhbGxlZTEgKGludCAqYikKK3sK KyAgKmIgKz0gMTsKKyAgcmV0dXJuICpiOworfQorCisjcHJhZ21hIEdDQyB0YXJnZXQgImNw dT1wb3dlcjkiCitpbnQgY2FsbGVyMSAoaW50ICphKQoreworICAqYSA9IGNhbGxlZTEgKGEp OworICByZXR1cm4gMDsKK30KKworLyogMi4gQ2FsbGVyIGVuYWJsZXMgaW5kaXJlY3QgdG9j IHNhdmUgZmVhdHVyZSB3aGlsZSBjYWxsZWUKKyAgICAgIGRpc2FibGVzIGl0IGV4cGxpY2l0 bHkuICAqLworCisjcHJhZ21hIEdDQyB0YXJnZXQgInNhdmUtdG9jLWluZGlyZWN0IgorX19h dHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQoraW50IGNhbGxlZTIgKGludCAqYikKK3sK KyAgKmIgKz0gMjsKKyAgcmV0dXJuICpiOworfQorCisjcHJhZ21hIEdDQyB0YXJnZXQgIm5v LXNhdmUtdG9jLWluZGlyZWN0IgoraW50IGNhbGxlcjIgKGludCAqYSkKK3sKKyAgKmEgPSBj YWxsZWUyIChhKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIDMuIENhbGxlciBkaXNhYmxlcyBQ b3dlcjEwIGZ1c2lvbiBleHBsaWNpdGx5LCB3aGlsZSBjYWxsZWUKKyAgICAgIHN0aWxsIHN1 cHBvcnRzIGl0IGFzIFBvd2VyMTAgdHVybnMgaXQgb24gYnkgZGVmYXVsdC4gICovCisKKyNw cmFnbWEgR0NDIHRhcmdldCAiY3B1PXBvd2VyMTAiCitfX2F0dHJpYnV0ZV9fICgoYWx3YXlz X2lubGluZSkpCitpbnQgY2FsbGVlMyAoaW50ICpiKQoreworICAqYiArPSAzOworICByZXR1 cm4gKmI7Cit9CisKKyNwcmFnbWEgR0NDIHRhcmdldCAiY3B1PXBvd2VyMTAsbm8tcG93ZXIx MC1mdXNpb24iCitpbnQgY2FsbGVyMyAoaW50ICphKQoreworICAqYSA9IGNhbGxlZTMgKGEp OworICByZXR1cm4gMDsKK30KKworLyogNC4gQ2FsbGVyIGVuYWJsZXMgUG93ZXIxMCBmdXNp b24gaW1wbGljaXRseSwgd2hpbGUgY2FsbGVlCisgICAgICBkaXNhYmxlcyBpdCBleHBsaWNp dGx5LiAgKi8KKworI3ByYWdtYSBHQ0MgdGFyZ2V0ICJuby1wb3dlcjEwLWZ1c2lvbiIKK19f YXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSkKK2ludCBjYWxsZWU0IChpbnQgKmIpCit7 CisgICpiICs9IDQ7CisgIHJldHVybiAqYjsKK30KKworI3ByYWdtYSBHQ0MgdGFyZ2V0ICJj cHU9cG93ZXIxMCIKK2ludCBjYWxsZXI0IChpbnQgKmEpCit7CisgICphID0gY2FsbGVlNCAo YSk7CisgIHJldHVybiAwOworfQorCisvKiA1LiBDYWxsZXIgZGlzYWJsZXMgcGNyZWwtb3B0 IHdoaWxlIGNhbGxlZSBlbmFibGVzIGl0IGV4cGxpY2l0bHkuICAqLworCisjcHJhZ21hIEdD QyB0YXJnZXQgImNwdT1wb3dlcjEwLG5vLXBjcmVsLW9wdCIKK19fYXR0cmlidXRlX18gKChh bHdheXNfaW5saW5lKSkKK2ludCBjYWxsZWU1IChpbnQgKmIpCit7CisgICpiICs9IDU7Cisg IHJldHVybiAqYjsKK30KKworI3ByYWdtYSBHQ0MgdGFyZ2V0ICJjcHU9cG93ZXIxMCxwY3Jl bC1vcHQiCitpbnQgY2FsbGVyNSAoaW50ICphKQoreworICAqYSA9IGNhbGxlZTUgKGEpOwor ICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L3Bvd2VycGMvcHIxMDIwNTktNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Bvd2Vy cGMvcHIxMDIwNTktNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li4wZjI3ZjJjZTdkNwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9wb3dlcnBjL3ByMTAyMDU5LTQuYwpAQCAtMCwwICsxLDIyIEBACisvKiB7IGRnLWRv IGNvbXBpbGUgfSAqLworLyogLVduby1hdHRyaWJ1dGVzIHN1cHByZXNzZXMgYWx3YXlzX2lu bGluZSB3YXJuaW5ncy4gICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWRlamFnbnUtY3B1 PXBvd2VyOCAtbW5vLXBvd2VyOC1mdXNpb24gLVduby1hdHRyaWJ1dGVzIiB9ICovCisKKy8q IFZlcmlmeSBpdCBkb2Vzbid0IGVtaXQgaW5saW5pbmcgZXJyb3IgbXNnIHNpbmNlIHRoZSBm bGFnIHBvd2VyOAorICAgZnVzaW9uIGlzIGNvbnNpZGVyZWQgYXMgc2FmZSBmb3IgYWx3YXlz X2lubGluZSwgaXQncyBzdGlsbCBzYWZlCisgICBldmVuIHRoZSBmbGFnIGlzIHNldCBleHBs aWNpdGx5LiAgKi8KKworX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQoraW50IGZv byAoaW50ICpiKQoreworICAqYiArPSAxMDsKKyAgcmV0dXJuICpiOworfQorCisjcHJhZ21h IEdDQyB0YXJnZXQgInBvd2VyOC1mdXNpb24iCitpbnQgYmFyIChpbnQgKmEpCit7CisgICph ID0gZm9vIChhKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5LTUuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9wb3dlcnBjL3ByMTAyMDU5LTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uODI2Y2U4ODAyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvcG93ZXJwYy9wcjEwMjA1OS01LmMKQEAgLTAsMCArMSwyMiBA QAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUt dGFyZ2V0IHBvd2VycGNfaHRtX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tZGVq YWdudS1jcHU9cG93ZXI4IC1taHRtIiB9ICovCisKKy8qIFZlcmlmeSB0aGUgaW5saW5pbmcg d29uJ3QgcGVyZm9ybSB3aGVuIHRoZSBjYWxsZWUgcmVxdWlyZXMKKyAgIHNvbWUgdGFyZ2V0 IGZlYXR1cmUgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkIGJ5IGNhbGxlciwgZXZlbgorICAgaWYg dGhlIGNhbGxlZSBkb2Vzbid0IGhhdmUgYW55IHRhcmdldCBhdHRyaWJ1dGVzIG9yIHByYWdt YXMuCisgICBJZiB0aGUgaW5saW5pbmcgcGVyZm9ybXMgaGVyZSwgdGhlIGNvbXBpbGF0aW9u IHdpbGwgZmFpbC4gICovCisKK2ludAorZm9vIChpbnQgKmIpCit7CisgICpiICs9IF9fYnVp bHRpbl90dGVzdCAoKTsKKyAgcmV0dXJuICpiOworfQorCitfX2F0dHJpYnV0ZV9fICgodGFy Z2V0ICgibm8taHRtIikpKSBpbnQKK2JhciAoaW50ICphKQoreworICAqYSA9IGZvbyAoYSk7 CisgIHJldHVybiAwOworfQotLSAKMi4yNS4xCgo= --------------BA59F6280273FE033FC3B5B2--