From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13750 invoked by alias); 7 Oct 2011 05:23:17 -0000 Received: (qmail 13739 invoked by uid 22791); 7 Oct 2011 05:23:13 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-vx0-f175.google.com (HELO mail-vx0-f175.google.com) (209.85.220.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 07 Oct 2011 05:22:58 +0000 Received: by vcbfl17 with SMTP id fl17so3343137vcb.20 for ; Thu, 06 Oct 2011 22:22:57 -0700 (PDT) Received: by 10.52.179.2 with SMTP id dc2mr1025960vdc.97.1317964977221; Thu, 06 Oct 2011 22:22:57 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.150.13 with HTTP; Thu, 6 Oct 2011 22:22:37 -0700 (PDT) In-Reply-To: References: From: Artem Shinkarov Date: Fri, 07 Oct 2011 07:13:00 -0000 Message-ID: Subject: Re: New warning for expanded vector operations To: Richard Guenther Cc: GCC Patches Content-Type: multipart/mixed; boundary=bcaec5014a434b301404aeaea25a X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-10/txt/msg00547.txt.bz2 --bcaec5014a434b301404aeaea25a Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 6588 On Wed, Oct 5, 2011 at 12:35 PM, Richard Guenther wrote: > On Wed, Oct 5, 2011 at 1:28 PM, Artem Shinkarov > wrote: >> On Wed, Oct 5, 2011 at 9:40 AM, Richard Guenther >> wrote: >>> On Wed, Oct 5, 2011 at 12:18 AM, Artem Shinkarov >>> wrote: >>>> Hi >>>> >>>> Here is a patch to inform a programmer about the expanded vector opera= tion. >>>> Bootstrapped on x86-unknown-linux-gnu. >>>> >>>> ChangeLog: >>>> >>>> =A0 =A0 =A0 =A0* gcc/tree-vect-generic.c (expand_vector_piecewise): Ad= just to >>>> =A0 =A0 =A0 =A0 =A0produce the warning. >>>> =A0 =A0 =A0 =A0 =A0(expand_vector_parallel): Adjust to produce the war= ning. >>> >>> Entries start without gcc/, they are relative to the gcc/ChangeLog file. >> >> Sure, sorry. >> >>>> =A0 =A0 =A0 =A0 =A0(lower_vec_shuffle): Adjust to produce the warning. >>>> =A0 =A0 =A0 =A0* gcc/common.opt: New warning Wvector-operation-expande= d. >>>> =A0 =A0 =A0 =A0* gcc/doc/invoke.texi: Document the wawning. >>>> >>>> >>>> Ok? >>> >>> I don't like the name -Wvector-operation-expanded. =A0We emit a >>> similar warning for missed inline expansions with -Winline, so >>> maybe -Wvector-extensions (that's the name that appears >>> in the C extension documentation). >> >> Hm, I don't care much about the name, unless it gets clear what the >> warning is used for. =A0I am not really sure that Wvector-extensions >> makes it clear. =A0Also, I don't see anything bad if the warning will >> pop up during the vectorisation. Any vector operation performed >> outside the SIMD accelerator looks suspicious, because it actually >> doesn't improve performance. =A0Such a warning during the vectorisation >> could mean that a programmer forgot some flag, or the constant >> propagation failed to deliver a constant, or something else. >> >> Conceptually the text I am producing is not really a warning, it is >> more like an information, but I am not aware of the mechanisms that >> would allow me to introduce a flag triggering inform () or something >> similar. >> >> What I think we really need to avoid is including this warning in the >> standard Ox. >> >>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>> + >>> + =A0warning_at (loc, OPT_Wvector_operation_expanded, >>> + =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded piecewise"= ); >>> >>> =A0 v =3D VEC_alloc(constructor_elt, gc, (nunits + delta - 1) / delta); >>> =A0 for (i =3D 0; i < nunits; >>> @@ -260,6 +264,10 @@ expand_vector_parallel (gimple_stmt_iter >>> =A0 tree result, compute_type; >>> =A0 enum machine_mode mode; >>> =A0 int n_words =3D tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_PER= _WORD; >>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>> + >>> + =A0warning_at (loc, OPT_Wvector_operation_expanded, >>> + =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded in paralle= l"); >>> >>> what's the difference between 'piecewise' and 'in parallel'? >> >> Parallel is a little bit better for performance than piecewise. > > I see. =A0That difference should probably be documented, maybe with > an example. > > Richard. > >>> @@ -301,16 +309,15 @@ expand_vector_addition (gimple_stmt_iter >>> =A0{ >>> =A0 int parts_per_word =3D UNITS_PER_WORD >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 / tree_low_cst (TYPE_SIZE_U= NIT (TREE_TYPE (type)), 1); >>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>> >>> =A0 if (INTEGRAL_TYPE_P (TREE_TYPE (type)) >>> =A0 =A0 =A0 && parts_per_word >=3D 4 >>> =A0 =A0 =A0 && TYPE_VECTOR_SUBPARTS (type) >=3D 4) >>> - =A0 =A0return expand_vector_parallel (gsi, f_parallel, >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ty= pe, a, b, code); >>> + =A0 =A0return expand_vector_parallel (gsi, f_parallel, type, a, b, co= de); >>> =A0 else >>> - =A0 =A0return expand_vector_piecewise (gsi, f, >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 t= ype, TREE_TYPE (type), >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 a= , b, code); >>> + =A0 =A0return expand_vector_piecewise (gsi, f, type, >>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 T= REE_TYPE (type), a, b, code); >>> =A0} >>> >>> =A0/* Check if vector VEC consists of all the equal elements and >>> >>> unless i miss something loc is unused here. =A0Please avoid random >>> whitespace changes (just review your patch yourself before posting >>> and revert pieces that do nothing). >> >> Yes you are right, sorry. >> >>> +@item -Wvector-operation-expanded >>> +@opindex Wvector-operation-expanded >>> +@opindex Wno-vector-operation-expanded >>> +Warn if vector operation is not implemented via SIMD capabilities of t= he >>> +architecture. Mainly useful for the performance tuning. >>> >>> I'd mention that this is for vector operations as of the C extension >>> documented in "Vector Extensions". >>> >>> The vectorizer can produce some operations that will need further >>> lowering - we probably should make sure to _not_ warn about those. >>> Try running the vect.exp testsuite with the new warning turned on >>> (eventually disabling SSE), like with >>> >>> obj/gcc> make check-gcc >>> RUNTESTFLAGS=3D"--target_board=3Dunix/-Wvector-extensions/-mno-sse >>> vect.exp" >> >> Again, see the comment above. I think, if the warning can be triggered >> only manually, then we are fine. But I'll check anyway how many >> warnings I'll get from vect.exp. >> >>>> P.S. It is hard to write a reasonable testcase for the patch, because >>>> one needs to guess which architecture would expand a given vector >>>> operation. But the patch is trivial. >>> >>> You can create an aritificial large vector type for example, or put a >>> testcase under gcc.target/i386 and disable SSE. =A0We should have >>> a testcase for this. >> >> Yeah, disabling SSE should help. >> >> >> Thanks, >> Artem. >>> Thanks, >>> Richard. >>> >> > New version of the patch in the attachment with the test-cases. Bootstrapped on x86_64-apple-darwin10.8.0. Currently is being tested. Richard, I've checked the vect.exp case, as you suggested. It caused a lot of failures, but not because of the new warning. The main reason is -mno-sse. The target is capable to vectorize, so the dg option expects tests to pass, but the artificial option makes them fail. Checking the new warning on vect.exp without -mno-sse, it didn't cause any new failures. Anyway, we should be pretty much safe, cause the warning is not a part of -O3. Thanks, Artem. --bcaec5014a434b301404aeaea25a Content-Type: application/octet-stream; name="vector-op-warning-1.diff" Content-Disposition: attachment; filename="vector-op-warning-1.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gtgql5wt0 Content-length: 13176 SW5kZXg6IGdjYy9kb2MvaW52b2tlLnRleGkKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gZ2NjL2RvYy9pbnZva2UudGV4aQkocmV2aXNpb24gMTc5NjM2 KQorKysgZ2NjL2RvYy9pbnZva2UudGV4aQkod29ya2luZyBjb3B5KQpAQCAt MjcxLDcgKzI3MSw4IEBAIE9iamVjdGl2ZS1DIGFuZCBPYmplY3RpdmUtQysr IERpYWxlY3RzfS4KIC1XdW51c2VkLWxhYmVsICAtV3VudXNlZC1sb2NhbC10 eXBlZGVmcyAtV3VudXNlZC1wYXJhbWV0ZXIgQGdvbAogLVduby11bnVzZWQt cmVzdWx0IC1XdW51c2VkLXZhbHVlIEBnb2wgLVd1bnVzZWQtdmFyaWFibGUg QGdvbAogLVd1bnVzZWQtYnV0LXNldC1wYXJhbWV0ZXIgLVd1bnVzZWQtYnV0 LXNldC12YXJpYWJsZSBAZ29sCi0tV3ZhcmlhZGljLW1hY3JvcyAtV3ZsYSAt V3ZvbGF0aWxlLXJlZ2lzdGVyLXZhciAgLVd3cml0ZS1zdHJpbmdzfQorLVd2 YXJpYWRpYy1tYWNyb3MgLVd2ZWN0b3Itb3BlcmF0aW9uLXBlcmZvcm1hbmNl IC1XdmxhIAorLVd2b2xhdGlsZS1yZWdpc3Rlci12YXIgIC1Xd3JpdGUtc3Ry aW5nc30KIAogQGl0ZW0gQyBhbmQgT2JqZWN0aXZlLUMtb25seSBXYXJuaW5n IE9wdGlvbnMKIEBnY2NvcHRsaXN0ey1XYmFkLWZ1bmN0aW9uLWNhc3QgIC1X bWlzc2luZy1kZWNsYXJhdGlvbnMgQGdvbApAQCAtNDUzNSw2ICs0NTM2LDE4 IEBAIFdhcm4gaWYgdmFyaWFkaWMgbWFjcm9zIGFyZSB1c2VkIGluIHBlZGEK IGFsdGVybmF0ZSBzeW50YXggd2hlbiBpbiBwZWRhbnRpYyBJU08gQzk5IG1v ZGUuICBUaGlzIGlzIGRlZmF1bHQuCiBUbyBpbmhpYml0IHRoZSB3YXJuaW5n IG1lc3NhZ2VzLCB1c2UgQG9wdGlvbnstV25vLXZhcmlhZGljLW1hY3Jvc30u CiAKK0BpdGVtIC1XdmVjdG9yLW9wZXJhdGlvbi1wZXJmb3JtYW5jZQorQG9w aW5kZXggV3ZlY3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UKK0BvcGluZGV4 IFduby12ZWN0b3Itb3BlcmF0aW9uLXBlcmZvcm1hbmNlCitXYXJuIGlmIHZl Y3RvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkIHZpYSBTSU1EIGNh cGFiaWxpdGllcyBvZiB0aGUKK2FyY2hpdGVjdHVyZS4gIE1haW5seSB1c2Vm dWwgZm9yIHRoZSBwZXJmb3JtYW5jZSB0dW5pbmcuCitWZWN0b3Igb3BlcmF0 aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCBAY29kZXtwaWVjZXdpc2V9IHdoaWNo IG1lYW5zIHRoYXQgdGhlCitzY2FsYXIgb3BlcmF0aW9uIGlzIHBlcmZvcm1l ZCBvbiBldmVyeSB2ZWN0b3IgZWxlbWVudDsgCitAY29kZXtpbiBwYXJhbGxl bH0gd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmVjdG9yIG9wZXJhdGlvbiBpcyBp bXBsZW1lbnRlZAordXNpbmcgc2NhbGFycyBvZiB3aWRlciB0eXBlLCB3aGlj aCBub3JtYWxseSBpcyBtb3JlIHBlcmZvcm1hbmNlIGVmZmljaWVudDsKK2Fu ZCBAY29kZXthcyBhIHNpbmdsZSBzY2FsYXJ9IHdoaWNoIG1lYW5zIHRoYXQg dmVjdG9yIGZpdHMgaW50byBhCitzY2FsYXIgdHlwZS4KKwogQGl0ZW0gLVd2 bGEKIEBvcGluZGV4IFd2bGEKIEBvcGluZGV4IFduby12bGEKSW5kZXg6IGdj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVjdC1vcC0zLmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTMuYwkocmV2aXNpb24gMCkKKysr IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVjdC1vcC0z LmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICAqLworLyogeyBkZy1vcHRpb25zICItbW5vLXNzZSAtV3Zl Y3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UiIH0gICovCisjZGVmaW5lIHZl Y3RvcihlbGNvdW50LCB0eXBlKSAgXAorX19hdHRyaWJ1dGVfXygodmVjdG9y X3NpemUoKGVsY291bnQpKnNpemVvZih0eXBlKSkpKSB0eXBlCisKK2ludCBt YWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB2ZWN0b3IgKDgs IHNob3J0KSB2MCA9IHthcmdjLCAxLCAxNSwgMzgsIDEyLCAtMSwgYXJnYywg Mn07CisgIHZlY3RvciAoOCwgc2hvcnQpIHYxID0gey00LCBhcmdjLCAyLCAx MSwgMSwgMTcsIC04LCBhcmdjfTsKKyAgdmVjdG9yICg4LCBzaG9ydCkgcmVz W10gPSAKKyAgeworICAgIHYwICsgdjEsCSAgICAgIC8qIHsgZGctd2Fybmlu ZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgdjAgLSB2MSwg ICAgICAgICAgLyogeyBkZy13YXJuaW5nICJleHBhbmRlZCBpbiBwYXJhbGxl bCIgfSAgKi8KKyAgICB2MCA+IHYxLCAgICAgICAgICAvKiB7IGRnLXdhcm5p bmcgImV4cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8KKyAgICB2MCAmIHYxLCAg ICAgICAgICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIGluIHBhcmFsbGVs IiB9ICAqLworICAgIF9fYnVpbHRpbl9zaHVmZmxlICh2MCwgdjEpLAkgICAg ICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8K KyAgICBfX2J1aWx0aW5fc2h1ZmZsZSAodjAsIHYxLCB2MSkgICAgLyogeyBk Zy13YXJuaW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgIH07Cisg IAorICByZXR1cm4gcmVzW2FyZ2NdW2FyZ2NdOworfQpJbmRleDogZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTEuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni93YXJuLXZlY3Qtb3AtMS5jCShyZXZpc2lvbiAwKQorKysgZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTEuYwko cmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMSBAQAorLyogeyBkZy1kbyBjb21w aWxlIH0gICovCisvKiB7IGRnLW9wdGlvbnMgIi1tbm8tc3NlIC1XdmVjdG9y LW9wZXJhdGlvbi1wZXJmb3JtYW5jZSIgfSAgKi8KKyNkZWZpbmUgdmVjdG9y KGVsY291bnQsIHR5cGUpICBcCitfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6 ZSgoZWxjb3VudCkqc2l6ZW9mKHR5cGUpKSkpIHR5cGUKKworaW50IG1haW4g KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHZlY3RvciAoNCwgaW50 KSB2MCA9IHthcmdjLCAxLCAxNSwgMzh9OworICB2ZWN0b3IgKDQsIGludCkg djEgPSB7LTQsIGFyZ2MsIDIsIDExfTsKKyAgdmVjdG9yICg0LCBpbnQpIHJl c1tdID0gCisgIHsKKyAgICB2MCArIHYxLAkgIC8qIHsgZGctd2FybmluZyAi ZXhwYW5kZWQgcGllY2V3aXNlIiB9ICAqLworICAgIHYwIC0gdjEsCSAgLyog eyBkZy13YXJuaW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgICAg djAgPiB2MSwJICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBpZWNld2lz ZSIgfSAgKi8KKyAgICB2MCAmIHYxLAkgIC8qIHsgZGctd2FybmluZyAiZXhw YW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgX19idWlsdGluX3NodWZm bGUgKHYwLCB2MSksCSAgICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBp ZWNld2lzZSIgfSAgKi8KKyAgICBfX2J1aWx0aW5fc2h1ZmZsZSAodjAsIHYx LCB2MSkgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgcGllY2V3aXNlIiB9 ICAqLyAgCisgIH07CisKKyAgcmV0dXJuIHJlc1thcmdjXVthcmdjXTsKK30K SW5kZXg6IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVj dC1vcC0yLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTIuYwkocmV2aXNp b24gMCkKKysrIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4t dmVjdC1vcC0yLmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjMgQEAKKy8q IHsgZGctZG8gY29tcGlsZSB9ICAqLworLyogeyBkZy1vcHRpb25zICItbW5v LXNzZSAtV3ZlY3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UiIH0gICovCisj ZGVmaW5lIHZlY3RvcihlbGNvdW50LCB0eXBlKSAgXAorX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoKGVsY291bnQpKnNpemVvZih0eXBlKSkpKSB0eXBl CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB2 ZWN0b3IgKDE2LCBzaWduZWQgY2hhcikgdjAgPSB7YXJnYywgMSwgMTUsIDM4 LCAxMiwgLTEsIGFyZ2MsIDIsIAorCQkJCSBhcmdjLCAxLCAxNSwgMzgsIDEy LCAtMSwgYXJnYywgMn07CisgIHZlY3RvciAoMTYsIHNpZ25lZCBjaGFyKSB2 MSA9IHstNCwgYXJnYywgMiwgMTEsIDEsIDE3LCAtOCwgYXJnYywKKwkJCQkg YXJnYywgMSwgMTUsIDM4LCAxMiwgLTEsIGFyZ2MsIDJ9OworICB2ZWN0b3Ig KDE2LCBzaWduZWQgY2hhcikgcmVzW10gPSAKKyAgeworICAgIHYwICsgdjEs CQkgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0g ICovCisgICAgdjAgLSB2MSwgICAgICAgICAgICAgIC8qIHsgZGctd2Fybmlu ZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgdjAgPiB2MSwg ICAgICAgICAgICAgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgcGllY2V3 aXNlIiB9ICAqLworICAgIHYwICYgdjEsICAgICAgICAgICAgICAvKiB7IGRn LXdhcm5pbmcgImV4cGFuZGVkIGluIHBhcmFsbGVsIiB9ICAqLworICAgIF9f YnVpbHRpbl9zaHVmZmxlICh2MCwgdjEpLCAgICAgICAgLyogeyBkZy13YXJu aW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgICAgX19idWlsdGlu X3NodWZmbGUgKHYwLCB2MSwgdjEpICAgICAvKiB7IGRnLXdhcm5pbmcgImV4 cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8KKyAgfTsKKyAKKyAgcmV0dXJuIHJl c1thcmdjXVthcmdjXTsKK30KSW5kZXg6IGdjYy9jb21tb24ub3B0Cj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jb21tb24ub3B0CShyZXZpc2lv biAxNzk2MzYpCisrKyBnY2MvY29tbW9uLm9wdAkod29ya2luZyBjb3B5KQpA QCAtNjk0LDYgKzY5NCwxMCBAQCBXY292ZXJhZ2UtbWlzbWF0Y2gKIENvbW1v biBWYXIod2Fybl9jb3ZlcmFnZV9taXNtYXRjaCkgSW5pdCgxKSBXYXJuaW5n CiBXYXJuIGluIGNhc2UgcHJvZmlsZXMgaW4gLWZwcm9maWxlLXVzZSBkbyBu b3QgbWF0Y2gKIAorV3ZlY3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UKK0Nv bW1vbiBWYXIod2Fybl92ZWN0b3Jfb3BlcmF0aW9uX3BlcmZvcm1hbmNlKSBX YXJuaW5nCitXYXJuIHdoZW4gYSB2ZWN0b3Igb3BlcmF0aW9uIGlzIGNvbXBp bGVkIG91dHNpZGUgdGhlIFNJTUQKKwogWGFzc2VtYmxlcgogRHJpdmVyIFNl cGFyYXRlCiAKSW5kZXg6IGdjYy90cmVlLXZlY3QtZ2VuZXJpYy5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90cmVlLXZlY3QtZ2VuZXJpYy5j CShyZXZpc2lvbiAxNzk2MzYpCisrKyBnY2MvdHJlZS12ZWN0LWdlbmVyaWMu Ywkod29ya2luZyBjb3B5KQpAQCAtMjM1LDYgKzIzNSwxNCBAQCBleHBhbmRf dmVjdG9yX3BpZWNld2lzZSAoZ2ltcGxlX3N0bXRfaXRlCiAgIGludCBkZWx0 YSA9IHRyZWVfbG93X2NzdCAocGFydF93aWR0aCwgMSkKIAkgICAgICAvIHRy ZWVfbG93X2NzdCAoVFlQRV9TSVpFIChUUkVFX1RZUEUgKHR5cGUpKSwgMSk7 CiAgIGludCBpOworICBsb2NhdGlvbl90IGxvYyA9IGdpbXBsZV9sb2NhdGlv biAoZ3NpX3N0bXQgKCpnc2kpKTsKKworICBpZiAoZ2ltcGxlX2V4cHJfdHlw ZSAoZ3NpX3N0bXQgKCpnc2kpKSA9PSB0eXBlKQorICAgIHdhcm5pbmdfYXQg KGxvYywgT1BUX1d2ZWN0b3Jfb3BlcmF0aW9uX3BlcmZvcm1hbmNlLAorCQki dmVjdG9yIG9wZXJhdGlvbiB3aWxsIGJlIGV4cGFuZGVkIHBpZWNld2lzZSIp OworICBlbHNlCisgICAgd2FybmluZ19hdCAobG9jLCBPUFRfV3ZlY3Rvcl9v cGVyYXRpb25fcGVyZm9ybWFuY2UsCisJCSJ2ZWN0b3Igb3BlcmF0aW9uIHdp bGwgYmUgZXhwYW5kZWQgaW4gcGFyYWxsZWwiKTsKIAogICB2ID0gVkVDX2Fs bG9jKGNvbnN0cnVjdG9yX2VsdCwgZ2MsIChudW5pdHMgKyBkZWx0YSAtIDEp IC8gZGVsdGEpOwogICBmb3IgKGkgPSAwOyBpIDwgbnVuaXRzOwpAQCAtMjYw LDYgKzI2OCw3IEBAIGV4cGFuZF92ZWN0b3JfcGFyYWxsZWwgKGdpbXBsZV9z dG10X2l0ZXIKICAgdHJlZSByZXN1bHQsIGNvbXB1dGVfdHlwZTsKICAgZW51 bSBtYWNoaW5lX21vZGUgbW9kZTsKICAgaW50IG5fd29yZHMgPSB0cmVlX2xv d19jc3QgKFRZUEVfU0laRV9VTklUICh0eXBlKSwgMSkgLyBVTklUU19QRVJf V09SRDsKKyAgbG9jYXRpb25fdCBsb2MgPSBnaW1wbGVfbG9jYXRpb24gKGdz aV9zdG10ICgqZ3NpKSk7CiAKICAgLyogV2UgaGF2ZSB0aHJlZSBzdHJhdGVn aWVzLiAgSWYgdGhlIHR5cGUgaXMgYWxyZWFkeSBjb3JyZWN0LCBqdXN0IGRv CiAgICAgIHRoZSBvcGVyYXRpb24gYW4gZWxlbWVudCBhdCBhIHRpbWUuICBF bHNlLCBpZiB0aGUgdmVjdG9yIGlzIHdpZGVyIHRoYW4KQEAgLTI4NCw2ICsy OTMsOSBAQCBleHBhbmRfdmVjdG9yX3BhcmFsbGVsIChnaW1wbGVfc3RtdF9p dGVyCiAgICAgICBtb2RlID0gbW9kZV9mb3Jfc2l6ZSAodHJlZV9sb3dfY3N0 IChUWVBFX1NJWkUgKHR5cGUpLCAxKSwgTU9ERV9JTlQsIDApOwogICAgICAg Y29tcHV0ZV90eXBlID0gbGFuZ19ob29rcy50eXBlcy50eXBlX2Zvcl9tb2Rl IChtb2RlLCAxKTsKICAgICAgIHJlc3VsdCA9IGYgKGdzaSwgY29tcHV0ZV90 eXBlLCBhLCBiLCBOVUxMX1RSRUUsIE5VTExfVFJFRSwgY29kZSk7CisgICAg ICB3YXJuaW5nX2F0IChsb2MsIE9QVF9XdmVjdG9yX29wZXJhdGlvbl9wZXJm b3JtYW5jZSwKKwkgICAgICAgICAgInZlY3RvciBvcGVyYXRpb24gd2lsbCBi ZSBleHBhbmRlZCB3aXRoIGEgIgorCQkgICJzaW5nbGUgc2NhbGFyIG9wZXJh dGlvbiIpOwogICAgIH0KIAogICByZXR1cm4gcmVzdWx0OwpAQCAtMzA4LDcg KzMyMCw3IEBAIGV4cGFuZF92ZWN0b3JfYWRkaXRpb24gKGdpbXBsZV9zdG10 X2l0ZXIKICAgICByZXR1cm4gZXhwYW5kX3ZlY3Rvcl9wYXJhbGxlbCAoZ3Np LCBmX3BhcmFsbGVsLAogCQkJCSAgIHR5cGUsIGEsIGIsIGNvZGUpOwogICBl bHNlCi0gICAgcmV0dXJuIGV4cGFuZF92ZWN0b3JfcGllY2V3aXNlIChnc2ks IGYsCisgICAgcmV0dXJuIGV4cGFuZF92ZWN0b3JfcGllY2V3aXNlIChnc2ks IGYsIAogCQkJCSAgICB0eXBlLCBUUkVFX1RZUEUgKHR5cGUpLAogCQkJCSAg ICBhLCBiLCBjb2RlKTsKIH0KQEAgLTQwMCw4ICs0MTIsOCBAQCBleHBhbmRf dmVjdG9yX29wZXJhdGlvbiAoZ2ltcGxlX3N0bXRfaXRlCiAgICAgICBjYXNl IFBMVVNfRVhQUjoKICAgICAgIGNhc2UgTUlOVVNfRVhQUjoKICAgICAgICAg aWYgKCFUWVBFX09WRVJGTE9XX1RSQVBTICh0eXBlKSkKLSAgICAgICAgICBy ZXR1cm4gZXhwYW5kX3ZlY3Rvcl9hZGRpdGlvbiAoZ3NpLCBkb19iaW5vcCwg ZG9fcGx1c19taW51cywgdHlwZSwKLQkJICAgICAgCQkgICAgICAgICBnaW1w bGVfYXNzaWduX3JoczEgKGFzc2lnbiksCisJICByZXR1cm4gZXhwYW5kX3Zl Y3Rvcl9hZGRpdGlvbiAoZ3NpLCBkb19iaW5vcCwgZG9fcGx1c19taW51cywg dHlwZSwKKwkJCQkJIGdpbXBsZV9hc3NpZ25fcmhzMSAoYXNzaWduKSwKIAkJ CQkJIGdpbXBsZV9hc3NpZ25fcmhzMiAoYXNzaWduKSwgY29kZSk7CiAJYnJl YWs7CiAKQEAgLTYyNiwxMCArNjM4LDE0IEBAIGxvd2VyX3ZlY19zaHVmZmxl IChnaW1wbGVfc3RtdF9pdGVyYXRvciAKICAgdHJlZSBjb25zdHIsIHQsIHNp LCBpX3ZhbDsKICAgdHJlZSB2ZWMwdG1wID0gTlVMTF9UUkVFLCB2ZWMxdG1w ID0gTlVMTF9UUkVFLCBtYXNrdG1wID0gTlVMTF9UUkVFOwogICBib29sIHR3 b19vcGVyYW5kX3AgPSAhb3BlcmFuZF9lcXVhbF9wICh2ZWMwLCB2ZWMxLCAw KTsKKyAgbG9jYXRpb25fdCBsb2MgPSBnaW1wbGVfbG9jYXRpb24gKGdzaV9z dG10ICgqZ3NpKSk7CiAgIHVuc2lnbmVkIGk7CiAKICAgaWYgKGV4cGFuZF92 ZWNfc2h1ZmZsZV9leHByX3AgKFRZUEVfTU9ERSAodmVjdF90eXBlKSwgdmVj MCwgdmVjMSwgbWFzaykpCiAgICAgcmV0dXJuOworICAKKyAgd2FybmluZ19h dCAobG9jLCBPUFRfV3ZlY3Rvcl9vcGVyYXRpb25fcGVyZm9ybWFuY2UsCisg ICAgICAgICAgICAgICJ2ZWN0b3Igc2h1ZmZsaW5nIG9wZXJhdGlvbiB3aWxs IGJlIGV4cGFuZGVkIHBpZWNld2lzZSIpOwogCiAgIHYgPSBWRUNfYWxsb2Mg KGNvbnN0cnVjdG9yX2VsdCwgZ2MsIGVsZW1lbnRzKTsKICAgZm9yIChpID0g MDsgaSA8IGVsZW1lbnRzOyBpKyspCkluZGV4OiBnY2MvYy1wYXJzZXIuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvYy1wYXJzZXIuYwkocmV2 aXNpb24gMTc5NjM2KQorKysgZ2NjL2MtcGFyc2VyLmMJKHdvcmtpbmcgY29w eSkKQEAgLTY1MzMsMTcgKzY1MzMsMjIgQEAgY19wYXJzZXJfcG9zdGZpeF9l eHByZXNzaW9uIChjX3BhcnNlciAqcAogCSAgICAgIH0KIAogCSAgICBpZiAo VkVDX2xlbmd0aCAoY19leHByX3QsIGNleHByX2xpc3QpID09IDIpCi0JICAg ICAgZXhwci52YWx1ZSA9Ci0JCWNfYnVpbGRfdmVjX3NodWZmbGVfZXhwcgot CQkgIChsb2MsIFZFQ19pbmRleCAoY19leHByX3QsIGNleHByX2xpc3QsIDAp LT52YWx1ZSwKLQkJICAgTlVMTF9UUkVFLCBWRUNfaW5kZXggKGNfZXhwcl90 LCBjZXhwcl9saXN0LCAxKS0+dmFsdWUpOwotCisJICAgICAgeworCQlleHBy LnZhbHVlID0KKwkJICBjX2J1aWxkX3ZlY19zaHVmZmxlX2V4cHIKKwkJICAg IChsb2MsIFZFQ19pbmRleCAoY19leHByX3QsIGNleHByX2xpc3QsIDApLT52 YWx1ZSwKKwkJICAgICBOVUxMX1RSRUUsIFZFQ19pbmRleCAoY19leHByX3Qs IGNleHByX2xpc3QsIDEpLT52YWx1ZSk7CisJCVNFVF9FWFBSX0xPQ0FUSU9O IChleHByLnZhbHVlLCBsb2MpOworCSAgICAgIH0KIAkgICAgZWxzZSBpZiAo VkVDX2xlbmd0aCAoY19leHByX3QsIGNleHByX2xpc3QpID09IDMpCi0JICAg ICAgZXhwci52YWx1ZSA9Ci0JCWNfYnVpbGRfdmVjX3NodWZmbGVfZXhwcgot CQkgIChsb2MsIFZFQ19pbmRleCAoY19leHByX3QsIGNleHByX2xpc3QsIDAp LT52YWx1ZSwKLQkJICAgVkVDX2luZGV4IChjX2V4cHJfdCwgY2V4cHJfbGlz dCwgMSktPnZhbHVlLAotCQkgICBWRUNfaW5kZXggKGNfZXhwcl90LCBjZXhw cl9saXN0LCAyKS0+dmFsdWUpOworCSAgICAgIHsKKwkJZXhwci52YWx1ZSA9 CisJCSAgY19idWlsZF92ZWNfc2h1ZmZsZV9leHByCisJCSAgICAobG9jLCBW RUNfaW5kZXggKGNfZXhwcl90LCBjZXhwcl9saXN0LCAwKS0+dmFsdWUsCisJ CSAgICAgVkVDX2luZGV4IChjX2V4cHJfdCwgY2V4cHJfbGlzdCwgMSktPnZh bHVlLAorCQkgICAgIFZFQ19pbmRleCAoY19leHByX3QsIGNleHByX2xpc3Qs IDIpLT52YWx1ZSk7CisJCVNFVF9FWFBSX0xPQ0FUSU9OIChleHByLnZhbHVl LCBsb2MpOworCSAgICAgIH0KIAkgICAgZWxzZQogCSAgICAgIHsKIAkJZXJy b3JfYXQgKGxvYywgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgdG8gIgo= --bcaec5014a434b301404aeaea25a--