From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by sourceware.org (Postfix) with ESMTPS id D13893858C74 for ; Sun, 14 May 2023 15:36:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D13893858C74 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-96649b412easo1464110166b.0 for ; Sun, 14 May 2023 08:36:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684078570; x=1686670570; h=mime-version:subject:references:in-reply-to:message-id:cc:to:from :date:from:to:cc:subject:date:message-id:reply-to; bh=Jjjr6teTExiDHGy3SGbvd/SP6uV3viYgSHXVX8x+NYY=; b=dqyvuQt5n9zGI8QS50ThNqcy5UoE/rtqzzvL5ytn6Uucjriy8IepgMdkaEVwxAxrHt +ogWhO9tBADPL7aoyY7yqROSAZhgsD1JYvv7dGGjjl5cnYaiedWCgoFBgqAOI4Asx5EM RbFzZtG0YAelVfsB16IyfZnmQViUbxXM86DM2Ry5fa8FYGjxRervGGVEbjWPfnkgYCV1 SyOAjzX+4PQ5Y7SCviTdakZbAXs5HW/22GzwjTROXZ+r96U5Cx/zShPb1z0HCFm7bbzZ 6gEh1TV6gLwQ/orgrqqHOz9etLI1gsvTBkqoX5tif1O+fZKXnIWXeuFcNPIXJThq671K 0HRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684078570; x=1686670570; h=mime-version:subject:references:in-reply-to:message-id:cc:to:from :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Jjjr6teTExiDHGy3SGbvd/SP6uV3viYgSHXVX8x+NYY=; b=TG0sWjpCqeWT4qKshhfNkP5xXmlRNapsfRpMk0hRAtNvT5X+oSpC7km+Axd3kNVpre LR62BzAFWwXsLMdYNSrxGvFOLPpyDYFrONX5cJtmIWHwf8hzFidpsBI/2pA0LOfWKZvs M6JFtpuaBLijh0bo2IFWV1AC2+ttqyJK6BT7nZ66W6aBgX39yqYCzBaTUMolyFvGNfOv CL0IzM1vjK9gDvIA60J7zaMshm6X1lpO1gnfocSzIuecXOMbc2LB9PoHe0PWX6S61Zt5 F43J1cjYnkT2umHTA9WgDlVEKoWx1X27rAJ3Bx1pCEnR+vNX5kxsuWfKWygCYFXXnHBQ Ss8g== X-Gm-Message-State: AC+VfDzRpQyXCenQHkasewUZ46oXYjC81KpSwg0plnUtk2UFx4xjLK7t NcJ+AM+rKc65J/Ny178LzKq7rh2oomo= X-Google-Smtp-Source: ACHHUZ7Gh0J3XOKdE1emTngE1/SaEqMXktKvNOF30ieppCERYMTHJqQk3x3Tdie1Y+Yf2/9MsjTsdA== X-Received: by 2002:a17:907:3d86:b0:967:5c5f:e45c with SMTP id he6-20020a1709073d8600b009675c5fe45cmr22368781ejc.0.1684078570198; Sun, 14 May 2023 08:36:10 -0700 (PDT) Received: from miso-desktop (ip-89-103-182-68.bb.vodafone.cz. [89.103.182.68]) by smtp.gmail.com with ESMTPSA id kw3-20020a170907770300b0096621c999c6sm8238144ejc.79.2023.05.14.08.36.09 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 May 2023 08:36:09 -0700 (PDT) Date: Sun, 14 May 2023 17:36:08 +0200 From: =?utf-8?Q?Michal_Jankovi=C4=8D?= To: Iain Sandoe Cc: GCC Patches Message-ID: <412A866E-BE4E-4DA8-A10E-4410C01FB9FF@getmailspring.com> In-Reply-To: References: Subject: Re: [PATCH] c++: coroutines - Overlap variables in frame [PR105989] X-Mailer: Mailspring MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="6460ffe8_1639ffe3_82ded" X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: --6460ffe8_1639ffe3_82ded Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Rebased the patch to GCC 14 trunk. Bootstrapped and regression tested again on x86=5F64-pc-linux-gnu, only difference is the new test failing without the patch. On Jul 13 2022, at 2:54 pm, Michal Jankovic wrote: > Hi Iain, > =20 > thanks for the info. I have some follow-up questions. > =20 > On Jul 12 2022, at 7:11 pm, Iain Sandoe wrote: > =20 >> Hi Michal, >> =20 >>> On 12 Jul 2022, at 16:14, Michal Jankovi=C4=8D >>> wrote: >> =20 >>> One other related thing I would like to investigate is reducing the >>> number of compiler generated variables in the frame, particularly >>> =5FCoro=5Fdestroy=5Ffn and =5FCoro=5Fself=5Fhandle. =20 >>> =20 >>> As I understand it, =5FCoro=5Fdestroy=5Ffn just sets a flag in >>> =5FCoro=5Fresume=5Findex and calls =5FCoro=5Fresume=5Ffn; it should b= e possible to >>> move this logic to =5F=5Fbuiltin=5Fcoro=5Fdestroy, so that only =5FCo= ro=5Fresume=5Ffn >>> is stored in the frame; >> =20 >> That is a particular point about GCC=E2=80=99s implementation =E2=80=A6= (it is not >> neccesarily, or even >> likely to be the same for other implementations) - see below. >> =20 >> I was intending to do experiment with making the ramp/resume/destroy >> value a parameter >> to the actor function so that we would have something like - >> =20 >> ramp calls actor(frame, 0) >> resume calls actor(frame, 1) >> destroy calls actor(frame, 2) =20 >> - the token values are illustrative, not intended to be a final versio= n. >> =20 >> I think that should allow for more inlining opportunites and possibly >> a way forward to >> frame elision (a.k.a halo). >> =20 >>> this would however change the coroutine ABI - I don't know if that's >>> a problem. >> =20 >> The external ABI for the coroutine is the =20 >> resume, >> destroy pointers =20 >> and the promise =20 >> and that one can find each of these from the frame pointer. >> =20 >> This was agreed between the interested =E2=80=9Cvendors=E2=80=9D so th= at one compiler >> could invoke >> coroutines built by another. So I do not think this is so much a >> useful area to explore. >> =20 > =20 > I understand. I still want to try to implement a more light-weight fram= e > layout with just one function pointer; would it be possible to merge > such a change if it was made opt-in via a compiler flag, eg > =60-fsmall-coroutine-frame=60=3F My use-case for this is embedded envir= onments > with very limited memory, and I do not care about interoperability with= > other compilers there. =20 > =20 >> Also the intent is that an indirect call through the frame pointer is >> the most frequent >> operation so should be the most efficient. =20 >> resume() might be called many times, =20 >> destroy() just once thus it is a cold code path =20 >> - space can be important too - but interoperability was the goal here= . >> =20 >>> The =5FCoro=5Fself=5Fhandle should be constructible on-demand from th= e >>> frame address. >> =20 >> Yes, and in the header the relevant items are all constexpr - so that >> should happen in the >> user=E2=80=99s code. I elected to have that value in the frame to avo= id >> recreating it each time - I >> suppose that is a trade-off of one oiptimisation c.f. another =E2=80=A6= =20 > =20 > If the handle construction cannot be optimized out, and its thus =20 > a tradeoff between frame size and number of instructions, then this > could also be enabled by a hypothetical =60-fsmall-coroutine-frame=60. > =20 > Coming back to this: > =20 >>>> (the other related optimisation is to eliminate frame entries for >>>> scopes without any suspend >>>> points - which has the potential to save even more space for code wi= th >>>> sparse use of co=5Fxxxx) > =20 > This would be nice; although it could encompassed by a more general =20 > optimization - eliminate frame entries for all variables which are not > =20 > accessed (directly or via pointer / reference) beyond a suspend point. > To be fair, I do not know how to get started on such an optimization, > or if it is even possible to do on the frontend. This would however be > immensely useful for reducing the frame size taken-up by complicated > co=5Fawait expressions (among other things), for example, if I have a > composed operation: > =20 > co=5Fawait when=5Feither(get=5Fleaf=5Fawaitable=5F1(), get=5Fleaf=5Fawa= itable=5F2()); > =20 > Right now, this creates space in the frame for the temporary 'leaf' =20 > awaitables, which were already moved into the composed awaitable. > If the awaitable has an operator co=5Fawait that returns the real await= er, > the original awaitable is also stored in the frame, even if it =20 > is not referenced by the awaiter; another unused object gets stored if > =20 > the .await=5Ftransform() customization point was used. > =20 > What are your thoughts on the feasibility / difficulty of implementing > such an optimization=3F > =20 > Michal > =20 >>> =20 >>> Do you have any advice / opinions on this before I try to implement i= t=3F >> =20 >> Hopefully, the notes above help. >> =20 >> I will rebase my latest code changes as soon as I have a chance and >> put them somewhere >> for you to look at - basically, these are to try and address the >> correctness issues we face, >> =20 >> Iain >> =20 >> =20 >>> =20 >>> Michal >>> =20 >>> On Jul 12 2022, at 4:08 pm, Iain Sandoe wrote: >>> =20 >>>> Hi Michal, >>>> =20 >>>>> On 12 Jul 2022, at 14:35, Michal Jankovi=C4=8D via Gcc-patches >>>>> wrote: >>>>> =20 >>>>> Currently, coroutine frames store all variables of a coroutine sepa= rately, >>>>> even if their lifetime does not overlap (they are in distinct >>>>> scopes). This >>>>> patch implements overlapping distinct variable scopes in the >>>>> coroutine frame, >>>>> by storing the frame fields in nested unions of structs. This lower= s >>>>> the size >>>>> of the frame for larger coroutines significantly, and makes them >>>>> more usable >>>>> on systems with limited memory. >>>> =20 >>>> not a review (I will try to take a look at the weekend). >>>> =20 >>>> but =E2=80=A6 this is one of the two main optimisations on my TODO -= so cool >>>> for doing it. >>>> =20 >>>> (the other related optimisation is to eliminate frame entries for >>>> scopes without any suspend >>>> points - which has the potential to save even more space for code wi= th >>>> sparse use of co=5Fxxxx) >>>> =20 >>>> Iain >>>> =20 >>>>> Bootstrapped and regression tested on x86=5F64-pc-linux-gnu; new >>>>> test fails >>>>> before the patch and succeeds after with no regressions. >>>>> =20 >>>>> PR c++/105989 >>>>> =20 >>>>> gcc/cp/ChangeLog: >>>>> =20 >>>>> * coroutines.cc (struct local=5Fvar=5Finfo): Add field=5Faccess=5F= path. >>>>> (build=5Flocal=5Fvar=5Fframe=5Faccess=5Fexpr): New. >>>>> (transform=5Flocal=5Fvar=5Fuses): Use build=5Flocal=5Fvar=5Fframe=5F= access=5Fexpr. >>>>> (coro=5Fmake=5Fframe=5Fentry=5Fid): New. >>>>> (coro=5Fmake=5Fframe=5Fentry): Delegate to coro=5Fmake=5Fframe=5Fe= ntry=5Fid. >>>>> (struct local=5Fvars=5Fframe=5Fdata): Add orig, field=5Faccess=5Fp= ath. >>>>> (register=5Flocal=5Fvar=5Fuses): Generate new frame layout. Create= access >>>>> paths to vars. >>>>> (morph=5Ffn=5Fto=5Fcoro): Set new fields in local=5Fvars=5Fframe=5F= data. =20 >>>>> =20 >>>>> gcc/testsuite/ChangeLog: >>>>> =20 >>>>> * g++.dg/coroutines/pr105989.C: New test. >>>>> =20 >>>>> >>>> =20 >>>> =20 >> =20 >> =20 > --6460ffe8_1639ffe3_82ded Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pr105989.patch" ZGlmZiAtLWdpdCBhL2djYy9jcC9jb3JvdXRpbmVzLmNjIGIvZ2NjL2NwL2Nvcm91dGluZXMuY2MK aW5kZXggNTlhMjQwZWJkNDAuLmQ5NjVhZmRkM2RjIDEwMDY0NAotLS0gYS9nY2MvY3AvY29yb3V0 aW5lcy5jYworKysgYi9nY2MvY3AvY29yb3V0aW5lcy5jYwpAQCAtMjAwNyw2ICsyMDA3LDcgQEAg c3RydWN0IGxvY2FsX3Zhcl9pbmZvCiAgIGJvb2wgaXNfc3RhdGljOwogICBib29sIGhhc192YWx1 ZV9leHByX3A7CiAgIGxvY2F0aW9uX3QgZGVmX2xvYzsKKyAgdmVjPHRyZWUsIHZhX2djPiAqZmll bGRfYWNjZXNzX3BhdGg7CiB9OwogCiAvKiBGb3IgZmlndXJpbmcgb3V0IHdoYXQgbG9jYWwgdmFy aWFibGUgdXNhZ2Ugd2UgaGF2ZS4gICovCkBAIC0yMDE5LDYgKzIwMjAsMjYgQEAgc3RydWN0IGxv Y2FsX3ZhcnNfdHJhbnNmb3JtCiAgIGhhc2hfbWFwPHRyZWUsIGxvY2FsX3Zhcl9pbmZvPiAqbG9j YWxfdmFyX3VzZXM7CiB9OwogCisvKiBCdWlsZCBhIENPTVBPTkVOVF9SRUYgY2hhaW4gZm9yIGFj Y2Vzc2luZyBhIG5lc3RlZCB2YXJpYWJsZSBpbiB0aGUgY29yb3V0aW5lCisgICBmcmFtZS4gICov CitzdGF0aWMgdHJlZQorYnVpbGRfbG9jYWxfdmFyX2ZyYW1lX2FjY2Vzc19leHByIChsb2NhbF92 YXJzX3RyYW5zZm9ybSAqbHZ0LAorCQkJCSAgIGxvY2FsX3Zhcl9pbmZvICpsb2NhbF92YXIpCit7 CisgIHRyZWUgYWNjZXNzX2V4cHIgPSBsdnQtPmFjdG9yX2ZyYW1lOworCisgIGZvciAodHJlZSBw YXRoX2VsZW1faWQgOiAqbG9jYWxfdmFyLT5maWVsZF9hY2Nlc3NfcGF0aCkKKyAgICB7CisgICAg ICB0cmVlIHBhdGhfZWxlbV9tZW1iZXIgPSBsb29rdXBfbWVtYmVyICgKKwlUUkVFX1RZUEUgKGFj Y2Vzc19leHByKSwgcGF0aF9lbGVtX2lkLCAxLCAwLCB0Zl93YXJuaW5nX29yX2Vycm9yKTsKKyAg ICAgIGFjY2Vzc19leHByID0gYnVpbGQzX2xvYyAoCisJbHZ0LT5sb2MsIENPTVBPTkVOVF9SRUYs IFRSRUVfVFlQRSAocGF0aF9lbGVtX21lbWJlciksCisJYWNjZXNzX2V4cHIsIHBhdGhfZWxlbV9t ZW1iZXIsIE5VTExfVFJFRSk7CisgICAgfQorCisgIHJldHVybiBhY2Nlc3NfZXhwcjsKK30KKwog c3RhdGljIHRyZWUKIHRyYW5zZm9ybV9sb2NhbF92YXJfdXNlcyAodHJlZSAqc3RtdCwgaW50ICpk b19zdWJ0cmVlLCB2b2lkICpkKQogewpAQCAtMjA1MCwxMiArMjA3MSw3IEBAIHRyYW5zZm9ybV9s b2NhbF92YXJfdXNlcyAodHJlZSAqc3RtdCwgaW50ICpkb19zdWJ0cmVlLCB2b2lkICpkKQogCSAg aWYgKGxvY2FsX3Zhci5maWVsZF9pZCA9PSBOVUxMX1RSRUUpCiAJICAgIGNvbnRpbnVlOyAvKiBX YXNuJ3QgdXNlZC4gICovCiAKLQkgIHRyZWUgZmxkX3JlZgotCSAgICA9IGxvb2t1cF9tZW1iZXIg KGx2ZC0+Y29yb19mcmFtZV90eXBlLCBsb2NhbF92YXIuZmllbGRfaWQsCi0JCQkgICAgIC8qcHJv dGVjdD0qLzEsIC8qd2FudF90eXBlPSovMCwKLQkJCSAgICAgdGZfd2FybmluZ19vcl9lcnJvcik7 Ci0JICB0cmVlIGZsZF9pZHggPSBidWlsZDMgKENPTVBPTkVOVF9SRUYsIFRSRUVfVFlQRSAobHZh ciksCi0JCQkJIGx2ZC0+YWN0b3JfZnJhbWUsIGZsZF9yZWYsIE5VTExfVFJFRSk7CisJICB0cmVl IGZsZF9pZHggPSBidWlsZF9sb2NhbF92YXJfZnJhbWVfYWNjZXNzX2V4cHIgKGx2ZCwgJmxvY2Fs X3Zhcik7CiAJICBsb2NhbF92YXIuZmllbGRfaWR4ID0gZmxkX2lkeDsKIAkgIFNFVF9ERUNMX1ZB TFVFX0VYUFIgKGx2YXIsIGZsZF9pZHgpOwogCSAgREVDTF9IQVNfVkFMVUVfRVhQUl9QIChsdmFy KSA9IHRydWU7CkBAIC0zODg0LDE0ICszOTAwLDI0IEBAIGFuYWx5emVfZm5fcGFybXMgKHRyZWUg b3JpZykKIC8qIFNtYWxsIGhlbHBlciBmb3IgdGhlIHJlcGV0aXRpdmUgdGFzayBvZiBhZGRpbmcg YSBuZXcgZmllbGQgdG8gdGhlIGNvcm8KICAgIGZyYW1lIHR5cGUuICAqLwogCitzdGF0aWMgdm9p ZAorY29yb19tYWtlX2ZyYW1lX2VudHJ5X2lkICh0cmVlICpmaWVsZF9saXN0LCB0cmVlIGlkLCB0 cmVlIGZsZF90eXBlLAorCQkJICBsb2NhdGlvbl90IGxvYykKK3sKKyAgdHJlZSBkZWNsID0gYnVp bGRfZGVjbCAobG9jLCBGSUVMRF9ERUNMLCBpZCwgZmxkX3R5cGUpOworICBERUNMX0NIQUlOIChk ZWNsKSA9ICpmaWVsZF9saXN0OworICAqZmllbGRfbGlzdCA9IGRlY2w7Cit9CisKKy8qIFNhbWUg YXMgY29yb19tYWtlX2ZyYW1lX2VudHJ5X2lkLCBidXQgY3JlYXRlcyBhbiBpZGVudGlmaWVyIGZy b20gc3RyaW5nLiAgKi8KKwogc3RhdGljIHRyZWUKIGNvcm9fbWFrZV9mcmFtZV9lbnRyeSAodHJl ZSAqZmllbGRfbGlzdCwgY29uc3QgY2hhciAqbmFtZSwgdHJlZSBmbGRfdHlwZSwKIAkJICAgICAg IGxvY2F0aW9uX3QgbG9jKQogewogICB0cmVlIGlkID0gZ2V0X2lkZW50aWZpZXIgKG5hbWUpOwot ICB0cmVlIGRlY2wgPSBidWlsZF9kZWNsIChsb2MsIEZJRUxEX0RFQ0wsIGlkLCBmbGRfdHlwZSk7 Ci0gIERFQ0xfQ0hBSU4gKGRlY2wpID0gKmZpZWxkX2xpc3Q7Ci0gICpmaWVsZF9saXN0ID0gZGVj bDsKKyAgY29yb19tYWtlX2ZyYW1lX2VudHJ5X2lkIChmaWVsZF9saXN0LCBpZCwgZmxkX3R5cGUs IGxvYyk7CisKICAgcmV0dXJuIGlkOwogfQogCkBAIC0zOTA1LDYgKzM5MzEsOCBAQCBzdHJ1Y3Qg bG9jYWxfdmFyc19mcmFtZV9kYXRhCiAgIGxvY2F0aW9uX3QgbG9jOwogICBib29sIHNhd19jYXB0 dXJlOwogICBib29sIGxvY2FsX3Zhcl9zZWVuOworICB0cmVlIG9yaWc7CisgIHZlYzx0cmVlLCB2 YV9nYz4gKmZpZWxkX2FjY2Vzc19wYXRoOwogfTsKIAogLyogQSB0cmVlLXdhbGsgY2FsbGJhY2sg dGhhdCBwcm9jZXNzZXMgb25lIGJpbmQgZXhwcmVzc2lvbiBub3RpbmcgbG9jYWwKQEAgLTM5MjMs NiArMzk1MSwyMSBAQCByZWdpc3Rlcl9sb2NhbF92YXJfdXNlcyAodHJlZSAqc3RtdCwgaW50ICpk b19zdWJ0cmVlLCB2b2lkICpkKQogCiAgIGlmIChUUkVFX0NPREUgKCpzdG10KSA9PSBCSU5EX0VY UFIpCiAgICAgeworICAgICAgdHJlZSBzY29wZV9maWVsZF9pZCA9IE5VTExfVFJFRTsKKyAgICAg IGlmIChsdmQtPm5lc3RfZGVwdGggIT0gMCkKKwl7CisJICAvKiBDcmVhdGUgaWRlbnRpZmllciB1 bmRlciB3aGljaCBmaWVsZHMgZm9yIHRoaXMgYmluZC1leHByZXNzaW9uIHdpbGwKKwkgICAgIGJl IGFjY2Vzc2VkLiAgKi8KKwkgIGNoYXIgKnNjb3BlX2ZpZWxkX25hbWUKKwkgICAgPSB4YXNwcmlu dGYgKCJfU2NvcGUldV8ldSIsIGx2ZC0+bmVzdF9kZXB0aCwgbHZkLT5iaW5kX2luZHgpOworCSAg c2NvcGVfZmllbGRfaWQgPSBnZXRfaWRlbnRpZmllciAoc2NvcGVfZmllbGRfbmFtZSk7CisJICBm cmVlIChzY29wZV9maWVsZF9uYW1lKTsKKworCSAgdmVjX3NhZmVfcHVzaCAobHZkLT5maWVsZF9h Y2Nlc3NfcGF0aCwgc2NvcGVfZmllbGRfaWQpOworCX0KKworICAgICAgdHJlZSBzY29wZV92YXJp YWJsZXMgPSBOVUxMX1RSRUU7CisKICAgICAgIHRyZWUgbHZhcjsKICAgICAgIHVuc2lnbmVkIHNl cmlhbCA9IDA7CiAgICAgICBmb3IgKGx2YXIgPSBCSU5EX0VYUFJfVkFSUyAoKnN0bXQpOyBsdmFy ICE9IE5VTEw7CkBAIC0zOTkxLDE3ICs0MDM0LDk5IEBAIHJlZ2lzdGVyX2xvY2FsX3Zhcl91c2Vz ICh0cmVlICpzdG10LCBpbnQgKmRvX3N1YnRyZWUsIHZvaWQgKmQpCiAKIAkgIC8qIFRPRE86IEZp Z3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGJ1aWxkIGEgbG9jYWwgdHlwZSB0aGF0IGhhcyBhbnkKIAkg ICAgIGV4Y2VzcyBhbGlnbm1lbnQgb3Igc2l6ZSBmcm9tIHRoZSBvcmlnaW5hbCBkZWNsLiAgKi8K LQkgIGxvY2FsX3Zhci5maWVsZF9pZCA9IGNvcm9fbWFrZV9mcmFtZV9lbnRyeSAobHZkLT5maWVs ZF9saXN0LCBidWYsCisKKwkgIGxvY2FsX3Zhci5maWVsZF9pZCA9IGNvcm9fbWFrZV9mcmFtZV9l bnRyeSAoJnNjb3BlX3ZhcmlhYmxlcywgYnVmLAogCQkJCQkJICAgICAgbHZ0eXBlLCBsdmQtPmxv Yyk7CiAJICBmcmVlIChidWYpOwogCSAgLyogV2UgZG9uJ3Qgd2FsayBhbnkgb2YgdGhlIGxvY2Fs IHZhciBzdWItdHJlZXMsIHRoZXkgd29uJ3QgY29udGFpbgogCSAgICAgYW55IGJpbmQgZXhwcnMu ICAqLworCisJICBsb2NhbF92YXIuZmllbGRfYWNjZXNzX3BhdGggPSBtYWtlX3RyZWVfdmVjdG9y X2NvcHkgKAorCSAgICBsdmQtPmZpZWxkX2FjY2Vzc19wYXRoKTsKKwkgIHZlY19zYWZlX3B1c2gg KGxvY2FsX3Zhci5maWVsZF9hY2Nlc3NfcGF0aCwgbG9jYWxfdmFyLmZpZWxkX2lkKTsKIAl9CisK KyAgICAgIHVuc2lnbmVkIGJpbmRfaW5keCA9IGx2ZC0+YmluZF9pbmR4OworICAgICAgdHJlZSog cGFyZW50X2ZpZWxkX2xpc3QgPSBsdmQtPmZpZWxkX2xpc3Q7CisKKyAgICAgIC8qIENvbGxlY3Qg dGhlIHNjb3BlIHN0cnVjdHMgb2YgY2hpbGQgYmluZC1leHByZXNzaW9ucyB3aGVuIHJlY3Vyc2lu Zy4gICovCisgICAgICB0cmVlIGNoaWxkX3Njb3BlcyA9IE5VTExfVFJFRTsKKyAgICAgIGx2ZC0+ ZmllbGRfbGlzdCA9ICZjaGlsZF9zY29wZXM7CisKKyAgICAgIC8qIENyZWF0ZSBpZGVudGlmaWVy IHVuZGVyIHdoaWNoIGZpZWxkcyBmb3IgY2hpbGQgYmluZC1leHByZXNzaW9ucyB3aWxsIGJlCisJ IGFjY2Vzc2VkLiAgKi8KKyAgICAgIGNoYXIgKmNoaWxkX3Njb3Blc19maWVsZF9uYW1lCisJPSB4 YXNwcmludGYgKCJfU2NvcGVfbGlzdCV1XyV1IiwgbHZkLT5uZXN0X2RlcHRoLCBiaW5kX2luZHgp OworICAgICAgdHJlZSBjaGlsZF9zY29wZXNfZmllbGRfaWQgPSBnZXRfaWRlbnRpZmllciAoY2hp bGRfc2NvcGVzX2ZpZWxkX25hbWUpOworICAgICAgZnJlZSAoY2hpbGRfc2NvcGVzX2ZpZWxkX25h bWUpOworCisgICAgICAvKiBSZWN1cnNlIHRvIGNoaWxkIGJpbmQgZXhwcmVzc2lvbnMuICAqLwog ICAgICAgbHZkLT5iaW5kX2luZHgrKzsKICAgICAgIGx2ZC0+bmVzdF9kZXB0aCsrOworICAgICAg dmVjX3NhZmVfcHVzaCAobHZkLT5maWVsZF9hY2Nlc3NfcGF0aCwgY2hpbGRfc2NvcGVzX2ZpZWxk X2lkKTsKICAgICAgIGNwX3dhbGtfdHJlZSAoJkJJTkRfRVhQUl9CT0RZICgqc3RtdCksIHJlZ2lz dGVyX2xvY2FsX3Zhcl91c2VzLCBkLCBOVUxMKTsKICAgICAgICpkb19zdWJ0cmVlID0gMDsgLyog V2UndmUgZG9uZSB0aGlzLiAgKi8KKyAgICAgIGx2ZC0+ZmllbGRfYWNjZXNzX3BhdGgtPnBvcCAo KTsKICAgICAgIGx2ZC0+bmVzdF9kZXB0aC0tOworCisgICAgICAvKiBSZXN0b3JlIHRoZSBwYXJl bnQgZmllbGQgbGlzdC4gICovCisgICAgICBsdmQtPmZpZWxkX2xpc3QgPSBwYXJlbnRfZmllbGRf bGlzdDsKKworICAgICAgaWYgKGNoaWxkX3Njb3BlcyAhPSBOVUxMX1RSRUUpCisJeworCSAgLyog Q3JlYXRlIGEgdW5pb24gdG8gaG91c2UgdGhlIGNoaWxkIHNjb3Blcywgc28gdGhhdCB0aGV5IGFy ZQorCSAgICAgb3ZlcmxhcHBlZCBpbiB0aGUgY29yb3V0aW5lIGZyYW1lLiAgKi8KKwkgIGNoYXIg KmNoaWxkX3Njb3Blc191bmlvbl9uYW1lX3N1ZmZpeAorCSAgICA9IHhhc3ByaW50ZiAoIkZyYW1l X3Njb3BlX2xpc3QldV8ldSIsIGx2ZC0+bmVzdF9kZXB0aCwgYmluZF9pbmR4KTsKKwkgIHRyZWUg Y2hpbGRfc2NvcGVzX3VuaW9uX25hbWUgPSBnZXRfZm5fbG9jYWxfaWRlbnRpZmllciAoCisJICAg IGx2ZC0+b3JpZywgY2hpbGRfc2NvcGVzX3VuaW9uX25hbWVfc3VmZml4KTsKKwkgIGZyZWUgKGNo aWxkX3Njb3Blc191bmlvbl9uYW1lX3N1ZmZpeCk7CisJICB0cmVlIGNoaWxkX3Njb3Blc191bmlv bgorCSAgICA9IHhyZWZfdGFnICh1bmlvbl90eXBlLCBjaGlsZF9zY29wZXNfdW5pb25fbmFtZSk7 CisJICBERUNMX0NPTlRFWFQgKFRZUEVfTkFNRSAoY2hpbGRfc2NvcGVzX3VuaW9uKSkgPSBjdXJy ZW50X3Njb3BlICgpOworCSAgY2hpbGRfc2NvcGVzX3VuaW9uID0gYmVnaW5fY2xhc3NfZGVmaW5p dGlvbiAoY2hpbGRfc2NvcGVzX3VuaW9uKTsKKwkgIFRZUEVfRklFTERTIChjaGlsZF9zY29wZXNf dW5pb24pID0gY2hpbGRfc2NvcGVzOworCSAgVFlQRV9CSU5GTyAoY2hpbGRfc2NvcGVzX3VuaW9u KSA9IG1ha2VfdHJlZV9iaW5mbyAoMCk7CisJICBCSU5GT19PRkZTRVQgKFRZUEVfQklORk8gKGNo aWxkX3Njb3Blc191bmlvbikpID0gc2l6ZV96ZXJvX25vZGU7CisJICBCSU5GT19UWVBFIChUWVBF X0JJTkZPIChjaGlsZF9zY29wZXNfdW5pb24pKSA9IGNoaWxkX3Njb3Blc191bmlvbjsKKwkgIGNo aWxkX3Njb3Blc191bmlvbiA9IGZpbmlzaF9zdHJ1Y3QgKGNoaWxkX3Njb3Blc191bmlvbiwgTlVM TF9UUkVFKTsKKworCSAgLyogQWRkIGl0IHRvIHRoZSBjdXJyZW50IHNjb3BlIGZpZWxkcy4gICov CisJICBjb3JvX21ha2VfZnJhbWVfZW50cnlfaWQgKAorCSAgICAmc2NvcGVfdmFyaWFibGVzLCBj aGlsZF9zY29wZXNfZmllbGRfaWQsCisJICAgIGNoaWxkX3Njb3Blc191bmlvbiwgbHZkLT5sb2Mp OworCX0KKworICAgICAgaWYgKGx2ZC0+bmVzdF9kZXB0aCA9PSAwKQorCXsKKwkgIC8qIFRoZSBv dXRlcm1vc3Qgc2NvcGUgY29udGFpbnMgc3BlY2lhbCB2YXJpYWJsZXMsIGVtYmVkIHRoZW0gZGly ZWN0bHkKKwkgICAgIGluIHRoZSBjb3JvdXRpbmUgZnJhbWUgd2l0aG91dCBuZXN0aW5nLiAgKi8K KwkgICpsdmQtPmZpZWxkX2xpc3QgPSBzY29wZV92YXJpYWJsZXM7CisJfSBlbHNlCisJeworCSAg LyogQ3JlYXRlIGEgc3RydWN0IGZvciBob3VzaW5nIHRoZSB2YXJzIG9mIHRoaXMgYmluZC1leHBy CisJICAgICBpbiB0aGUgY29yb3V0aW5lIGZyYW1lLiAgKi8KKwkgIGNoYXIgKnNjb3BlX3N0cnVj dF9uYW1lX3N1ZmZpeAorCSAgICA9IHhhc3ByaW50ZiAoIkZyYW1lX3Njb3BlJXVfJXUiLCBsdmQt Pm5lc3RfZGVwdGgsIGJpbmRfaW5keCk7CisJICB0cmVlIHNjb3BlX3N0cnVjdF9uYW1lCisJICAg ID0gZ2V0X2ZuX2xvY2FsX2lkZW50aWZpZXIgKGx2ZC0+b3JpZywgc2NvcGVfc3RydWN0X25hbWVf c3VmZml4KTsKKwkgIGZyZWUgKHNjb3BlX3N0cnVjdF9uYW1lX3N1ZmZpeCk7CisJICB0cmVlIHNj b3BlX3N0cnVjdCA9IHhyZWZfdGFnIChyZWNvcmRfdHlwZSwgc2NvcGVfc3RydWN0X25hbWUpOwor CSAgREVDTF9DT05URVhUIChUWVBFX05BTUUgKHNjb3BlX3N0cnVjdCkpID0gY3VycmVudF9zY29w ZSAoKTsKKwkgIHNjb3BlX3N0cnVjdCA9IGJlZ2luX2NsYXNzX2RlZmluaXRpb24gKHNjb3BlX3N0 cnVjdCk7CisJICBUWVBFX0ZJRUxEUyAoc2NvcGVfc3RydWN0KSA9IHNjb3BlX3ZhcmlhYmxlczsK KwkgIFRZUEVfQklORk8gKHNjb3BlX3N0cnVjdCkgPSBtYWtlX3RyZWVfYmluZm8gKDApOworCSAg QklORk9fT0ZGU0VUIChUWVBFX0JJTkZPIChzY29wZV9zdHJ1Y3QpKSA9IHNpemVfemVyb19ub2Rl OworCSAgQklORk9fVFlQRSAoVFlQRV9CSU5GTyAoc2NvcGVfc3RydWN0KSkgPSBzY29wZV9zdHJ1 Y3Q7CisJICBzY29wZV9zdHJ1Y3QgPSBmaW5pc2hfc3RydWN0IChzY29wZV9zdHJ1Y3QsIE5VTExf VFJFRSk7CisKKwkgIC8qIEFkZCB0aGUgc2NvcGUgc3RydWN0IHRvIHRoZSBwYXJlbnQgZmllbGQg bGlzdC4gICovCisJICBjb3JvX21ha2VfZnJhbWVfZW50cnlfaWQgKHBhcmVudF9maWVsZF9saXN0 LCBzY29wZV9maWVsZF9pZCwKKwkJCQkgICAgc2NvcGVfc3RydWN0LAorCQkJCSAgICBsdmQtPmxv Yyk7CisKKwkgIGx2ZC0+ZmllbGRfYWNjZXNzX3BhdGgtPnBvcCAoKTsKKwl9CiAgICAgfQogICBy ZXR1cm4gTlVMTF9UUkVFOwogfQpAQCAtNDEwMSw3ICs0MjI2LDcgQEAgY29yb19yZXdyaXRlX2Z1 bmN0aW9uX2JvZHkgKGxvY2F0aW9uX3QgZm5fc3RhcnQsIHRyZWUgZm5ib2R5LCB0cmVlIG9yaWcs CiAgICAgICBmb3IgKHRyZWUgYiA9IEJMT0NLX1NVQkJMT0NLUyAocmVwbGFjZV9ibGspOyBiOyBi ID0gQkxPQ0tfQ0hBSU4gKGIpKQogCUJMT0NLX1NVUEVSQ09OVEVYVCAoYikgPSByZXBsYWNlX2Js azsKICAgICAgIEJJTkRfRVhQUl9CTE9DSyAoZmlyc3QpID0gcmVwbGFjZV9ibGs7Ci0gICAgICAv KiBUaGUgdG9wIGJsb2NrIGhhcyBvbmUgY2hpbGQsIHNvIGZhciwgYW5kIHdlIGhhdmUgbm93IGdv dCBhIAorICAgICAgLyogVGhlIHRvcCBibG9jayBoYXMgb25lIGNoaWxkLCBzbyBmYXIsIGFuZCB3 ZSBoYXZlIG5vdyBnb3QgYQogCSBzdXBlcmJsb2NrLiAgKi8KICAgICAgIEJMT0NLX1NVUEVSQ09O VEVYVCAocmVwbGFjZV9ibGspID0gdG9wX2Jsb2NrOwogICAgICAgQkxPQ0tfU1VCQkxPQ0tTICh0 b3BfYmxvY2spID0gcmVwbGFjZV9ibGs7CkBAIC00NTExLDcgKzQ2MzYsOCBAQCBtb3JwaF9mbl90 b19jb3JvICh0cmVlIG9yaWcsIHRyZWUgKnJlc3VtZXIsIHRyZWUgKmRlc3Ryb3llcikKICAgICAg d291bGQgZXhwZWN0IHRvIGRlbGV0ZSB1bnVzZWQgZW50cmllcyBsYXRlci4gICovCiAgIGhhc2hf bWFwPHRyZWUsIGxvY2FsX3Zhcl9pbmZvPiBsb2NhbF92YXJfdXNlczsKICAgbG9jYWxfdmFyc19m cmFtZV9kYXRhIGxvY2FsX3ZhcnNfZGF0YQotICAgID0geyZmaWVsZF9saXN0LCAmbG9jYWxfdmFy X3VzZXMsIDAsIDAsIGZuX3N0YXJ0LCBmYWxzZSwgZmFsc2V9OworICAgID0geyZmaWVsZF9saXN0 LCAmbG9jYWxfdmFyX3VzZXMsIDAsIDAsIGZuX3N0YXJ0LCBmYWxzZSwgZmFsc2UsIG9yaWcsCisg ICAgICAgbWFrZV90cmVlX3ZlY3RvciAoKX07CiAgIGNwX3dhbGtfdHJlZSAoJmZuYm9keSwgcmVn aXN0ZXJfbG9jYWxfdmFyX3VzZXMsICZsb2NhbF92YXJzX2RhdGEsIE5VTEwpOwogCiAgIC8qIFRp ZSBvZmYgdGhlIHN0cnVjdCBmb3Igbm93LCBzbyB0aGF0IHdlIGNhbiBidWlsZCBvZmZzZXRzIHRv IHRoZQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY29yb3V0aW5lcy9wcjEwNTk4 OS5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY29yb3V0aW5lcy9wcjEwNTk4OS5DCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jOGI5YmU2MzRhYQotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2Nvcm91dGluZXMvcHIxMDU5ODkuQwpAQCAtMCww ICsxLDEyNCBAQAorLy8gIHsgZGctZG8gcnVuIH0KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNp bmNsdWRlICJjb3JvLmgiCisKK3N0cnVjdCBwcm9taXNlOworCitzdHJ1Y3QgdGFzaworeworICBj b3JvOjpjb3JvdXRpbmVfaGFuZGxlPHByb21pc2U+IGhhbmRsZTsKKworICB+dGFzayAoKQorICB7 CisgICAgaWYgKGhhbmRsZSkKKyAgICAgIHsKKwloYW5kbGUuZGVzdHJveSAoKTsKKyAgICAgIH0K KyAgfQorfTsKKworc3RkOjpzaXplX3QgZnJhbWVfc2l6ZSA9IDB1OworCitzdHJ1Y3QgcHJvbWlz ZQoreworICBjb3JvOjpjb3JvdXRpbmVfaGFuZGxlPD4gY29udGludWF0aW9uID0gY29ybzo6bm9v cF9jb3JvdXRpbmUgKCk7CisKKyAgYXV0byBnZXRfcmV0dXJuX29iamVjdCAoKSBub2V4Y2VwdAor ICB7CisgICAgcmV0dXJuIHRhc2t7Y29ybzo6Y29yb3V0aW5lX2hhbmRsZTxwcm9taXNlPjo6ZnJv bV9wcm9taXNlICgqdGhpcyl9OworICB9CisKKyAgdm9pZCB1bmhhbmRsZWRfZXhjZXB0aW9uICgp IG5vZXhjZXB0IHt9CisKKyAgdm9pZCByZXR1cm5fdm9pZCAoKSB7fQorCisgIGF1dG8gaW5pdGlh bF9zdXNwZW5kICgpIG5vZXhjZXB0IHsgcmV0dXJuIGNvcm86OnN1c3BlbmRfYWx3YXlze307IH0K KworICBhdXRvIGZpbmFsX3N1c3BlbmQgKCkgbm9leGNlcHQKKyAgeworICAgIHN0cnVjdCBhd2Fp dGVyX3R5cGUgOiBjb3JvOjpzdXNwZW5kX2Fsd2F5cworICAgIHsKKyAgICAgIGF1dG8gYXdhaXRf c3VzcGVuZCAoY29ybzo6Y29yb3V0aW5lX2hhbmRsZSA8cHJvbWlzZT4gaGFuZGxlKSBub2V4Y2Vw dAorICAgICAgeworCXJldHVybiBoYW5kbGUucHJvbWlzZSAoKS5jb250aW51YXRpb247CisgICAg ICB9CisgICAgfTsKKworICAgIHJldHVybiBhd2FpdGVyX3R5cGV7fTsKKyAgfQorCisgIHZvaWQg KiBvcGVyYXRvciBuZXcgKHN0ZDo6c2l6ZV90IHNpemUpCisgIHsKKyAgICBmcmFtZV9zaXplID0g c2l6ZTsKKyAgICByZXR1cm4gbmV3IHN0ZDo6Ynl0ZVtzaXplXTsKKyAgfQorCisgIHZvaWQgb3Bl cmF0b3IgZGVsZXRlICh2b2lkICpwdHIsIHN0ZDo6c2l6ZV90IHNpemUpCisgIHsKKyAgICByZXR1 cm4gZGVsZXRlW10gc3RhdGljX2Nhc3Q8c3RkOjpieXRlICo+KHB0cik7CisgIH0KK307CisKK2F1 dG8gb3BlcmF0b3IgY29fYXdhaXQgKHRhc2sgJiZ0KQoreworICBzdHJ1Y3QgYXdhaXRlcl90eXBl IDogY29ybzo6c3VzcGVuZF9hbHdheXMKKyAgeworICAgIGNvcm86OmNvcm91dGluZV9oYW5kbGU8 cHJvbWlzZT4gaGFuZGxlOworCisgICAgYXV0byBhd2FpdF9zdXNwZW5kIChjb3JvOjpjb3JvdXRp bmVfaGFuZGxlPHByb21pc2U+IGNvbnRpbnVhdGlvbikKKyAgICB7CisgICAgICBoYW5kbGUucHJv bWlzZSAoKS5jb250aW51YXRpb24gPSBjb250aW51YXRpb247CisgICAgICByZXR1cm4gaGFuZGxl OworICAgIH0KKyAgfTsKKworICByZXR1cm4gYXdhaXRlcl90eXBle3t9LCB0LmhhbmRsZX07Cit9 CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitzdHJ1Y3QgY29ybzo6Y29yb3V0aW5lX3Ry YWl0czx0YXNrLCBBcmdzLi4uPgoreworICB1c2luZyBwcm9taXNlX3R5cGUgPSBwcm9taXNlOwor fTsKKworYXV0byBjb3JvXzMgKCkgLT4gdGFzaworeworICBjb19yZXR1cm47Cit9CisKK3N0ZDo6 Ynl0ZSAqYXJyX3B0ciA9IG51bGxwdHI7CisKK3Rhc2sgY29yb18yICgpCit7CisgIHsKKyAgICBz dGQ6OmJ5dGUgYXJyWzI1Nl07CisgICAgY29fYXdhaXQgY29yb18zICgpOworICAgIGFycl9wdHIg PSBhcnI7CisgIH0KKyAgeworICAgIHN0ZDo6Ynl0ZSBhcnJbMjU2XTsKKyAgICBjb19hd2FpdCBj b3JvXzMgKCk7CisgICAgYXJyX3B0ciA9IGFycjsKKyAgfQorfQorCit0YXNrIGNvcm9fMSAoKQor eworICBzdGQ6OmJ5dGUgYXJyWzI1Nl07CisgIGNvX2F3YWl0IGNvcm9fMyAoKTsKKyAgYXJyX3B0 ciA9IGFycjsKK30KKworaW50IG1haW4gKCkKK3sKKyAgY29yb18xICgpOworICBhdXRvIGZpcnN0 X2ZyYW1lX3NpemUgPSBmcmFtZV9zaXplOworICBjb3JvXzIgKCk7CisgIGF1dG8gc2Vjb25kX2Zy YW1lX3NpemUgPSBmcmFtZV9zaXplOworCisgIC8qIGNvcm9fMSBmcmFtZSBzaG91bGQgYmUgdGhl IHNhbWUgc2l6ZSBhcyBjb3JvXzIgZnJhbWUuICAqLworCisgIHJldHVybiBmaXJzdF9mcmFtZV9z aXplID09IHNlY29uZF9mcmFtZV9zaXplID8gMCA6IDE7Cit9Cg== --6460ffe8_1639ffe3_82ded--