From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o91.zoho.com (sender4-pp-o91.zoho.com [136.143.188.91]) by sourceware.org (Postfix) with ESMTPS id EB27D3857410; Wed, 26 May 2021 00:17:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org EB27D3857410 ARC-Seal: i=1; a=rsa-sha256; t=1621988225; cv=none; d=zohomail.com; s=zohoarc; b=ToLrpIQAiLmDBaILKnHBgxG6Ks/7rNE1+an15tdICJBew05xg0wTzxX5mydaWomTjYOKh8tJJTWK2cBnumuDm+grySsd8JcWHlSri2C4JW/IPKxDGiqvE4Xtc/EqLI+Sx1/nyik9IFCywPFnmeZKs+o1p7TdEJyAj78PoDusgGI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621988225; h=Content-Type:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=MJilA7M0myQYM3UuCMOTDoLQZ0IaB8CPxJwNd7c6nk0=; b=cT81dUj2scC22Rfqz64V9hJWRGrZuMXB5uakgsZvEFqPljWr39X5yvdlDzRW++G7dSLj7vTGUv68i5beW0DYJSyrvDk+uQ4Gdr9AUIGcIBKkZH3zoxesPTvkSHhip/6eLkB1//Qe2wg2oMqBxpBvvRVS2EWLEbNMAbE8DEiXRG4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=zoho.com; spf=pass smtp.mailfrom=bouanto@zoho.com; dmarc=pass header.from= Received: from [192.168.1.174] (38.87.11.6 [38.87.11.6]) by mx.zohomail.com with SMTPS id 1621988221845888.7464580371803; Tue, 25 May 2021 17:17:01 -0700 (PDT) Message-ID: <0f7f2bf386c29efa1403020cbb02bec815ce25fe.camel@zoho.com> Subject: Re: [PATCH] libgccjit: Handle truncation and extension for casts [PR 95498] From: Antoni Boucher To: David Malcolm Cc: Tom Tromey , jit@gcc.gnu.org, Antoni Boucher via Gcc-patches Date: Tue, 25 May 2021 20:16:58 -0400 In-Reply-To: <597ecec1c91c1176f740796e20432372377aa554.camel@redhat.com> References: <20200713003002.bs5hwv4gav6ml5rt@bouanto-laptop.localdomain> <874ki6txcc.fsf@tromey.com> <20210220221706.ewfq2b3i2mzx4ice@bouanto-desktop.localdomain> <3ae55b5acc33b38c579ac9c293993c29adc55ae9.camel@redhat.com> <597ecec1c91c1176f740796e20432372377aa554.camel@redhat.com> Content-Type: multipart/mixed; boundary="=-hN7UchwPTVvgnKuOOX6f" User-Agent: Evolution 3.40.1 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: jit@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Jit mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 May 2021 00:17:28 -0000 --=-hN7UchwPTVvgnKuOOX6f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I updated the patch according to the comments by Tom Tromey. There's one question left about your question regarding C_MAYBE_CONST_EXPR, David: I am not sure if we can get a C_MAYBE_CONST_EXPR from libgccjit, and it indeed seems like it's only created in c-family. However, we do use it in libgccjit here: https://github.com/gcc-mirror/gcc/blob/master/gcc/jit/jit-playback.c#L1180 I tried removing the condition `if (TREE_CODE (t_ret) !=3D C_MAYBE_CONST_EXPR)` and all the tests of libgccjit still pass. That code was copied from here: https://github.com/gcc-mirror/gcc/blob/master/gcc/c/c-convert.c#L175 and might not be needed in libgccjit. Should I just remove the condition, then? Le jeudi 13 mai 2021 =C3=A0 19:58 -0400, David Malcolm a =C3=A9crit=C2=A0: > On Thu, 2021-05-13 at 19:31 -0400, Antoni Boucher wrote: > > Thanks for your answer. > >=20 > > See my answers below: > >=20 > > Le jeudi 13 mai 2021 =C3=A0 18:13 -0400, David Malcolm a =C3=A9crit=C2= =A0: > > > On Sat, 2021-02-20 at 17:17 -0500, Antoni Boucher via Gcc-patches > > > wrote: > > > > Hi. > > > > Thanks for your feedback! > > > >=20 > > >=20 > > > Sorry about the delay in responding. > > >=20 > > > In the past I was hesitant about adding more cast support to > > > libgccjit > > > since I felt that the user could always just create a union to do > > > the > > > cast.=C2=A0 Then I tried actually using the libgccjit API to do this, > > > and > > > realized how much work it adds, so I now think we do want to > > > support > > > casting more types. > > >=20 > > >=20 > > > > See answers below: > > > >=20 > > > > On Sat, Feb 20, 2021 at 11:20:35AM -0700, Tom Tromey wrote: > > > > > > > > > > "Antoni" =3D=3D Antoni Boucher via Gcc-patches <=C2=A0= =C2=A0=20 > > > > > > > > > > gcc-patches@gcc.gnu.org> writes: > > > > >=20 > > > > > Antoni> gcc/jit/ > > > > > Antoni>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PR t= arget/95498 > > > > > Antoni>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* ji= t-playback.c: Add support to handle > > > > > truncation > > > > > and extension > > > > > Antoni>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0in t= he convert function. > > > > >=20 > > > > > Antoni> +=C2=A0 switch (dst_code) > > > > > Antoni> +=C2=A0=C2=A0=C2=A0 { > > > > > Antoni> +=C2=A0=C2=A0=C2=A0 case INTEGER_TYPE: > > > > > Antoni> +=C2=A0=C2=A0=C2=A0 case ENUMERAL_TYPE: > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 t_ret =3D convert_to_inte= ger (dst_type, expr); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto maybe_fold; > > > > > Antoni> + > > > > > Antoni> +=C2=A0=C2=A0=C2=A0 default: > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_assert (gcc::jit::act= ive_playback_ctxt); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc::jit::active_playback= _ctxt->add_error (NULL, > > > > > "unhandled conversion"); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fprintf (stderr, "input e= xpression:\n"); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 debug_tree (expr); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fprintf (stderr, "request= ed type:\n"); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 debug_tree (dst_type); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return error_mark_node; > > > > > Antoni> + > > > > > Antoni> +=C2=A0=C2=A0=C2=A0 maybe_fold: > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (TREE_CODE (t_ret) != =3D C_MAYBE_CONST_EXPR) > > >=20 > > > Do we even get C_MAYBE_CONST_EXPR in libgccjit?=C2=A0 That tree code = is > > > defined in c-family/c-common.def; how can nodes of that kind be > > > created > > > outside of the c-family? > >=20 > > I am not sure, but that seems like it's only created in c-family > > indeed. > > However, we do use it in libgccjit here: > >=20 > > https://github.com/gcc-mirror/gcc/blob/master/gcc/jit/jit-playback.c#L1= 180 > >=20 > > >=20 > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0t_ret =3D fold= (t_ret); > > > > > Antoni> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return t_ret; > > > > >=20 > > > > > It seems weird to have a single 'goto' to maybe_fold, > > > > > especially > > > > > inside > > > > > a switch like this. > > > > >=20 > > > > > If you think the maybe_fold code won't be reused, then it > > > > > should > > > > > just > > > > > be > > > > > hoisted up and the 'goto' removed. > > > >=20 > > > > This actually depends on how the support for cast between > > > > integers > > > > and=20 > > > > pointers will be implemented (see below). > > > > If we will support truncating pointers (does that even make > > > > sense? > > > > and > > > > I=20 > > > > guess we cannot extend a pointer unless we add the support for=20 > > > > uint128_t), that label will be reused for that case. > > > > Otherwise, it might not be reused. > > > >=20 > > > > So, please tell me which option to choose and I'll update my > > > > patch. > > >=20 > > > FWIW I don't think we'll want to support truncating or extending > > > pointers. > >=20 > > Ok, but do you think we'll want to support casts between integers and > > pointers? >=20 > Yes, though we probably want to reject truncating a pointer into a > smaller integer type. >=20 > > I opened an issue about this > > (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D95438) and would be > > willing to do a patch for it eventually. > >=20 > > > >=20 > > > > > On the other hand, if the maybe_fold code might be reused for > > > > > some > > > > > other > > > > > case, then I suppose I would have the case end with 'break' and > > > > > then > > > > > have this code outside the switch. > > > > >=20 > > > > >=20 > > > > > In another message, you wrote: > > > > >=20 > > > > > Antoni> For your question, the current code already works with > > > > > boolean and > > > > > Antoni> reals and casts between integers and pointers is > > > > > currently > > > > > not > > > > > Antoni> supported. > > > > >=20 > > > > > I am curious why this wasn't supported.=C2=A0 It seems like > > > > > something > > > > > that > > > > > one might want to do. > > > >=20 > > > > I have no idea as this is my first contribution to gcc. > > > > But this would be indeed very useful and I opened an issue about > > > > this:=20 > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D95438 > > > >=20 > > > > > thanks, > > > > > Tom > > > >=20 > > > > Thanks! > > > >=20 > > >=20 > > >=20 > >=20 > >=20 >=20 >=20 --=-hN7UchwPTVvgnKuOOX6f Content-Disposition: attachment; filename*0=0001-This-patch-handles-truncation-and-extension-for-cast.pat; filename*1=ch Content-Type: text/x-patch; name="0001-This-patch-handles-truncation-and-extension-for-cast.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA5NjRhOTcyYjI1ZDdlM2E2MjM4MDQ2NDAzYmJkOWNiMzM2NzI0OTgwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogU3VuLCA1IEp1bCAyMDIwIDE5OjA3OjMwIC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gVGhpcyBw YXRjaCBoYW5kbGVzIHRydW5jYXRpb24gYW5kIGV4dGVuc2lvbiBmb3IgY2FzdHMgaW4gaml0LgoK MjAyMC0wNy0xMiAgQW50b25pIEJvdWNoZXIgIDxib3VhbnRvQHpvaG8uY29tPgoKZ2NjL2ppdC8K CVBSIHRhcmdldC85NTQ5OAogICAgICAgICogaml0LXBsYXliYWNrLmMgKGNvbnZlcnQpOiBBZGQg c3VwcG9ydCB0byBoYW5kbGUgdHJ1bmNhdGlvbiBhbmQKICAgICAgICBleHRlbnNpb24gaW4gdGhl IGNvbnZlcnQgZnVuY3Rpb24uCgpnY2MvdGVzdHN1aXRlLwoJUFIgdGFyZ2V0Lzk1NDk4CgkqIGpp dC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaDogTmV3IHRlc3QuCgkqIGppdC5kZy90ZXN0LWNh c3QuYzogTmV3IHRlc3QuCgpTaWduZWQtb2ZmLWJ5OiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6 b2hvLmNvbT4KLS0tCiBnY2Mvaml0L2ppdC1wbGF5YmFjay5jICAgICAgICAgICAgICAgICAgICAg ICB8IDM2ICsrKysrKystLS0tCiBnY2MvdGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmct dGVzdHMuaCB8IDEwICsrKwogZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1jYXN0LmMgICAgICAg ICAgICAgfCA2NiArKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxMDEgaW5z ZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3Rz dWl0ZS9qaXQuZGcvdGVzdC1jYXN0LmMKCmRpZmYgLS1naXQgYS9nY2Mvaml0L2ppdC1wbGF5YmFj ay5jIGIvZ2NjL2ppdC9qaXQtcGxheWJhY2suYwppbmRleCA0ZmFjNjRkY2FiNy4uY2U5OTBiZDE4 YzYgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvaml0LXBsYXliYWNrLmMKKysrIGIvZ2NjL2ppdC9qaXQt cGxheWJhY2suYwpAQCAtNjEsMjIgKzYxLDM2IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZp bGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAKIC8qIGdjYzo6aml0OjpwbGF5YmFjazo6Y29udGV4 dDo6YnVpbGRfY2FzdCB1c2VzIHRoZSBjb252ZXJ0LmggQVBJLAogICAgd2hpY2ggaW4gdHVybiBy ZXF1aXJlcyB0aGUgZnJvbnRlbmQgdG8gcHJvdmlkZSBhICJjb252ZXJ0IgotICAgZnVuY3Rpb24s IGFwcGFyZW50bHkgYXMgYSBmYWxsYmFjay4KLQotICAgSGVuY2Ugd2UgcHJvdmlkZSB0aGlzIGR1 bW15IG9uZSwgd2l0aCB0aGUgcmVxdWlyZW1lbnQgdGhhdCBhbnkgY2FzdHMKLSAgIGFyZSBoYW5k bGVkIGJlZm9yZSByZWFjaGluZyB0aGlzLiAgKi8KKyAgIGZ1bmN0aW9uLCBhcHBhcmVudGx5IGFz IGEgZmFsbGJhY2sgZm9yIGNhc3RzIHRoYXQgY2FuIGJlIHNpbXBsaWZpZWQKKyAgICh0cnVuY2F0 aW9uLCBleHRlbnNpb24pLiAqLwogZXh0ZXJuIHRyZWUgY29udmVydCAodHJlZSB0eXBlLCB0cmVl IGV4cHIpOwogCiB0cmVlCiBjb252ZXJ0ICh0cmVlIGRzdF90eXBlLCB0cmVlIGV4cHIpCiB7Ci0g IGdjY19hc3NlcnQgKGdjYzo6aml0OjphY3RpdmVfcGxheWJhY2tfY3R4dCk7Ci0gIGdjYzo6aml0 OjphY3RpdmVfcGxheWJhY2tfY3R4dC0+YWRkX2Vycm9yIChOVUxMLCAidW5oYW5kbGVkIGNvbnZl cnNpb24iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiaW5wdXQgZXhwcmVzc2lvbjpcbiIpOwotICBk ZWJ1Z190cmVlIChleHByKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAicmVxdWVzdGVkIHR5cGU6XG4i KTsKLSAgZGVidWdfdHJlZSAoZHN0X3R5cGUpOwotICByZXR1cm4gZXJyb3JfbWFya19ub2RlOwor ICB0cmVlIHRfcmV0ID0gTlVMTDsKKyAgdF9yZXQgPSB0YXJnZXRtLmNvbnZlcnRfdG9fdHlwZSAo ZHN0X3R5cGUsIGV4cHIpOworICBpZiAodF9yZXQpCisgICAgICByZXR1cm4gdF9yZXQ7CisgIGVu dW0gdHJlZV9jb2RlIGRzdF9jb2RlID0gVFJFRV9DT0RFIChkc3RfdHlwZSk7CisgIHN3aXRjaCAo ZHN0X2NvZGUpCisgICAgeworICAgIGNhc2UgSU5URUdFUl9UWVBFOgorICAgIGNhc2UgRU5VTUVS QUxfVFlQRToKKyAgICAgIHRfcmV0ID0gY29udmVydF90b19pbnRlZ2VyIChkc3RfdHlwZSwgZXhw cik7CisgICAgICBpZiAoVFJFRV9DT0RFICh0X3JldCkgIT0gQ19NQVlCRV9DT05TVF9FWFBSKQor CXRfcmV0ID0gZm9sZCAodF9yZXQpOworICAgICAgcmV0dXJuIHRfcmV0OworCisgICAgZGVmYXVs dDoKKyAgICAgIGdjY19hc3NlcnQgKGdjYzo6aml0OjphY3RpdmVfcGxheWJhY2tfY3R4dCk7Cisg ICAgICBnY2M6OmppdDo6YWN0aXZlX3BsYXliYWNrX2N0eHQtPmFkZF9lcnJvciAoTlVMTCwgInVu aGFuZGxlZCBjb252ZXJzaW9uIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJpbnB1dCBleHBy ZXNzaW9uOlxuIik7CisgICAgICBkZWJ1Z190cmVlIChleHByKTsKKyAgICAgIGZwcmludGYgKHN0 ZGVyciwgInJlcXVlc3RlZCB0eXBlOlxuIik7CisgICAgICBkZWJ1Z190cmVlIChkc3RfdHlwZSk7 CisgICAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOworICAgIH0KIH0KIAogbmFtZXNwYWNlIGdj YyB7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVz dHMuaCBiL2djYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oCmluZGV4 IDQyMDJlYjc3OThiLi44NGVmNTRhMDM4NiAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9qaXQu ZGcvYWxsLW5vbi1mYWlsaW5nLXRlc3RzLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxs LW5vbi1mYWlsaW5nLXRlc3RzLmgKQEAgLTk4LDYgKzk4LDEzIEBACiAjdW5kZWYgY3JlYXRlX2Nv ZGUKICN1bmRlZiB2ZXJpZnlfY29kZQogCisvKiB0ZXN0LWNhc3QuYyAqLworI2RlZmluZSBjcmVh dGVfY29kZSBjcmVhdGVfY29kZV9jYXN0CisjZGVmaW5lIHZlcmlmeV9jb2RlIHZlcmlmeV9jb2Rl X2Nhc3QKKyNpbmNsdWRlICJ0ZXN0LWNhc3QuYyIKKyN1bmRlZiBjcmVhdGVfY29kZQorI3VuZGVm IHZlcmlmeV9jb2RlCisKIC8qIHRlc3QtY29tcG91bmQtYXNzaWdubWVudC5jICovCiAjZGVmaW5l IGNyZWF0ZV9jb2RlIGNyZWF0ZV9jb2RlX2NvbXBvdW5kX2Fzc2lnbm1lbnQKICNkZWZpbmUgdmVy aWZ5X2NvZGUgdmVyaWZ5X2NvZGVfY29tcG91bmRfYXNzaWdubWVudApAQCAtMzYxLDYgKzM2OCw5 IEBAIGNvbnN0IHN0cnVjdCB0ZXN0Y2FzZSB0ZXN0Y2FzZXNbXSA9IHsKICAgeyJjYWxsaW5nX2lu dGVybmFsX2Z1bmN0aW9uIiwKICAgIGNyZWF0ZV9jb2RlX2NhbGxpbmdfaW50ZXJuYWxfZnVuY3Rp b24sCiAgICB2ZXJpZnlfY29kZV9jYWxsaW5nX2ludGVybmFsX2Z1bmN0aW9ufSwKKyAgeyJjYXN0 IiwKKyAgIGNyZWF0ZV9jb2RlX2Nhc3QsCisgICB2ZXJpZnlfY29kZV9jYXN0fSwKICAgeyJjb21w b3VuZF9hc3NpZ25tZW50IiwKICAgIGNyZWF0ZV9jb2RlX2NvbXBvdW5kX2Fzc2lnbm1lbnQsCiAg ICB2ZXJpZnlfY29kZV9jb21wb3VuZF9hc3NpZ25tZW50fSwKZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvaml0LmRnL3Rlc3QtY2FzdC5jIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1jYXN0 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJiMWUzODVhZTQwCi0t LSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1jYXN0LmMKQEAgLTAs MCArMSw2NiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5j bHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJnY2NqaXQuaCIKKworI2luY2x1ZGUgImhh cm5lc3MuaCIKKwordm9pZAorY3JlYXRlX2NvZGUgKGdjY19qaXRfY29udGV4dCAqY3R4dCwgdm9p ZCAqdXNlcl9kYXRhKQoreworICAvKiBMZXQncyB0cnkgdG8gaW5qZWN0IHRoZSBlcXVpdmFsZW50 IG9mOgorY2hhcgorbXlfY2FzdHMgKGludCB4KQoreworICAgcmV0dXJuIChjaGFyKShsb25nKSB4 OworfQorICAgKi8KKyAgZ2NjX2ppdF90eXBlICppbnRfdHlwZSA9CisgICAgZ2NjX2ppdF9jb250 ZXh0X2dldF90eXBlIChjdHh0LCBHQ0NfSklUX1RZUEVfSU5UKTsKKyAgZ2NjX2ppdF90eXBlICps b25nX3R5cGUgPQorICAgIGdjY19qaXRfY29udGV4dF9nZXRfdHlwZSAoY3R4dCwgR0NDX0pJVF9U WVBFX0xPTkcpOworICBnY2Nfaml0X3R5cGUgKnJldHVybl90eXBlID0KKyAgICBnY2Nfaml0X2Nv bnRleHRfZ2V0X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQRV9DSEFSKTsKKworICBnY2Nfaml0X3Bh cmFtICp4ID0KKyAgICBnY2Nfaml0X2NvbnRleHRfbmV3X3BhcmFtICgKKyAgICAgIGN0eHQsCisg ICAgICBOVUxMLAorICAgICAgaW50X3R5cGUsICJ4Iik7CisgIGdjY19qaXRfcGFyYW0gKnBhcmFt c1sxXSA9IHt4fTsKKyAgZ2NjX2ppdF9mdW5jdGlvbiAqZnVuYyA9CisgICAgZ2NjX2ppdF9jb250 ZXh0X25ld19mdW5jdGlvbiAoY3R4dCwKKwkJCQkgIE5VTEwsCisJCQkJICBHQ0NfSklUX0ZVTkNU SU9OX0VYUE9SVEVELAorCQkJCSAgcmV0dXJuX3R5cGUsCisJCQkJICAibXlfY2FzdHMiLAorCQkJ CSAgMSwgcGFyYW1zLCAwKTsKKworICBnY2Nfaml0X2Jsb2NrICppbml0aWFsID0KKyAgICBnY2Nf aml0X2Z1bmN0aW9uX25ld19ibG9jayAoZnVuYywgImluaXRpYWwiKTsKKworICBnY2Nfaml0X2Js b2NrX2VuZF93aXRoX3JldHVybihpbml0aWFsLCBOVUxMLAorICAgIGdjY19qaXRfY29udGV4dF9u ZXdfY2FzdChjdHh0LAorICAgICAgICBOVUxMLAorICAgICAgICBnY2Nfaml0X2NvbnRleHRfbmV3 X2Nhc3QoY3R4dCwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICBnY2Nfaml0X3BhcmFt X2FzX3J2YWx1ZSh4KSwKKyAgICAgICAgICAgIGxvbmdfdHlwZQorICAgICAgICApLAorICAgICAg ICByZXR1cm5fdHlwZQorICAgICkpOworfQorCit2b2lkCit2ZXJpZnlfY29kZSAoZ2NjX2ppdF9j b250ZXh0ICpjdHh0LCBnY2Nfaml0X3Jlc3VsdCAqcmVzdWx0KQoreworICB0eXBlZGVmIGludCAo Km15X2Nhc3RzX2ZuX3R5cGUpIChpbnQpOworICBDSEVDS19OT05fTlVMTCAocmVzdWx0KTsKKyAg bXlfY2FzdHNfZm5fdHlwZSBteV9jYXN0cyA9CisgICAgKG15X2Nhc3RzX2ZuX3R5cGUpZ2NjX2pp dF9yZXN1bHRfZ2V0X2NvZGUgKHJlc3VsdCwgIm15X2Nhc3RzIik7CisgIENIRUNLX05PTl9OVUxM IChteV9jYXN0cyk7CisgIGNoYXIgdmFsID0gbXlfY2FzdHMgKDEwKTsKKyAgbm90ZSAoIm15X2Nh c3RzIHJldHVybmVkOiAlZCIsIHZhbCk7CisgIENIRUNLX1ZBTFVFICh2YWwsIDEwKTsKK30KLS0g CjIuMzEuMQoK --=-hN7UchwPTVvgnKuOOX6f--