From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 6223C385840A for ; Sat, 21 Oct 2023 14:45:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6223C385840A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6223C385840A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697899529; cv=none; b=llVHBxPmWIVXwKTySALZ8lX1DswRU552RgxmguVLFlhFZ3z/CGuLP8nQZ4JY9mXnCtuJwAacXUR7HZb05ZcgsbiQF0YIPg1DjwQi4A16v7fc21nqfie1Gflvqyw3SEZujPmkLjGCzAhLqvq5bUrGgEJq0rDtxAALR1dJlbt/bic= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697899529; c=relaxed/simple; bh=TSi3O8fyW0u60/5pukAx6Fqy8BCXDY4u2NZYBmdcP/M=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=C/gOnzJWk+PZfdtLt34dGcyaW/ZMQMRNf8vN9daPkD9npVqkf7NohV/b2dFgmQd9PuHF0CSUUApCV5M/wX4L4DPd9kF21NTnNoifewOLcpAPoCHvqgo/5zNu5GDBhRZsVnm1xajEx/PEh72Guq5sS9x+2/fKvSSo8iGCQ44bnw0= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1697899519; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ZYJYsx5VNtNJEqG97HLh6vy6r3pEOAFi8UhbdQrfO18=; b=TWieKtrhjTlacMY69E2Ak1/8vzhRON73UvhZpZfuGBoaFB3A3ToD+0Eq7KpzYMmtPeDUtO tjlj65bdoPA7iZt5w0YSoIPwuxcQ38frb+a1KTJ4Tu8p11KM50VYDEGCnPzr2PZhxDJ3qQ 3Qb6ao6HwE2UIgiFtqfQztHaTIuv66A= Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-184-0ZgJsF1-OySKX9l0Qvexiw-1; Sat, 21 Oct 2023 10:45:16 -0400 X-MC-Unique: 0ZgJsF1-OySKX9l0Qvexiw-1 Received: by mail-lj1-f198.google.com with SMTP id 38308e7fff4ca-2c50bebd8dfso15851291fa.3 for ; Sat, 21 Oct 2023 07:45:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697899515; x=1698504315; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZYJYsx5VNtNJEqG97HLh6vy6r3pEOAFi8UhbdQrfO18=; b=N+D6Rffo1s7P7uRZKvNBd3B7ncnFJdI268byOMVY1kpjMmuTFjD4sHYsXRzGSkQDd6 tmPGUz7MRec9nKuZKbLC7ctiAq2mlkafJH6s0En6BCLOddCiHwxjSFSsJPgeeWmv5mGu LCP80IEpMTjOv4XaIsbTyerAlpQE5GuaSPboP7nZHEaqEO5NtgpWkVIHGkYiAHJLjShp b1t26Q5PUA54pARwjRhjZy60GOs0CpP+jv5oULG/rr56MSICZ5TN4qQ+mzLl81qhrfhB 4h+inM8O8J1rAM7M4JxCXRLM99jRe1XZqcRNaopivkWMcZdlINVhADV0Iv3Fy/JomHT+ LsmA== X-Gm-Message-State: AOJu0YyUPDba8LN6ZNvvdAW2ylPthaxZRITcGrJmc0XkWdcySAt3RSmL dh4zhaY69IyP3J2hbfKWSW9ZeaOY8x0t+KdS6zJz1vFzZOkpotRoA0+kUh0yipL52WNmfpcQmPE xIbnLfaJ4XuijMPNKwPnb+fpEX6iQe6Y= X-Received: by 2002:a2e:9b0b:0:b0:2b9:36d5:729c with SMTP id u11-20020a2e9b0b000000b002b936d5729cmr3356405lji.47.1697899514914; Sat, 21 Oct 2023 07:45:14 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF8kg6gm7CAzQZStJDBj99VWzkfCAlZnIO/7G9BbgPC6WrxDJ9XCLdzbZHN6sdUJJIf/8LBi9VxMkE2BD/oCtI= X-Received: by 2002:a2e:9b0b:0:b0:2b9:36d5:729c with SMTP id u11-20020a2e9b0b000000b002b936d5729cmr3356393lji.47.1697899514517; Sat, 21 Oct 2023 07:45:14 -0700 (PDT) MIME-Version: 1.0 References: <65160b60.170a0220.894a0.06bc@mx.google.com> <6516fb58.170a0220.cb8af.508f@mx.google.com> In-Reply-To: From: Jonathan Wakely Date: Sat, 21 Oct 2023 15:45:03 +0100 Message-ID: Subject: Re: [PATCH] libstdc++: Ensure active union member is correctly set To: Jonathan Wakely Cc: Nathaniel Shead , Jason Merrill , "libstdc++" , gcc-patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="0000000000006d950a06083b099a" X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP 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: --0000000000006d950a06083b099a Content-Type: text/plain; charset="UTF-8" On Fri, 29 Sept 2023 at 17:46, Jonathan Wakely wrote: > > On Fri, 29 Sept 2023 at 17:29, Nathaniel Shead > wrote: > > > > On Fri, Sep 29, 2023 at 04:06:33PM +0100, Jonathan Wakely wrote: > > > On Fri, 29 Sept 2023 at 10:32, Jonathan Wakely wrote: > > > > > Thanks for the comments, here's an updated version of the patch. > > > > > Bootstrapped and regtested on x86_64-pc-linux-gnu. > > > > > > > > Great, I'll get this committed today - thanks! > > > > > > That's done now. > > > > > > > Thanks! > > > > > > > > > > > > I'll note that there are some existing calls to `_M_use_local_data()` > > > > > already used only for their side effects without a cast to void, e.g. > > > > > > > > > > /** > > > > > * @brief Default constructor creates an empty string. > > > > > */ > > > > > _GLIBCXX20_CONSTEXPR > > > > > basic_string() > > > > > _GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible<_Alloc>::value) > > > > > : _M_dataplus(_M_local_data()) > > > > > { > > > > > _M_use_local_data(); > > > > > _M_set_length(0); > > > > > } > > > > > > > > > > I haven't updated these, but should this be changed for consistency? > > > > > > > > Yes, good idea. I can do that. > > > > > > I started to do that, and decided it made more sense to split out the > > > constexpr loop from _M_use_local_data() into a separate function, > > > _M_init_local_buf(). Then we can use that for all the places where we > > > don't care about the return value. That avoids the overhead of using > > > pointer_traits::pointer_to when we don't need the return value (which > > > is admittedly only going to be an issue for -O0 code, but I think it's > > > cleaner this way anyway). > > > > > > Please see the attached patch and let me know what you think. > > > > I agree, and it also looks clearer to me what is happening. > > Good, I'll make this change next week then. > > > > > > > > > > > Thanks again for fixing these. I think this might fix some bug reports > > > > about clang rejecting our std::string in constant expressions, so I'll > > > > check those. > > > > > > Your patch fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110900 > > > (so we should backport it to gcc-13 and gcc-12 too). > > > > > commit 2668979d3206ff6c039ac0165aae29377a15666c > > > Author: Jonathan Wakely > > > Date: Fri Sep 29 12:12:22 2023 > > > > > > libstdc++: Split std::basic_string::_M_use_local_data into two functions > > > > > > This splits out the activate-the-union-member-for-constexpr logic from > > > _M_use_local_data, so that it can be used separately in cases that don't > > > need to use std::pointer_traits::pointer_to to obtain the > > > return value. > > > > > > This leaves only three uses of _M_use_local_data() which are all the > > > same form: > > > > > > __s._M_data(_M_use_local_data()); > > > __s._M_set_length(0); > > > > > > We could remove _M_use_local_data() and change those three places to use > > > a new _M_reset() function that does: > > > > > > _M_init_local_buf(); > > > _M_data(_M_local_data()); > > > _M_set_length(0); > > > > > > This is left for a future change. > > > > > > libstdc++-v3/ChangeLog: > > > > > > * include/bits/basic_string.h (_M_init_local_buf()): New > > > function. > > > (_M_use_local_data()): Use _M_init_local_buf. > > > (basic_string(), basic_string(const Alloc&)) > > > (basic_string(basic_string&&)) > > > (basic_string(basic_string&&, const Alloc&)): Use > > > _M_init_local_buf instead of _M_use_local_data(). > > > * include/bits/basic_string.tcc (swap(basic_string&)) > > > (_M_construct(InIter, InIter, forward_iterator_tag)) > > > (_M_construct(size_type, CharT), reserve()): Likewise. > > > (_M_construct(InIter, InIter, input_iterator_tag)): Remove call > > > to _M_use_local_data() and initialize the local buffer directly. > > > > > > diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h > > > index 4f94cd967cf..18a19b8dcbc 100644 > > > --- a/libstdc++-v3/include/bits/basic_string.h > > > +++ b/libstdc++-v3/include/bits/basic_string.h > > > @@ -353,13 +353,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > > // Ensure that _M_local_buf is the active member of the union. > > > __attribute__((__always_inline__)) > > > _GLIBCXX14_CONSTEXPR > > > - pointer > > > - _M_use_local_data() _GLIBCXX_NOEXCEPT > > > + void > > > + _M_init_local_buf() _GLIBCXX_NOEXCEPT > > > { > > > #if __cpp_lib_is_constant_evaluated > > > if (std::is_constant_evaluated()) > > > for (size_type __i = 0; __i <= _S_local_capacity; ++__i) > > > _M_local_buf[__i] = _CharT(); > > > +#endif > > > + } > > > + > > > + __attribute__((__always_inline__)) > > > + _GLIBCXX14_CONSTEXPR > > > + pointer > > > + _M_use_local_data() _GLIBCXX_NOEXCEPT > > > + { > > > +#if __glibcxx_is_constant_evaluated > > > + _M_init_local_buf(); > > > #endif > > > return _M_local_data(); > > > } > > > > What's the difference between __cpp_lib_is_constant_evaluated and > > __glibcxx_is_constant_evaluated? Should these lines be using the same > > macro here? > > Ah, yeah, they could be the same. > > The difference is that (for most feature test macros) the > __glibcxx_ftm form is defined after including , but > the __cpp_lib_ftm form is only defined only by headers that do: > > #define __glibcxx_want_ftm > #include > > This means we can ensure that the __cpp_lib_ftm form is only defined > by headers where we actually want to define it, e.g. in the headers > that [version.syn] in the standard says should define the macro. So > for our own internal uses, we should generally rely on the > __glibcxx_ftm one. Users should rely on __cpp_lib_ftm after including > the correct header. For example, __glibcxx_atomic_wait is defined > after including and so is available for our own > uses, but __cpp_lib_atomic_wait is only defined after including > , not just . Or at least, that's the plan > - I have a pending patch to make everything I just said true :-) > Currently we "leak" the __cpp_lib_ftm forms into lots of > internal headers. That will change next week. > > In this specific case, it doesn't matter, because > __cpp_lib_is_constant_evaluated is defined by , and every > header includes that. So it doesn't really matter whether our internal > uses are __cpp_lib_is_constant_evaluated or > __glibcxx_is_constant_evaluated. But it would be good to be > consistent. > > > > > > @@ -522,7 +532,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > > _GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible<_Alloc>::value) > > > : _M_dataplus(_M_local_data()) > > > { > > > - _M_use_local_data(); > > > + _M_init_local_buf(); > > > _M_set_length(0); > > > } > > > > > > @@ -534,7 +544,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > > basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT > > > : _M_dataplus(_M_local_data(), __a) > > > { > > > - _M_use_local_data(); > > > + _M_init_local_buf(); > > > _M_set_length(0); > > > } > > > > > > @@ -678,7 +688,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > > { > > > if (__str._M_is_local()) > > > { > > > - (void)_M_use_local_data(); > > > + _M_init_local_buf(); > > > traits_type::copy(_M_local_buf, __str._M_local_buf, > > > __str.length() + 1); > > > } > > > @@ -718,7 +728,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > > { > > > if (__str._M_is_local()) > > > { > > > - (void)_M_use_local_data(); > > > + _M_init_local_buf(); > > > traits_type::copy(_M_local_buf, __str._M_local_buf, > > > __str.length() + 1); > > > _M_length(__str.length()); > > > diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc > > > index 4bc98f2aea7..052eeb9e846 100644 > > > --- a/libstdc++-v3/include/bits/basic_string.tcc > > > +++ b/libstdc++-v3/include/bits/basic_string.tcc > > > @@ -79,7 +79,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > } > > > else if (__s.length()) > > > { > > > - (void)_M_use_local_data(); > > > + _M_init_local_buf(); > > > traits_type::copy(_M_local_buf, __s._M_local_buf, > > > __s.length() + 1); > > > _M_length(__s.length()); > > > @@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > } > > > else if (length()) > > > { > > > - (void)__s._M_use_local_data(); > > > + __s._M_init_local_buf(); > > > traits_type::copy(__s._M_local_buf, _M_local_buf, > > > length() + 1); > > > __s._M_length(length()); > > > @@ -99,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > else > > > { > > > const size_type __tmp_capacity = __s._M_allocated_capacity; > > > - (void)__s._M_use_local_data(); > > > + __s._M_init_local_buf(); > > > traits_type::copy(__s._M_local_buf, _M_local_buf, > > > length() + 1); > > > _M_data(__s._M_data()); > > > @@ -111,7 +111,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > const size_type __tmp_capacity = _M_allocated_capacity; > > > if (__s._M_is_local()) > > > { > > > - (void)_M_use_local_data(); > > > + _M_init_local_buf(); > > > traits_type::copy(_M_local_buf, __s._M_local_buf, > > > __s.length() + 1); > > > __s._M_data(_M_data()); > > > @@ -174,14 +174,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > size_type __len = 0; > > > size_type __capacity = size_type(_S_local_capacity); > > > > > > - pointer __p = _M_use_local_data(); > > > - > > > while (__beg != __end && __len < __capacity) > > > { > > > - __p[__len++] = *__beg; > > > + _M_local_buf[__len++] = *__beg; > > > ++__beg; > > > } > > > > > > +#if __glibcxx_is_constant_evaluated > > > + if (std::is_constant_evaluated()) > > > + for (size_type __i = __len; __i <= __capacity; ++__i) > > > + _M_local_buf[__i] = _CharT(); > > > +#endif > > > + > > > > I wonder if maybe this should still be a call to `_M_init_local_buf()` > > above, where the `_M_use_local_data()` used to be? That way the logic > > stays in one place, and I don't imagine the compile time savings of not > > immediately overwriting the first __len characters would be significant. > > > Yeah, I went back and forth on that, but you're probably right. I'll > do as you suggested. Here's what I've pushed to trunk after testing on x86_64-linux. Thanks again for the fixes. --0000000000006d950a06083b099a Content-Type: text/plain; charset="US-ASCII"; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lo05ikyd0 Y29tbWl0IDQwNWE0MTQwZmMzMGJjZTg2YjFlYzg4NWE5OGJiMTc3MDRlMGM4YzYKQXV0aG9yOiBK b25hdGhhbiBXYWtlbHkgPGp3YWtlbHlAcmVkaGF0LmNvbT4KRGF0ZTogICBGcmkgU2VwIDI5IDEy OjEyOjIyIDIwMjMKCiAgICBsaWJzdGRjKys6IFNwbGl0IHN0ZDo6YmFzaWNfc3RyaW5nOjpfTV91 c2VfbG9jYWxfZGF0YSBpbnRvIHR3byBmdW5jdGlvbnMKICAgIAogICAgVGhpcyBzcGxpdHMgb3V0 IHRoZSBhY3RpdmF0ZS10aGUtdW5pb24tbWVtYmVyLWZvci1jb25zdGV4cHIgbG9naWMgZnJvbQog ICAgX01fdXNlX2xvY2FsX2RhdGEsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgc2VwYXJhdGVseSBp biBjYXNlcyB0aGF0IGRvbid0CiAgICBuZWVkIHRvIHVzZSBzdGQ6OnBvaW50ZXJfdHJhaXRzPHBv aW50ZXI+Ojpwb2ludGVyX3RvIHRvIG9idGFpbiB0aGUKICAgIHJldHVybiB2YWx1ZS4KICAgIAog ICAgVGhpcyBsZWF2ZXMgb25seSB0aHJlZSB1c2VzIG9mIF9NX3VzZV9sb2NhbF9kYXRhKCkgd2hp Y2ggYXJlIGFsbCBvZiB0aGUKICAgIHNhbWUgZm9ybToKICAgIAogICAgICBfX3MuX01fZGF0YShf TV91c2VfbG9jYWxfZGF0YSgpKTsKICAgICAgX19zLl9NX3NldF9sZW5ndGgoMCk7CiAgICAKICAg IFdlIGNvdWxkIHJlbW92ZSBfTV91c2VfbG9jYWxfZGF0YSgpIGFuZCBjaGFuZ2UgdGhvc2UgdGhy ZWUgcGxhY2VzIHRvIHVzZQogICAgYSBuZXcgX01fcmVzZXQoKSBmdW5jdGlvbiB0aGF0IGRvZXM6 CiAgICAKICAgICAgX01faW5pdF9sb2NhbF9idWYoKTsKICAgICAgX01fZGF0YShfTV9sb2NhbF9k YXRhKCkpOwogICAgICBfTV9zZXRfbGVuZ3RoKDApOwogICAgCiAgICBUaGlzIGlzIGxlZnQgZm9y IGEgZnV0dXJlIGNoYW5nZS4KICAgIAogICAgbGlic3RkYysrLXYzL0NoYW5nZUxvZzoKICAgIAog ICAgICAgICAgICAqIGluY2x1ZGUvYml0cy9iYXNpY19zdHJpbmcuaCAoX01faW5pdF9sb2NhbF9i dWYoKSk6IE5ldwogICAgICAgICAgICBmdW5jdGlvbi4KICAgICAgICAgICAgKF9NX3VzZV9sb2Nh bF9kYXRhKCkpOiBVc2UgX01faW5pdF9sb2NhbF9idWYuCiAgICAgICAgICAgIChiYXNpY19zdHJp bmcoKSwgYmFzaWNfc3RyaW5nKGNvbnN0IEFsbG9jJikpCiAgICAgICAgICAgIChiYXNpY19zdHJp bmcoYmFzaWNfc3RyaW5nJiYpKQogICAgICAgICAgICAoYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmlu ZyYmLCBjb25zdCBBbGxvYyYpKTogVXNlCiAgICAgICAgICAgIF9NX2luaXRfbG9jYWxfYnVmIGlu c3RlYWQgb2YgX01fdXNlX2xvY2FsX2RhdGEoKS4KICAgICAgICAgICAgKiBpbmNsdWRlL2JpdHMv YmFzaWNfc3RyaW5nLnRjYyAoc3dhcChiYXNpY19zdHJpbmcmKSkKICAgICAgICAgICAgKF9NX2Nv bnN0cnVjdChJbkl0ZXIsIEluSXRlciwgaW5wdXRfaXRlcmF0b3JfdGFnKSkKICAgICAgICAgICAg KF9NX2NvbnN0cnVjdChJbkl0ZXIsIEluSXRlciwgZm9yd2FyZF9pdGVyYXRvcl90YWcpKQogICAg ICAgICAgICAoX01fY29uc3RydWN0KHNpemVfdHlwZSwgQ2hhclQpLCByZXNlcnZlKCkpOiBMaWtl d2lzZS4KCmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2Jhc2ljX3N0cmlu Zy5oIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9iYXNpY19zdHJpbmcuaAppbmRleCA0Zjk0 Y2Q5NjdjZi4uMGZhMzJhZmViODQgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2Jp dHMvYmFzaWNfc3RyaW5nLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9iYXNpY19z dHJpbmcuaApAQCAtMzUzLDEzICszNTMsMjMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NY WDExCiAgICAgICAvLyBFbnN1cmUgdGhhdCBfTV9sb2NhbF9idWYgaXMgdGhlIGFjdGl2ZSBtZW1i ZXIgb2YgdGhlIHVuaW9uLgogICAgICAgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18p KQogICAgICAgX0dMSUJDWFgxNF9DT05TVEVYUFIKLSAgICAgIHBvaW50ZXIKLSAgICAgIF9NX3Vz ZV9sb2NhbF9kYXRhKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHZvaWQKKyAgICAgIF9NX2lu aXRfbG9jYWxfYnVmKCkgX0dMSUJDWFhfTk9FWENFUFQKICAgICAgIHsKICNpZiBfX2NwcF9saWJf aXNfY29uc3RhbnRfZXZhbHVhdGVkCiAJaWYgKHN0ZDo6aXNfY29uc3RhbnRfZXZhbHVhdGVkKCkp CiAJICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPD0gX1NfbG9jYWxfY2FwYWNpdHk7ICsr X19pKQogCSAgICBfTV9sb2NhbF9idWZbX19pXSA9IF9DaGFyVCgpOworI2VuZGlmCisgICAgICB9 CisKKyAgICAgIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyAgICAgIF9HTElC Q1hYMTRfQ09OU1RFWFBSCisgICAgICBwb2ludGVyCisgICAgICBfTV91c2VfbG9jYWxfZGF0YSgp IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisjaWYgX19jcHBfbGliX2lzX2NvbnN0YW50X2V2 YWx1YXRlZAorCV9NX2luaXRfbG9jYWxfYnVmKCk7CiAjZW5kaWYKIAlyZXR1cm4gX01fbG9jYWxf ZGF0YSgpOwogICAgICAgfQpAQCAtNTIyLDcgKzUzMiw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9DWFgxMQogICAgICAgX0dMSUJDWFhfTk9FWENFUFRfSUYoaXNfbm90aHJvd19kZWZhdWx0 X2NvbnN0cnVjdGlibGU8X0FsbG9jPjo6dmFsdWUpCiAgICAgICA6IF9NX2RhdGFwbHVzKF9NX2xv Y2FsX2RhdGEoKSkKICAgICAgIHsKLQlfTV91c2VfbG9jYWxfZGF0YSgpOworCV9NX2luaXRfbG9j YWxfYnVmKCk7CiAJX01fc2V0X2xlbmd0aCgwKTsKICAgICAgIH0KIApAQCAtNTM0LDcgKzU0NCw3 IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DWFgxMQogICAgICAgYmFzaWNfc3RyaW5nKGNv bnN0IF9BbGxvYyYgX19hKSBfR0xJQkNYWF9OT0VYQ0VQVAogICAgICAgOiBfTV9kYXRhcGx1cyhf TV9sb2NhbF9kYXRhKCksIF9fYSkKICAgICAgIHsKLQlfTV91c2VfbG9jYWxfZGF0YSgpOworCV9N X2luaXRfbG9jYWxfYnVmKCk7CiAJX01fc2V0X2xlbmd0aCgwKTsKICAgICAgIH0KIApAQCAtNjc4 LDcgKzY4OCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DWFgxMQogICAgICAgewogCWlm IChfX3N0ci5fTV9pc19sb2NhbCgpKQogCSAgewotCSAgICAodm9pZClfTV91c2VfbG9jYWxfZGF0 YSgpOworCSAgICBfTV9pbml0X2xvY2FsX2J1ZigpOwogCSAgICB0cmFpdHNfdHlwZTo6Y29weShf TV9sb2NhbF9idWYsIF9fc3RyLl9NX2xvY2FsX2J1ZiwKIAkJCSAgICAgIF9fc3RyLmxlbmd0aCgp ICsgMSk7CiAJICB9CkBAIC03MTgsNyArNzI4LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X0NYWDExCiAgICAgICB7CiAJaWYgKF9fc3RyLl9NX2lzX2xvY2FsKCkpCiAJICB7Ci0JICAgICh2 b2lkKV9NX3VzZV9sb2NhbF9kYXRhKCk7CisJICAgIF9NX2luaXRfbG9jYWxfYnVmKCk7CiAJICAg IHRyYWl0c190eXBlOjpjb3B5KF9NX2xvY2FsX2J1ZiwgX19zdHIuX01fbG9jYWxfYnVmLAogCQkJ ICAgICAgX19zdHIubGVuZ3RoKCkgKyAxKTsKIAkgICAgX01fbGVuZ3RoKF9fc3RyLmxlbmd0aCgp KTsKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvYmFzaWNfc3RyaW5nLnRj YyBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvYmFzaWNfc3RyaW5nLnRjYwppbmRleCA0YmM5 OGYyYWVhNy4uZjBhNDRlNWU4ODEgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2Jp dHMvYmFzaWNfc3RyaW5nLnRjYworKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2Jhc2lj X3N0cmluZy50Y2MKQEAgLTc5LDcgKzc5LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZF UlNJT04KIAkgICAgICB9CiAJICAgIGVsc2UgaWYgKF9fcy5sZW5ndGgoKSkKIAkgICAgICB7Ci0J CSh2b2lkKV9NX3VzZV9sb2NhbF9kYXRhKCk7CisJCV9NX2luaXRfbG9jYWxfYnVmKCk7CiAJCXRy YWl0c190eXBlOjpjb3B5KF9NX2xvY2FsX2J1ZiwgX19zLl9NX2xvY2FsX2J1ZiwKIAkJCQkgIF9f cy5sZW5ndGgoKSArIDEpOwogCQlfTV9sZW5ndGgoX19zLmxlbmd0aCgpKTsKQEAgLTg4LDcgKzg4 LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgICAgICB9CiAJICAgIGVs c2UgaWYgKGxlbmd0aCgpKQogCSAgICAgIHsKLQkJKHZvaWQpX19zLl9NX3VzZV9sb2NhbF9kYXRh KCk7CisJCV9fcy5fTV9pbml0X2xvY2FsX2J1ZigpOwogCQl0cmFpdHNfdHlwZTo6Y29weShfX3Mu X01fbG9jYWxfYnVmLCBfTV9sb2NhbF9idWYsCiAJCQkJICBsZW5ndGgoKSArIDEpOwogCQlfX3Mu X01fbGVuZ3RoKGxlbmd0aCgpKTsKQEAgLTk5LDcgKzk5LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFN RVNQQUNFX1ZFUlNJT04KIAllbHNlCiAJICB7CiAJICAgIGNvbnN0IHNpemVfdHlwZSBfX3RtcF9j YXBhY2l0eSA9IF9fcy5fTV9hbGxvY2F0ZWRfY2FwYWNpdHk7Ci0JICAgICh2b2lkKV9fcy5fTV91 c2VfbG9jYWxfZGF0YSgpOworCSAgICBfX3MuX01faW5pdF9sb2NhbF9idWYoKTsKIAkgICAgdHJh aXRzX3R5cGU6OmNvcHkoX19zLl9NX2xvY2FsX2J1ZiwgX01fbG9jYWxfYnVmLAogCQkJICAgICAg bGVuZ3RoKCkgKyAxKTsKIAkgICAgX01fZGF0YShfX3MuX01fZGF0YSgpKTsKQEAgLTExMSw3ICsx MTEsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgY29uc3Qgc2l6ZV90 eXBlIF9fdG1wX2NhcGFjaXR5ID0gX01fYWxsb2NhdGVkX2NhcGFjaXR5OwogCSAgaWYgKF9fcy5f TV9pc19sb2NhbCgpKQogCSAgICB7Ci0JICAgICAgKHZvaWQpX01fdXNlX2xvY2FsX2RhdGEoKTsK KwkgICAgICBfTV9pbml0X2xvY2FsX2J1ZigpOwogCSAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9N X2xvY2FsX2J1ZiwgX19zLl9NX2xvY2FsX2J1ZiwKIAkJCQlfX3MubGVuZ3RoKCkgKyAxKTsKIAkg ICAgICBfX3MuX01fZGF0YShfTV9kYXRhKCkpOwpAQCAtMTc0LDExICsxNzQsMTEgQEAgX0dMSUJD WFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlzaXplX3R5cGUgX19sZW4gPSAwOwogCXNpemVf dHlwZSBfX2NhcGFjaXR5ID0gc2l6ZV90eXBlKF9TX2xvY2FsX2NhcGFjaXR5KTsKIAotCXBvaW50 ZXIgX19wID0gX01fdXNlX2xvY2FsX2RhdGEoKTsKKwlfTV9pbml0X2xvY2FsX2J1ZigpOwogCiAJ d2hpbGUgKF9fYmVnICE9IF9fZW5kICYmIF9fbGVuIDwgX19jYXBhY2l0eSkKIAkgIHsKLQkgICAg X19wW19fbGVuKytdID0gKl9fYmVnOworCSAgICBfTV9sb2NhbF9idWZbX19sZW4rK10gPSAqX19i ZWc7CiAJICAgICsrX19iZWc7CiAJICB9CiAKQEAgLTIzMCw3ICsyMzAsNyBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICBfTV9jYXBhY2l0eShfX2RuZXcpOwogCSAgfQog CWVsc2UKLQkgIF9NX3VzZV9sb2NhbF9kYXRhKCk7CisJICBfTV9pbml0X2xvY2FsX2J1ZigpOwog CiAJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMu CiAJc3RydWN0IF9HdWFyZApAQCAtMjYzLDcgKzI2Myw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAJICBfTV9jYXBhY2l0eShfX24pOwogCX0KICAgICAgIGVsc2UKLQlfTV91 c2VfbG9jYWxfZGF0YSgpOworCV9NX2luaXRfbG9jYWxfYnVmKCk7CiAKICAgICAgIGlmIChfX24p CiAJdGhpcy0+X1NfYXNzaWduKF9NX2RhdGEoKSwgX19uLCBfX2MpOwpAQCAtMzcyLDcgKzM3Miw4 IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAKICAgICAgIGlmIChfX2xlbmd0 aCA8PSBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQogCXsKLQkgIHRoaXMtPl9TX2NvcHko X01fdXNlX2xvY2FsX2RhdGEoKSwgX01fZGF0YSgpLCBfX2xlbmd0aCArIDEpOworCSAgX01faW5p dF9sb2NhbF9idWYoKTsKKwkgIHRoaXMtPl9TX2NvcHkoX01fbG9jYWxfYnVmLCBfTV9kYXRhKCks IF9fbGVuZ3RoICsgMSk7CiAJICBfTV9kZXN0cm95KF9fY2FwYWNpdHkpOwogCSAgX01fZGF0YShf TV9sb2NhbF9kYXRhKCkpOwogCX0K --0000000000006d950a06083b099a--