From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 70345 invoked by alias); 18 Dec 2015 00:55:41 -0000 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 Received: (qmail 70329 invoked by uid 89); 18 Dec 2015 00:55:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=ubizjak@gmail.com, ubizjakgmailcom, 66576, Rewrite X-HELO: mail-qg0-f49.google.com Received: from mail-qg0-f49.google.com (HELO mail-qg0-f49.google.com) (209.85.192.49) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 18 Dec 2015 00:55:37 +0000 Received: by mail-qg0-f49.google.com with SMTP id k90so42821103qge.0 for ; Thu, 17 Dec 2015 16:55:37 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.140.42.70 with SMTP id b64mr1151021qga.62.1450400135169; Thu, 17 Dec 2015 16:55:35 -0800 (PST) Received: by 10.55.181.70 with HTTP; Thu, 17 Dec 2015 16:55:35 -0800 (PST) In-Reply-To: References: <20151216232951.GA17976@intel.com> Date: Fri, 18 Dec 2015 00:55:00 -0000 Message-ID: Subject: Re: [PATCH] PR target/68937: i686: -fno-plt produces wrong code (maybe only with tailcall From: "H.J. Lu" To: Uros Bizjak Cc: "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary=001a11c120a8d78cf6052721980f X-IsSubscribed: yes X-SW-Source: 2015-12/txt/msg01838.txt.bz2 --001a11c120a8d78cf6052721980f Content-Type: text/plain; charset=UTF-8 Content-length: 5984 On Thu, Dec 17, 2015 at 1:59 PM, H.J. Lu wrote: > On Thu, Dec 17, 2015 at 1:21 PM, Uros Bizjak wrote: >> On Thu, Dec 17, 2015 at 7:09 PM, H.J. Lu wrote: >>> On Thu, Dec 17, 2015 at 8:11 AM, H.J. Lu wrote: >>>> On Thu, Dec 17, 2015 at 7:50 AM, H.J. Lu wrote: >>>>> On Thu, Dec 17, 2015 at 5:42 AM, Uros Bizjak wrote: >>>>>> On Thu, Dec 17, 2015 at 2:00 PM, H.J. Lu wrote: >>>>>>> On Thu, Dec 17, 2015 at 2:04 AM, Uros Bizjak wrote: >>>>>>>> On Thu, Dec 17, 2015 at 12:29 AM, H.J. Lu wrote: >>>>>>>>> Since sibcall never returns, we can only use call-clobbered register >>>>>>>>> as GOT base. Otherwise, callee-saved register used as GOT base won't >>>>>>>>> be properly restored. >>>>>>>>> >>>>>>>>> Tested on x86-64 with -m32. OK for trunk? >>>>>>>> >>>>>>>> You don't have to add explicit clobber for members of "CLOBBERED_REGS" >>>>>>>> class, and register_no_elim_operand predicate should be used with "U" >>>>>>>> constraint. Also, please introduce new predicate, similar to how >>>>>>>> GOT_memory_operand is defined and handled. >>>>>>>> >>>>>>> >>>>>>> Here is the updated patch. There is a predicate already, >>>>>>> sibcall_memory_operand. It allows any registers to >>>>>>> be as GOT base, which is the root of our problem. >>>>>>> This patch removes GOT slot from it and handles >>>>>>> sibcall over GOT slot with *sibcall_GOT_32 and >>>>>>> *sibcall_value_GOT_32 patterns. Since I need to >>>>>>> expose constraints on GOT base register to RA, >>>>>>> I have to use 2 operands, GOT base and function >>>>>>> symbol, to describe sibcall over 32-bit GOT slot. >>>>>> >>>>>> Please use >>>>>> >>>>>> (mem:SI (plus:SI >>>>>> (match_operand:SI 0 "register_no_elim_operand" "U") >>>>>> (match_operand:SI 1 "GOT32_symbol_operand"))) >>>>>> ... >>>>>> >>>>>> to avoid manual rebuild of the operand. >>>>>> >>>>> >>>>> Is this OK? >>>>> >>>> >>>> An updated patch to allow sibcall_memory_operand for RTL >>>> expansion. OK for trunk if there is no regression? >>>> >>> >>> There is no regressions on x86-64 with -m32. OK for trunk? >> >> OK for mainline, with a following change: >> >> @@ -597,11 +597,17 @@ >> (match_operand 0 "memory_operand")))) >> >> ;; Return true if OP is a memory operands that can be used in sibcalls. >> +;; Since sibcall never returns, we can only use call-clobbered register >> +;; as GOT base. Allow GOT slot here only with pseudo register as GOT >> +;; base. Properly handle sibcall over GOT slot with *sibcall_GOT_32 >> +;; and *sibcall_value_GOT_32 patterns. >> (define_predicate "sibcall_memory_operand" >> (and (match_operand 0 "memory_operand") >> (match_test "CONSTANT_P (XEXP (op, 0)) >> || (GET_CODE (XEXP (op, 0)) == PLUS >> && REG_P (XEXP (XEXP (op, 0), 0)) >> + && (REGNO (XEXP (XEXP (op, 0), 0)) >> + >= FIRST_PSEUDO_REGISTER) >> && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST >> && GET_CODE (XEXP (XEXP (XEXP (op, 0), 1), 0)) == UNSPEC >> && XINT (XEXP (XEXP (XEXP (op, 0), 1), 0), 1) == UNSPEC_GOT)"))) >> >> You can use (!HARD_REGISTER_NUM_P (...) || call_used_regs[...]) here. >> Call-used hard regs are still allowed here. >> >> Can you please also rewrite this horrible match_test as a block of C >> code using GOT32_symbol_operand predicate? >> > > I am retesting the patch with > > ;; Return true if OP is a memory operands that can be used in sibcalls. > ;; Since sibcall never returns, we can only use call-clobbered register > ;; as GOT base. Allow GOT slot here only with pseudo register as GOT > ;; base. Properly handle sibcall over GOT slot with *sibcall_GOT_32 > ;; and *sibcall_value_GOT_32 patterns. > (define_predicate "sibcall_memory_operand" > (match_operand 0 "memory_operand") > { > op = XEXP (op, 0); > if (CONSTANT_P (op)) > return true; > if (GET_CODE (op) == PLUS && REG_P (XEXP (op, 0))) > { > int regno = REGNO (XEXP (op, 0)); > if (!HARD_REGISTER_NUM_P (regno) || call_used_regs[regno]) > { > op = XEXP (op, 1); > if (GOT32_symbol_operand (op, VOIDmode)) > return true; > } > } > return false; > }) > > > I will check it in if there is no regression. > There is no regression. But I missed sibcall to local function with -O2 -fPIC -m32 -fno-plt -mregparm=3: extern void bar (int, int, int) __attribute__((visibility("hidden"))); void foo (int a, int b, int c) { bar (a, b, c); bar (a, b, c); } It doesn't need GOT. This patch fixes it. iff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 0e2bec3..691915f9 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6657,6 +6657,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) { tree type, decl_or_type; rtx a, b; + bool bind_global = decl && !targetm.binds_local_p (decl); /* If we are generating position-independent code, we cannot sibcall optimize direct calls to global functions, as the PLT requires @@ -6665,7 +6666,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) && !TARGET_64BIT && flag_pic && flag_plt - && decl && !targetm.binds_local_p (decl)) + && bind_global) return false; /* If we need to align the outgoing stack, then sibcalling would @@ -6726,7 +6727,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) parameters. Note that DLLIMPORT functions and call via GOT slot are indirect. */ if (!decl - || (flag_pic && !flag_plt) + || (bind_global && flag_pic && !flag_plt) || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl))) { /* Check if regparm >= 3 since arg_reg_available is set to Here is the complete patch with a testcase. OK for trunk? Thanks. -- H.J. --001a11c120a8d78cf6052721980f Content-Type: text/x-patch; charset=US-ASCII; name="0001-Use-call-clobbered-register-for-sibcall-via-GOT.patch" Content-Disposition: attachment; filename="0001-Use-call-clobbered-register-for-sibcall-via-GOT.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iiayrqbz0 Content-length: 14348 RnJvbSBlNGE3ZTA2NmE4Y2RiYjYzOGZjNWUxMzEyYzAxZjEwNDNhMjY3OWZj IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhq bC50b29sc0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTYgRGVjIDIwMTUgMTI6 MzQ6NTcgLTA4MDAKU3ViamVjdDogW1BBVENIXSBVc2UgY2FsbC1jbG9iYmVy ZWQgcmVnaXN0ZXIgZm9yIHNpYmNhbGwgdmlhIEdPVAoKU2luY2Ugc2liY2Fs bCBuZXZlciByZXR1cm5zLCB3ZSBjYW4gb25seSB1c2UgY2FsbC1jbG9iYmVy ZWQgcmVnaXN0ZXIgYXMKR09UIGJhc2UuICBPdGhlcndpc2UsIGNhbGxlZS1z YXZlZCByZWdpc3RlciB1c2VkIGFzIEdPVCBiYXNlIHdvbid0IGJlCnByb3Bl cmx5IHJlc3RvcmVkLiAgc2liY2FsbF9tZW1vcnlfb3BlcmFuZCBpcyBjaGFu Z2VkIHRvIGFsbG93IDMyLWJpdApHT1Qgc2xvdCBvbmx5IHdpdGggcHNldWRv IHJlZ2lzdGVyIGFzIEdPVCBiYXNlIGZvciBSVEwgZXhwYW5zaW9uLiAgMgpu ZXcgcGF0dGVybnMsICpzaWJjYWxsX0dPVF8zMiBhbmQgKnNpYmNhbGxfdmFs dWVfR09UXzMyLCBhcmUgYWRkZWQgdG8KZXhwb3NlIEdPVCBiYXNlIHJlZ2lz dGVyIHRvIHJlZ2lzdGVyIGFsbG9jYXRvciBzbyB0aGF0IGNhbGwtY2xvYmJl cmVkCnJlZ2lzdGVyIHdpbGwgYmUgdXNlZCBmb3IgR09UIGJhc2UuCgpnY2Mv CgoJUFIgdGFyZ2V0LzY4OTM3CgkqIGNvbmZpZy9pMzg2L2kzODYuYyAoaXg4 Nl9mdW5jdGlvbl9va19mb3Jfc2liY2FsbCk6IENvdW50CgljYWxsIHRvIGds b2JhbCBmdW5jdGlvbiB2aWEgR09UIHNsb3QgYXMgaW5kaXJlY3QgY2FsbC4K CSogY29uZmlnL2kzODYvaTM4Ni5tZCAoKnNpYmNhbGxfR09UXzMyKTogTmV3 IHBhdHRlcm4uCgkoKnNpYmNhbGxfdmFsdWVfR09UXzMyKTogTGlrZXdpc2Uu CgkqIGNvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQgKHNpYmNhbGxfbWVtb3J5 X29wZXJhbmQpOiBSZXdyaXRlLgoJQWxsb3cgMzItYml0IEdPVCBzbG90IG9u bHkgd2l0aCBwc2V1ZG8gcmVnaXN0ZXIgYXMgR09UIGJhc2UuCgkoR09UMzJf c3ltYm9sX29wZXJhbmQpOiBOZXcgcHJlZGljYXRlLgoKZ2NjL3Rlc3RzdWl0 ZS8KCglQUiB0YXJnZXQvNjg5MzcKCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5 MzctMS5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5Mzct Mi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctMy5j OiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctNC5jOiBM aWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctNS5jOiBMaWtl d2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctNi5jOiBMaWtld2lz ZS4KLS0tCiBnY2MvY29uZmlnL2kzODYvaTM4Ni5jICAgICAgICAgICAgICAg ICAgICB8ICA3ICsrKysrLS0KIGdjYy9jb25maWcvaTM4Ni9pMzg2Lm1kICAg ICAgICAgICAgICAgICAgIHwgMzMgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBnY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZCAgICAgICAg ICAgICB8IDM0ICsrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0KIGdj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctMS5jIHwgMTMg KysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjY4OTM3LTIuYyB8IDEzICsrKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI2ODkzNy0zLmMgfCAxMyArKysrKysrKysrKysK IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctNC5jIHwg MTMgKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4 Ni9wcjY4OTM3LTUuYyB8ICA5ICsrKysrKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjY4OTM3LTYuYyB8IDE2ICsrKysrKysrKysrKysr KwogOSBmaWxlcyBjaGFuZ2VkLCAxNDIgaW5zZXJ0aW9ucygrKSwgOSBkZWxl dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjY4OTM3LTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNjg5MzctMi5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI2ODkzNy0zLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY4OTM3LTQuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNjg5Mzct NS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvcHI2ODkzNy02LmMKCmRpZmYgLS1naXQgYS9nY2MvY29uZmln L2kzODYvaTM4Ni5jIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYwppbmRleCBj ZWNlYTI0Li5mNWQyM2Q5IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYv aTM4Ni5jCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmMKQEAgLTY2NTcs NiArNjY1Nyw3IEBAIGl4ODZfZnVuY3Rpb25fb2tfZm9yX3NpYmNhbGwgKHRy ZWUgZGVjbCwgdHJlZSBleHApCiB7CiAgIHRyZWUgdHlwZSwgZGVjbF9vcl90 eXBlOwogICBydHggYSwgYjsKKyAgYm9vbCBiaW5kX2dsb2JhbCA9IGRlY2wg JiYgIXRhcmdldG0uYmluZHNfbG9jYWxfcCAoZGVjbCk7CiAKICAgLyogSWYg d2UgYXJlIGdlbmVyYXRpbmcgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwg d2UgY2Fubm90IHNpYmNhbGwKICAgICAgb3B0aW1pemUgZGlyZWN0IGNhbGxz IHRvIGdsb2JhbCBmdW5jdGlvbnMsIGFzIHRoZSBQTFQgcmVxdWlyZXMKQEAg LTY2NjUsNyArNjY2Niw3IEBAIGl4ODZfZnVuY3Rpb25fb2tfZm9yX3NpYmNh bGwgKHRyZWUgZGVjbCwgdHJlZSBleHApCiAgICAgICAmJiAhVEFSR0VUXzY0 QklUCiAgICAgICAmJiBmbGFnX3BpYwogICAgICAgJiYgZmxhZ19wbHQKLSAg ICAgICYmIGRlY2wgJiYgIXRhcmdldG0uYmluZHNfbG9jYWxfcCAoZGVjbCkp CisgICAgICAmJiBiaW5kX2dsb2JhbCkKICAgICByZXR1cm4gZmFsc2U7CiAK ICAgLyogSWYgd2UgbmVlZCB0byBhbGlnbiB0aGUgb3V0Z29pbmcgc3RhY2ss IHRoZW4gc2liY2FsbGluZyB3b3VsZApAQCAtNjcyMyw4ICs2NzI0LDEwIEBA IGl4ODZfZnVuY3Rpb25fb2tfZm9yX3NpYmNhbGwgKHRyZWUgZGVjbCwgdHJl ZSBleHApCiAgICAgICAvKiBJZiB0aGlzIGNhbGwgaXMgaW5kaXJlY3QsIHdl J2xsIG5lZWQgdG8gYmUgYWJsZSB0byB1c2UgYQogCSBjYWxsLWNsb2JiZXJl ZCByZWdpc3RlciBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBmdW5j dGlvbi4KIAkgTWFrZSBzdXJlIHRoYXQgYWxsIHN1Y2ggcmVnaXN0ZXJzIGFy ZSBub3QgdXNlZCBmb3IgcGFzc2luZwotCSBwYXJhbWV0ZXJzLiAgTm90ZSB0 aGF0IERMTElNUE9SVCBmdW5jdGlvbnMgYXJlIGluZGlyZWN0LiAgKi8KKwkg cGFyYW1ldGVycy4gIE5vdGUgdGhhdCBETExJTVBPUlQgZnVuY3Rpb25zIGFu ZCBjYWxsIHRvIGdsb2JhbAorCSBmdW5jdGlvbiB2aWEgR09UIHNsb3QgYXJl IGluZGlyZWN0LiAgKi8KICAgICAgIGlmICghZGVjbAorCSAgfHwgKGJpbmRf Z2xvYmFsICYmIGZsYWdfcGljICYmICFmbGFnX3BsdCkKIAkgIHx8IChUQVJH RVRfRExMSU1QT1JUX0RFQ0xfQVRUUklCVVRFUyAmJiBERUNMX0RMTElNUE9S VF9QIChkZWNsKSkpCiAJewogCSAgLyogQ2hlY2sgaWYgcmVncGFybSA+PSAz IHNpbmNlIGFyZ19yZWdfYXZhaWxhYmxlIGlzIHNldCB0bwpkaWZmIC0tZ2l0 IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYubWQgYi9nY2MvY29uZmlnL2kzODYv aTM4Ni5tZAppbmRleCA0OWIyMjE2Li42YWI4ZWFhIDEwMDY0NAotLS0gYS9n Y2MvY29uZmlnL2kzODYvaTM4Ni5tZAorKysgYi9nY2MvY29uZmlnL2kzODYv aTM4Ni5tZApAQCAtMTE4NjUsNiArMTE4NjUsMjIgQEAKICAgIiogcmV0dXJu IGl4ODZfb3V0cHV0X2NhbGxfaW5zbiAoaW5zbiwgb3BlcmFuZHNbMF0pOyIK ICAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKV0pCiAKKzs7IFNpbmNlIHNp YmNhbGwgbmV2ZXIgcmV0dXJucywgd2UgY2FuIG9ubHkgdXNlIGNhbGwtY2xv YmJlcmVkIHJlZ2lzdGVyCis7OyBhcyBHT1QgYmFzZS4KKyhkZWZpbmVfaW5z biAiKnNpYmNhbGxfR09UXzMyIgorICBbKGNhbGwgKG1lbTpRSQorCSAgICht ZW06U0kgKHBsdXM6U0kKKwkJICAgICAobWF0Y2hfb3BlcmFuZDpTSSAwICJy ZWdpc3Rlcl9ub19lbGltX29wZXJhbmQiICJVIikKKwkJICAgICAobWF0Y2hf b3BlcmFuZDpTSSAxICJHT1QzMl9zeW1ib2xfb3BlcmFuZCIpKSkpCisJICht YXRjaF9vcGVyYW5kIDIpKV0KKyAgIiFUQVJHRVRfTUFDSE8gJiYgIVRBUkdF VF82NEJJVCAmJiBTSUJMSU5HX0NBTExfUCAoaW5zbikiCit7CisgIHJ0eCBm bmFkZHIgPSBnZW5fcnR4X1BMVVMgKFBtb2RlLCBvcGVyYW5kc1swXSwgb3Bl cmFuZHNbMV0pOworICBmbmFkZHIgPSBnZW5fY29uc3RfbWVtIChQbW9kZSwg Zm5hZGRyKTsKKyAgcmV0dXJuIGl4ODZfb3V0cHV0X2NhbGxfaW5zbiAoaW5z biwgZm5hZGRyKTsKK30KKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKV0p CisKIChkZWZpbmVfaW5zbiAiKnNpYmNhbGwiCiAgIFsoY2FsbCAobWVtOlFJ IChtYXRjaF9vcGVyYW5kOlcgMCAic2liY2FsbF9pbnNuX29wZXJhbmQiICJV QnNCeiIpKQogCSAobWF0Y2hfb3BlcmFuZCAxKSldCkBAIC0xMjA0Miw2ICsx MjA1OCwyMyBAQAogICAiKiByZXR1cm4gaXg4Nl9vdXRwdXRfY2FsbF9pbnNu IChpbnNuLCBvcGVyYW5kc1sxXSk7IgogICBbKHNldF9hdHRyICJ0eXBlIiAi Y2FsbHYiKV0pCiAKKzs7IFNpbmNlIHNpYmNhbGwgbmV2ZXIgcmV0dXJucywg d2UgY2FuIG9ubHkgdXNlIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVyCis7OyBh cyBHT1QgYmFzZS4KKyhkZWZpbmVfaW5zbiAiKnNpYmNhbGxfdmFsdWVfR09U XzMyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZCAwKQorICAgICAgICAoY2Fs bCAobWVtOlFJCisJCShtZW06U0kgKHBsdXM6U0kKKwkJCSAgKG1hdGNoX29w ZXJhbmQ6U0kgMSAicmVnaXN0ZXJfbm9fZWxpbV9vcGVyYW5kIiAiVSIpCisJ CQkgIChtYXRjaF9vcGVyYW5kOlNJIDIgIkdPVDMyX3N5bWJvbF9vcGVyYW5k IikpKSkKKwkgKG1hdGNoX29wZXJhbmQgMykpKV0KKyAgIiFUQVJHRVRfTUFD SE8gJiYgIVRBUkdFVF82NEJJVCAmJiBTSUJMSU5HX0NBTExfUCAoaW5zbiki Cit7CisgIHJ0eCBmbmFkZHIgPSBnZW5fcnR4X1BMVVMgKFBtb2RlLCBvcGVy YW5kc1sxXSwgb3BlcmFuZHNbMl0pOworICBmbmFkZHIgPSBnZW5fY29uc3Rf bWVtIChQbW9kZSwgZm5hZGRyKTsKKyAgcmV0dXJuIGl4ODZfb3V0cHV0X2Nh bGxfaW5zbiAoaW5zbiwgZm5hZGRyKTsKK30KKyAgWyhzZXRfYXR0ciAidHlw ZSIgImNhbGx2IildKQorCiAoZGVmaW5lX2luc24gIipzaWJjYWxsX3ZhbHVl IgogICBbKHNldCAobWF0Y2hfb3BlcmFuZCAwKQogCShjYWxsIChtZW06UUkg KG1hdGNoX29wZXJhbmQ6VyAxICJzaWJjYWxsX2luc25fb3BlcmFuZCIgIlVC c0J6IikpCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2kzODYvcHJlZGljYXRl cy5tZCBiL2djYy9jb25maWcvaTM4Ni9wcmVkaWNhdGVzLm1kCmluZGV4IDhi ZGQ1ZDguLjk2ZDk0NmMgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9w cmVkaWNhdGVzLm1kCisrKyBiL2djYy9jb25maWcvaTM4Ni9wcmVkaWNhdGVz Lm1kCkBAIC01OTcsMTQgKzU5NywyOCBAQAogCSAgICAobWF0Y2hfb3BlcmFu ZCAwICJtZW1vcnlfb3BlcmFuZCIpKSkpCiAKIDs7IFJldHVybiB0cnVlIGlm IE9QIGlzIGEgbWVtb3J5IG9wZXJhbmRzIHRoYXQgY2FuIGJlIHVzZWQgaW4g c2liY2FsbHMuCis7OyBTaW5jZSBzaWJjYWxsIG5ldmVyIHJldHVybnMsIHdl IGNhbiBvbmx5IHVzZSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcgorOzsgYXMg R09UIGJhc2UuICBBbGxvdyBHT1Qgc2xvdCBoZXJlIG9ubHkgd2l0aCBwc2V1 ZG8gcmVnaXN0ZXIgYXMgR09UCis7OyBiYXNlLiAgUHJvcGVybHkgaGFuZGxl IHNpYmNhbGwgb3ZlciBHT1Qgc2xvdCB3aXRoICpzaWJjYWxsX0dPVF8zMgor OzsgYW5kICpzaWJjYWxsX3ZhbHVlX0dPVF8zMiBwYXR0ZXJucy4KIChkZWZp bmVfcHJlZGljYXRlICJzaWJjYWxsX21lbW9yeV9vcGVyYW5kIgotICAoYW5k IChtYXRjaF9vcGVyYW5kIDAgIm1lbW9yeV9vcGVyYW5kIikKLSAgICAgICAo bWF0Y2hfdGVzdCAiQ09OU1RBTlRfUCAoWEVYUCAob3AsIDApKQotCQkgICAg fHwgKEdFVF9DT0RFIChYRVhQIChvcCwgMCkpID09IFBMVVMKLQkJCSYmIFJF R19QIChYRVhQIChYRVhQIChvcCwgMCksIDApKQotCQkJJiYgR0VUX0NPREUg KFhFWFAgKFhFWFAgKG9wLCAwKSwgMSkpID09IENPTlNUCi0JCQkmJiBHRVRf Q09ERSAoWEVYUCAoWEVYUCAoWEVYUCAob3AsIDApLCAxKSwgMCkpID09IFVO U1BFQwotCQkJJiYgWElOVCAoWEVYUCAoWEVYUCAoWEVYUCAob3AsIDApLCAx KSwgMCksIDEpID09IFVOU1BFQ19HT1QpIikpKQorICAobWF0Y2hfb3BlcmFu ZCAwICJtZW1vcnlfb3BlcmFuZCIpCit7CisgIG9wID0gWEVYUCAob3AsIDAp OworICBpZiAoQ09OU1RBTlRfUCAob3ApKQorICAgIHJldHVybiB0cnVlOwor ICBpZiAoR0VUX0NPREUgKG9wKSA9PSBQTFVTICYmIFJFR19QIChYRVhQIChv cCwgMCkpKQorICAgIHsKKyAgICAgIGludCByZWdubyA9IFJFR05PIChYRVhQ IChvcCwgMCkpOworICAgICAgaWYgKCFIQVJEX1JFR0lTVEVSX05VTV9QIChy ZWdubykgfHwgY2FsbF91c2VkX3JlZ3NbcmVnbm9dKQorCXsKKwkgIG9wID0g WEVYUCAob3AsIDEpOworCSAgaWYgKEdPVDMyX3N5bWJvbF9vcGVyYW5kIChv cCwgVk9JRG1vZGUpKQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQor ICByZXR1cm4gZmFsc2U7Cit9KQogCiA7OyBUZXN0IGZvciBhIHZhbGlkIG9w ZXJhbmQgZm9yIGEgY2FsbCBpbnN0cnVjdGlvbi4KIDs7IEFsbG93IGNvbnN0 YW50IGNhbGwgYWRkcmVzcyBvcGVyYW5kcyBpbiBQbW9kZSBvbmx5LgpAQCAt NjMzLDYgKzY0NywxMiBAQAogCSAgJiYgWElOVCAoWEVYUCAob3AsIDApLCAx KSA9PSBVTlNQRUNfR09UUENSRUwpOwogfSkKIAorOzsgUmV0dXJuIHRydWUg aWYgT1AgaXMgYSAzMi1iaXQgR09UIHN5bWJvbCBvcGVyYW5kLgorKGRlZmlu ZV9wcmVkaWNhdGUgIkdPVDMyX3N5bWJvbF9vcGVyYW5kIgorICAobWF0Y2hf dGVzdCAiR0VUX0NPREUgKG9wKSA9PSBDT05TVAorICAgICAgICAgICAgICAg JiYgR0VUX0NPREUgKFhFWFAgKG9wLCAwKSkgPT0gVU5TUEVDCisgICAgICAg ICAgICAgICAmJiBYSU5UIChYRVhQIChvcCwgMCksIDEpID09IFVOU1BFQ19H T1QiKSkKKwogOzsgTWF0Y2ggZXhhY3RseSB6ZXJvLgogKGRlZmluZV9wcmVk aWNhdGUgImNvbnN0MF9vcGVyYW5kIgogICAobWF0Y2hfY29kZSAiY29uc3Rf aW50LGNvbnN0X3dpZGVfaW50LGNvbnN0X2RvdWJsZSxjb25zdF92ZWN0b3Ii KQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cHI2ODkzNy0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjY4OTM3LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li44OTc4NTZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI2ODkzNy0xLmMKQEAgLTAsMCArMSwxMyBAQAor LyogeyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IHsgKi0qLWxpbnV4KiAmJiBp YTMyIH0gfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnBpYyAtZm5v LXBsdCAtbXJlZ3Bhcm09MyIgfSAqLworCitleHRlcm4gdm9pZCBiYXIgKGlu dCk7CisKK3ZvaWQKK2ZvbyAoaW50IGIpCit7CisgIGJhciAoYik7CisgIGJh ciAoYik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAi am1wXFsgXHRcXSouYmFyQEdPVFxcKCVlKGF8Y3xkKXhcXCkiIH0gfSAqLwpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI2 ODkzNy0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY4 OTM3LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4y NTdmNGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI2ODkzNy0yLmMKQEAgLTAsMCArMSwxMyBAQAorLyog eyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IHsgKi0qLWxpbnV4KiAmJiBpYTMy IH0gfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnBpYyAtZm5vLXBs dCAtbXJlZ3Bhcm09MyIgfSAqLworCitleHRlcm4gdm9pZCBiYXIgKGludCwg aW50KTsKKwordm9pZAorZm9vIChpbnQgYSwgaW50IGIpCit7CisgIGJhciAo YSwgYik7CisgIGJhciAoYSwgYik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlciAiam1wXFsgXHRcXSouYmFyQEdPVFxcKCVlKGF8Y3xk KXhcXCkiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI2ODkzNy0zLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjY4OTM3LTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi42ZDhlNDBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI2ODkzNy0zLmMKQEAgLTAs MCArMSwxMyBAQAorLyogeyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IHsgKi0q LWxpbnV4KiAmJiBpYTMyIH0gfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MiAtZnBpYyAtZm5vLXBsdCAtbXJlZ3Bhcm09MyIgfSAqLworCitleHRlcm4g dm9pZCBiYXIgKGludCwgaW50LCBpbnQpOworCit2b2lkCitmb28gKGludCBh LCBpbnQgYiwgaW50IGMpCit7CisgIGJhciAoYSwgYiwgYyk7CisgIGJhciAo YSwgYiwgYyk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgImptcFxbIFx0XF0qLmJhckBHT1QiIH0gfSAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI2ODkzNy00LmMg Yi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY4OTM3LTQuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE5OTU2Ci0t LSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI2ODkzNy00LmMKQEAgLTAsMCArMSwxMyBAQAorLyogeyBkZy1kbyBj b21waWxlIHsgdGFyZ2V0IHsgKi0qLWxpbnV4KiAmJiBpYTMyIH0gfSB9ICov CisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnBpYyAtZm5vLXBsdCAtbXJlZ3Bh cm09MyIgfSAqLworCitleHRlcm4gaW50IGJhciAoaW50LCBpbnQpOworCitp bnQKK2ZvbyAoaW50IGEsIGludCBiKQoreworICAodm9pZCkgYmFyIChhLCBi KTsKKyAgcmV0dXJuIGJhciAoYSwgYik7Cit9CisKKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlciAiam1wXFsgXHRcXSouYmFyQEdPVFxcKCVlKGF8 Y3xkKXhcXCkiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI2ODkzNy01LmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjY4OTM3LTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi5mN2UzZWM1Ci0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI2ODkzNy01LmMKQEAg LTAsMCArMSw5IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgeyAq LSotbGludXgqIH0gfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnBp YyAtZm5vLXBsdCAtZnVucm9sbC1sb29wcyIgfSAqLworCitleHRlcm4gdm9p ZCAqZigpOwordm9pZCBkbWlfc2Nhbl9tYWNoaW5lKHZvaWQpIHsKKyAgY2hh ciAqcCA9IGYoKSwgKnE7CisgIGZvciAocSA9IHA7IHEgPCBwICsgMTA7IHEr KykKKyAgICA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjY4OTM3LTYuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByNjg5MzctNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjQwNmNlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY4OTM3LTYuYwpAQCAtMCww ICsxLDE2IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgeyAqLSot bGludXgqICYmIGlhMzIgfSB9IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8y IC1mcGljIC1mbm8tcGx0IC1tcmVncGFybT0zIiB9ICovCisKK2V4dGVybiB2 b2lkIGZvbyAoaW50LCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBiYXIgKGlu dCwgaW50LCBpbnQpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRl biIpKSk7CisKK3ZvaWQKK2ZvbyAoaW50IGEsIGludCBiLCBpbnQgYykKK3sK KyAgZm9vIChhLCBiLCBjKTsKKyAgYmFyIChhLCBiLCBjKTsKKyAgZm9vIChh LCBiLCBjKTsKKyAgYmFyIChhLCBiLCBjKTsKK30KKworLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyICJqbXBcWyBcdFxdYmFyIiB9IH0gKi8KLS0g CjIuNS4wCgo= --001a11c120a8d78cf6052721980f--