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 17B6C3858D35 for ; Mon, 22 May 2023 18:42:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 17B6C3858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684780965; 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=jjBPIzOWsjolv5PtzNc/bWCSSU8nvTSdbCQkQJq0WyY=; b=RNA4l9oNzC3KX7wE05oOaFnCv2h/wPsV+pBSvuYArlLpIH6U/UhCoI3i1LLr1T3IHlvjpY macQ0/stsoJ2YjUHMz+aaFb81njGj7PVxxRsx9DnKXzDR1omqFidx1hX2QEY63A6g6o+EK xAJf3B8scB6qADriIv8uOUsV/lzQ+n0= Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-460-JdZsMN_qM4-pAKmGR1kJog-1; Mon, 22 May 2023 14:42:43 -0400 X-MC-Unique: JdZsMN_qM4-pAKmGR1kJog-1 Received: by mail-ed1-f71.google.com with SMTP id 4fb4d7f45d1cf-513e9618214so1404699a12.0 for ; Mon, 22 May 2023 11:42:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684780962; x=1687372962; 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=jjBPIzOWsjolv5PtzNc/bWCSSU8nvTSdbCQkQJq0WyY=; b=QLS1367dOLu+SE7LlXTkXKhfwPD0P8lfSp4HV7Pc79LKo7TQiTa4u8luoGCGNe4pjV co49XnfHOYiblZ4fMwG+4tI7VE2nRlXFB8hNgMckYtGxSQVbqSwrGv4b5llX2P63GBi2 +wtF+ukiTy1TwiWa+vfGwo712P+i4qG7x66MGpa58RItS7FiPhVlhkiVSTcMhXdFcK0u 610II3Rqq4yaHClFgTpmbHs41Nl1Ko9/jvnJF95rkPKQNTzNGobiZWf3a2CZ3NjbFxA7 JdXexbGf6/nfM3Qe1bLGLadtAlbsYSRL8CCSxPD2LNAv/MozgXfSzwWm1YJVftEMKaNM oeSA== X-Gm-Message-State: AC+VfDxYOhVGLZl4R/zY7dkCC9R7zh2VhyLlBLgG4EzV5l8STrt3qMrB 0fmLqMcqnqnvw8pjjnYFGeDjZQq5V/FLpoGaGH3air86coOqPtXf4+4MSZWAeDbyoCwiNMcjSsF DcF3KJgZ+fb8qGan3sM+0q0+KGfTepKX6SBqgoG2nog== X-Received: by 2002:aa7:ccd7:0:b0:50c:371:e65 with SMTP id y23-20020aa7ccd7000000b0050c03710e65mr7980550edt.11.1684780962369; Mon, 22 May 2023 11:42:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5qRY6KGNY3BoL7OMtpkgREo8P0P/XxPp1NdV8jUWPxC/TfqVHzoM+ULC38iL7GFRPg6koRgEZU8YwmI26vvMY= X-Received: by 2002:aa7:ccd7:0:b0:50c:371:e65 with SMTP id y23-20020aa7ccd7000000b0050c03710e65mr7980537edt.11.1684780961899; Mon, 22 May 2023 11:42:41 -0700 (PDT) MIME-Version: 1.0 References: <20230517141622.464538-1-aldyh@redhat.com> In-Reply-To: <20230517141622.464538-1-aldyh@redhat.com> From: Aldy Hernandez Date: Mon, 22 May 2023 20:42:30 +0200 Message-ID: Subject: Re: [PATCH] Provide an API for ipa_vr. To: GCC patches Cc: Andrew MacLeod , Martin Jambor X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000c25f1e05fc4ca259" X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: --000000000000c25f1e05fc4ca259 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I've adjusted the patch with some minor cleanups that came up when I implemented the rest of the IPA revamp. Retested. OK? On Wed, May 17, 2023 at 4:16=E2=80=AFPM Aldy Hernandez w= rote: > > This patch encapsulates the ipa_vr internals into an API. It also > makes it type agnostic, in preparation for upcoming changes to IPA. > > Interestingly, there's a 0.44% improvement to IPA-cp, which I'm sure > we'll soak up with future changes in this area :). > > BTW, there's a note here: > + // vrange_storage is typeless, but we need to know what type of > + // range that is being streamed out (irange, frange, etc). AFAICT, > + // there's no way to get at the underlying type by the time we > + // stream out in write_ipcp_transformation_info. > + tree m_type; > > Could someone more IPA savvy double check this is indeed the case? > > OK for trunk? > > gcc/ChangeLog: > > * ipa-cp.cc (ipa_value_range_from_jfunc): Use new ipa_vr API. > (ipcp_store_vr_results): Same. > * ipa-prop.cc (ipa_vr::ipa_vr): New. > (ipa_vr::get_vrange): New. > (ipa_vr::set_unknown): New. > (ipa_vr::streamer_read): New. > (ipa_vr::streamer_write): New. > (write_ipcp_transformation_info): Use new ipa_vr API. > (read_ipcp_transformation_info): Same. > (ipa_vr::nonzero_p): Delete. > (ipcp_update_vr): Use new ipa_vr API. > * ipa-prop.h (class ipa_vr): Provide an API and hide internals. > * ipa-sra.cc (zap_useless_ipcp_results): Use new ipa_vr API. > * gcc.dg/ipa/pr78121.c: Adjust for vrange::dump use. > * gcc.dg/ipa/vrp1.c: Same. > * gcc.dg/ipa/vrp2.c: Same. > * gcc.dg/ipa/vrp3.c: Same. > * gcc.dg/ipa/vrp4.c: Same. > * gcc.dg/ipa/vrp5.c: Same. > * gcc.dg/ipa/vrp6.c: Same. > * gcc.dg/ipa/vrp7.c: Same. > * gcc.dg/ipa/vrp8.c: Same. > --- > gcc/ipa-cp.cc | 22 ++--- > gcc/ipa-prop.cc | 129 ++++++++++++++++------------- > gcc/ipa-prop.h | 25 ++++-- > gcc/ipa-sra.cc | 4 +- > gcc/testsuite/gcc.dg/ipa/pr78121.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp1.c | 4 +- > gcc/testsuite/gcc.dg/ipa/vrp2.c | 4 +- > gcc/testsuite/gcc.dg/ipa/vrp3.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp4.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp5.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp6.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp7.c | 2 +- > gcc/testsuite/gcc.dg/ipa/vrp8.c | 2 +- > 13 files changed, 109 insertions(+), 93 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index 8cd0fa2cae7..d4b9d4ac27e 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1947,13 +1947,11 @@ ipa_value_range_from_jfunc (ipa_node_params *info= , cgraph_edge *cs, > > idx =3D ipa_get_jf_pass_through_formal_id (jfunc); > > - if (!(*sum->m_vr)[idx].known) > + if (!(*sum->m_vr)[idx].known_p ()) > return vr; > tree vr_type =3D ipa_get_type (info, idx); > - value_range srcvr (vr_type, > - (*sum->m_vr)[idx].min, > - (*sum->m_vr)[idx].max, > - (*sum->m_vr)[idx].type); > + value_range srcvr; > + (*sum->m_vr)[idx].get_vrange (srcvr, vr_type); > > enum tree_code operation =3D ipa_get_jf_pass_through_operation (jf= unc); > > @@ -6621,25 +6619,19 @@ ipcp_store_vr_results (void) > for (unsigned i =3D 0; i < count; i++) > { > ipcp_param_lattices *plats =3D ipa_get_parm_lattices (info, i); > - ipa_vr vr; > > if (!plats->m_value_range.bottom_p () > && !plats->m_value_range.top_p () > && dbg_cnt (ipa_cp_vr)) > { > - tree min, max; > - vr.known =3D true; > - vr.type =3D get_legacy_range (plats->m_value_range.m_vr, mi= n, max); > - vr.min =3D wi::to_wide (min); > - vr.max =3D wi::to_wide (max); > + ipa_vr vr (plats->m_value_range.m_vr); > + ts->m_vr->quick_push (vr); > } > else > { > - vr.known =3D false; > - vr.type =3D VR_VARYING; > - vr.min =3D vr.max =3D wi::zero (INT_TYPE_SIZE); > + ipa_vr vr; > + ts->m_vr->quick_push (vr); > } > - ts->m_vr->quick_push (vr); > } > } > } > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index d7d70e5ec68..4ace410de49 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see > #include "symtab-clones.h" > #include "attr-fnspec.h" > #include "gimple-range.h" > +#include "value-range-storage.h" > > /* Function summary where the parameter infos are actually stored. */ > ipa_node_params_t *ipa_node_params_sum =3D NULL; > @@ -177,6 +178,66 @@ struct ipa_cst_ref_desc > static object_allocator ipa_refdesc_pool > ("IPA-PROP ref descriptions"); > > +ipa_vr::ipa_vr () > + : m_storage (NULL), > + m_type (NULL) > +{ > +} > + > +ipa_vr::ipa_vr (const vrange &r) > + : m_storage (ggc_alloc_vrange_storage (r)), > + m_type (r.type ()) > +{ > +} > + > +void > +ipa_vr::get_vrange (vrange &r, tree type) const > +{ > + m_storage->get_vrange (r, type); > +} > + > +void > +ipa_vr::set_unknown () > +{ > + if (m_storage) > + ggc_free (m_storage); > + > + m_storage =3D NULL; > +} > + > +void > +ipa_vr::streamer_read (lto_input_block *ib, data_in *data_in) > +{ > + struct bitpack_d bp =3D streamer_read_bitpack (ib); > + bool known =3D bp_unpack_value (&bp, 1); > + if (known) > + { > + Value_Range vr; > + streamer_read_value_range (ib, data_in, vr); > + if (!m_storage || !m_storage->fits_p (vr)) > + { > + if (m_storage) > + ggc_free (m_storage); > + m_storage =3D ggc_alloc_vrange_storage (vr); > + } > + m_storage->set_vrange (vr); > + } > +} > + > +void > +ipa_vr::streamer_write (output_block *ob) const > +{ > + struct bitpack_d bp =3D bitpack_create (ob->main_stream); > + bp_pack_value (&bp, !!m_storage, 1); > + streamer_write_bitpack (&bp); > + if (m_storage) > + { > + Value_Range vr (m_type); > + m_storage->get_vrange (vr, m_type); > + streamer_write_vrange (ob, vr); > + } > +} > + > /* Return true if DECL_FUNCTION_SPECIFIC_OPTIMIZATION of the decl associ= ated > with NODE should prevent us from analyzing it for the purposes of IPA= -CP. */ > > @@ -5338,19 +5399,7 @@ write_ipcp_transformation_info (output_block *ob, = cgraph_node *node, > > streamer_write_uhwi (ob, vec_safe_length (ts->m_vr)); > for (const ipa_vr &parm_vr : ts->m_vr) > - { > - struct bitpack_d bp; > - bp =3D bitpack_create (ob->main_stream); > - bp_pack_value (&bp, parm_vr.known, 1); > - streamer_write_bitpack (&bp); > - if (parm_vr.known) > - { > - streamer_write_enum (ob->main_stream, value_rang_type, > - VR_LAST, parm_vr.type); > - streamer_write_wide_int (ob, parm_vr.min); > - streamer_write_wide_int (ob, parm_vr.max); > - } > - } > + parm_vr.streamer_write (ob); > > streamer_write_uhwi (ob, vec_safe_length (ts->bits)); > for (const ipa_bits *bits_jfunc : ts->bits) > @@ -5401,16 +5450,7 @@ read_ipcp_transformation_info (lto_input_block *ib= , cgraph_node *node, > { > ipa_vr *parm_vr; > parm_vr =3D &(*ts->m_vr)[i]; > - struct bitpack_d bp; > - bp =3D streamer_read_bitpack (ib); > - parm_vr->known =3D bp_unpack_value (&bp, 1); > - if (parm_vr->known) > - { > - parm_vr->type =3D streamer_read_enum (ib, value_range_kind, > - VR_LAST); > - parm_vr->min =3D streamer_read_wide_int (ib); > - parm_vr->max =3D streamer_read_wide_int (ib); > - } > + parm_vr->streamer_read (ib, data_in); > } > } > count =3D streamer_read_uhwi (ib); > @@ -5848,19 +5888,6 @@ ipcp_update_bits (struct cgraph_node *node) > } > } > > -bool > -ipa_vr::nonzero_p (tree expr_type) const > -{ > - if (type =3D=3D VR_ANTI_RANGE && wi::eq_p (min, 0) && wi::eq_p (max, 0= )) > - return true; > - > - unsigned prec =3D TYPE_PRECISION (expr_type); > - return (type =3D=3D VR_RANGE > - && TYPE_UNSIGNED (expr_type) > - && wi::eq_p (min, wi::one (prec)) > - && wi::eq_p (max, wi::max_value (prec, TYPE_SIGN (expr_type))))= ; > -} > - > /* Update value range of formal parameters as described in > ipcp_transformation. */ > > @@ -5909,38 +5936,22 @@ ipcp_update_vr (struct cgraph_node *node) > if (!ddef || !is_gimple_reg (parm)) > continue; > > - if (vr[i].known > - && (vr[i].type =3D=3D VR_RANGE || vr[i].type =3D=3D VR_ANTI_RAN= GE)) > + if (vr[i].known_p ()) > { > tree type =3D TREE_TYPE (ddef); > - unsigned prec =3D TYPE_PRECISION (type); > - if (INTEGRAL_TYPE_P (TREE_TYPE (ddef))) > + value_range tmp; > + vr[i].get_vrange (tmp, type); > + > + if (!tmp.undefined_p () && !tmp.varying_p ()) > { > if (dump_file) > { > fprintf (dump_file, "Setting value range of param %u " > "(now %i) ", i, remapped_idx); > - fprintf (dump_file, "%s[", > - (vr[i].type =3D=3D VR_ANTI_RANGE) ? "~" : ""); > - print_decs (vr[i].min, dump_file); > - fprintf (dump_file, ", "); > - print_decs (vr[i].max, dump_file); > + tmp.dump (dump_file); > fprintf (dump_file, "]\n"); > } > - value_range v (type, > - wide_int_storage::from (vr[i].min, prec, > - TYPE_SIGN (type)), > - wide_int_storage::from (vr[i].max, prec, > - TYPE_SIGN (type)), > - vr[i].type); > - set_range_info (ddef, v); > - } > - else if (POINTER_TYPE_P (TREE_TYPE (ddef)) > - && vr[i].nonzero_p (TREE_TYPE (ddef))) > - { > - if (dump_file) > - fprintf (dump_file, "Setting nonnull for %u\n", i); > - set_ptr_nonnull (ddef); > + set_range_info (ddef, tmp); > } > } > } > diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h > index d4936d4eaff..3b580ebb903 100644 > --- a/gcc/ipa-prop.h > +++ b/gcc/ipa-prop.h > @@ -309,12 +309,25 @@ public: > class GTY(()) ipa_vr > { > public: > - /* The data fields below are valid only if known is true. */ > - bool known; > - enum value_range_kind type; > - wide_int min; > - wide_int max; > - bool nonzero_p (tree) const; > + ipa_vr (); > + ipa_vr (const vrange &); > + void set_unknown (); > + bool known_p () const { return m_storage !=3D NULL; } > + void get_vrange (vrange &, tree type) const; > + void streamer_read (lto_input_block *, data_in *); > + void streamer_write (output_block *) const; > + > +private: > + friend void gt_pch_nx (struct ipa_vr &); > + friend void gt_ggc_mx (struct ipa_vr &); > + friend void gt_pch_nx (struct ipa_vr *, gt_pointer_operator, void *); > + > + vrange_storage *m_storage; > + // vrange_storage is typeless, but we need to know what type of > + // range that is being streamed out (irange, frange, etc). AFAICT, > + // there's no way to get at the underlying type by the time we > + // stream out in write_ipcp_transformation_info. > + tree m_type; > }; > > /* A jump function for a callsite represents the values passed as actual > diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc > index 7b8260bc9e1..09503cda748 100644 > --- a/gcc/ipa-sra.cc > +++ b/gcc/ipa-sra.cc > @@ -4081,11 +4081,11 @@ zap_useless_ipcp_results (const isra_func_summary= *ifs, ipcp_transformation *ts) > bool useful_vr =3D false; > count =3D vec_safe_length (ts->m_vr); > for (unsigned i =3D 0; i < count; i++) > - if ((*ts->m_vr)[i].known) > + if ((*ts->m_vr)[i].known_p ()) > { > const isra_param_desc *desc =3D &(*ifs->m_parameters)[i]; > if (desc->locally_unused) > - (*ts->m_vr)[i].known =3D false; > + (*ts->m_vr)[i].set_unknown (); > else > useful_vr =3D true; > } > diff --git a/gcc/testsuite/gcc.dg/ipa/pr78121.c b/gcc/testsuite/gcc.dg/ip= a/pr78121.c > index 19d6eda22f8..7e30834e645 100644 > --- a/gcc/testsuite/gcc.dg/ipa/pr78121.c > +++ b/gcc/testsuite/gcc.dg/ipa/pr78121.c > @@ -13,4 +13,4 @@ static void fn1(c) unsigned char c; > > void fn3() { fn1 (267); } > > -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ) \\\[11, 35\\\]" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ).* \\\[11, .*35\\\]" "cp" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp1.c b/gcc/testsuite/gcc.dg/ipa/v= rp1.c > index e32a13c3d6a..42b8ec7785d 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp1.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp1.c > @@ -28,5 +28,5 @@ int main () > return 0; > } > > -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ) \\\[6," "cp" } } */ > -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ) \\\[0, 999\\\]" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ).* \\\[6," "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ).* \\\[0, 999\\\]" "cp" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp2.c b/gcc/testsuite/gcc.dg/ipa/v= rp2.c > index 31909bdbf24..b3ef9273891 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp2.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp2.c > @@ -31,5 +31,5 @@ int main () > return 0; > } > > -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ) \\\[4," "cp" } } */ > -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ) \\\[0, 11\\\]" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ).* \\\[4," "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\= ).* \\\[0, 11\\\]" "cp" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp3.c b/gcc/testsuite/gcc.dg/ipa/v= rp3.c > index 9b1dcf98b25..171f0341e18 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp3.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp3.c > @@ -27,4 +27,4 @@ int main () > return 0; > } > > -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) \\\[0, 9\\\]" 2 "cp" } } */ > +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) .irange. int \\\[0, 9\\\]" 2 "cp" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp4.c b/gcc/testsuite/gcc.dg/ipa/v= rp4.c > index 941f80e00b2..d02b09f2c84 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp4.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp4.c > @@ -24,5 +24,5 @@ int bar (struct st *s) > foo (&s->b); > } > > -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" = "cp" } } */ > /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp5.c b/gcc/testsuite/gcc.dg/ipa/v= rp5.c > index 571798dab51..6bbd3f16439 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp5.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp5.c > @@ -30,5 +30,5 @@ int bar (struct st *s) > foo (&arr2[1]); > } > > -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" = "cp" } } */ > /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp6.c b/gcc/testsuite/gcc.dg/ipa/v= rp6.c > index 971db443442..03e7ab93363 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp6.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp6.c > @@ -30,5 +30,5 @@ int bar (struct st *s) > foo (&b); > } > > -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */ > +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" = "cp" } } */ > /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp7.c b/gcc/testsuite/gcc.dg/ipa/v= rp7.c > index ca5aa29e975..471c622a537 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp7.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp7.c > @@ -29,4 +29,4 @@ int main () > return 0; > } > > -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) \\\[-10, 9\\\]" 1 "cp" } } */ > +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) .irange. int \\\[-10, 9\\\]" 1 "cp" } } */ > diff --git a/gcc/testsuite/gcc.dg/ipa/vrp8.c b/gcc/testsuite/gcc.dg/ipa/v= rp8.c > index 0ac5fb5277d..a01ffbcc757 100644 > --- a/gcc/testsuite/gcc.dg/ipa/vrp8.c > +++ b/gcc/testsuite/gcc.dg/ipa/vrp8.c > @@ -39,4 +39,4 @@ main () > return 0; > } > > -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) \\\[-10, 9\\\]" 1 "cp" } } */ > +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(n= ow 0\\) .irange. int \\\[-10, 9\\\]" 1 "cp" } } */ > -- > 2.40.0 > --000000000000c25f1e05fc4ca259 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Provide-an-API-for-ipa_vr.patch" Content-Disposition: attachment; filename="0001-Provide-an-API-for-ipa_vr.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lhz703q20 RnJvbSAyMTJmYjA3OTJjMGMzZGU4Nzg2NDdmZmRiNDczMTkxYzBkMzgzMmMwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogV2VkLCAxNyBNYXkgMjAyMyAxMToyOTozMiArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFByb3Zp ZGUgYW4gQVBJIGZvciBpcGFfdnIuCgpUaGlzIHBhdGNoIGVuY2Fwc3VsYXRlcyB0aGUgaXBhX3Zy IGludGVybmFscyBpbnRvIGFuIEFQSS4gIEl0IGFsc28KbWFrZXMgaXQgdHlwZSBhZ25vc3RpYywg aW4gcHJlcGFyYXRpb24gZm9yIHVwY29taW5nIGNoYW5nZXMgdG8gSVBBLgoKSW50ZXJlc3Rpbmds eSwgdGhlcmUncyBhIDAuNDQlIGltcHJvdmVtZW50IHRvIElQQS1jcCwgd2hpY2ggSSdtIHN1cmUK d2UnbGwgc29hayB1cCB3aXRoIGZ1dHVyZSBjaGFuZ2VzIGluIHRoaXMgYXJlYSA6KS4KCmdjYy9D aGFuZ2VMb2c6CgoJKiBpcGEtY3AuY2MgKGlwYV92YWx1ZV9yYW5nZV9mcm9tX2pmdW5jKTogVXNl IG5ldyBpcGFfdnIgQVBJLgoJKGlwY3Bfc3RvcmVfdnJfcmVzdWx0cyk6IFNhbWUuCgkqIGlwYS1w cm9wLmNjIChpcGFfdnI6OmlwYV92cik6IE5ldy4KCShpcGFfdnI6OmdldF92cmFuZ2UpOiBOZXcu CgkoaXBhX3ZyOjpzZXRfdW5rbm93bik6IE5ldy4KCShpcGFfdnI6OnN0cmVhbWVyX3JlYWQpOiBO ZXcuCgkoaXBhX3ZyOjpzdHJlYW1lcl93cml0ZSk6IE5ldy4KCSh3cml0ZV9pcGNwX3RyYW5zZm9y bWF0aW9uX2luZm8pOiBVc2UgbmV3IGlwYV92ciBBUEkuCgkocmVhZF9pcGNwX3RyYW5zZm9ybWF0 aW9uX2luZm8pOiBTYW1lLgoJKGlwYV92cjo6bm9uemVyb19wKTogRGVsZXRlLgoJKGlwY3BfdXBk YXRlX3ZyKTogVXNlIG5ldyBpcGFfdnIgQVBJLgoJKiBpcGEtcHJvcC5oIChjbGFzcyBpcGFfdnIp OiBQcm92aWRlIGFuIEFQSSBhbmQgaGlkZSBpbnRlcm5hbHMuCgkqIGlwYS1zcmEuY2MgKHphcF91 c2VsZXNzX2lwY3BfcmVzdWx0cyk6IFVzZSBuZXcgaXBhX3ZyIEFQSS4KCSogZ2NjLmRnL2lwYS9w cjc4MTIxLmM6IEFkanVzdCBmb3IgdnJhbmdlOjpkdW1wIHVzZS4KCSogZ2NjLmRnL2lwYS92cnAx LmM6IFNhbWUuCgkqIGdjYy5kZy9pcGEvdnJwMi5jOiBTYW1lLgoJKiBnY2MuZGcvaXBhL3ZycDMu YzogU2FtZS4KCSogZ2NjLmRnL2lwYS92cnA0LmM6IFNhbWUuCgkqIGdjYy5kZy9pcGEvdnJwNS5j OiBTYW1lLgoJKiBnY2MuZGcvaXBhL3ZycDYuYzogU2FtZS4KCSogZ2NjLmRnL2lwYS92cnA3LmM6 IFNhbWUuCgkqIGdjYy5kZy9pcGEvdnJwOC5jOiBTYW1lLgotLS0KIGdjYy9pcGEtY3AuY2MgICAg ICAgICAgICAgICAgICAgICAgfCAgMjQgKystLS0KIGdjYy9pcGEtcHJvcC5jYyAgICAgICAgICAg ICAgICAgICAgfCAxNTYgKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0KIGdjYy9pcGEtcHJv cC5oICAgICAgICAgICAgICAgICAgICAgfCAgMjkgKysrKy0tCiBnY2MvaXBhLXNyYS5jYyAgICAg ICAgICAgICAgICAgICAgIHwgICA0ICstCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvcHI3ODEy MS5jIHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMS5jICAgIHwgICA0ICst CiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMi5jICAgIHwgICA0ICstCiBnY2MvdGVzdHN1 aXRlL2djYy5kZy9pcGEvdnJwMy5jICAgIHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9p cGEvdnJwNC5jICAgIHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwNS5jICAg IHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwNi5jICAgIHwgICAyICstCiBn Y2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwNy5jICAgIHwgICAyICstCiBnY2MvdGVzdHN1aXRl L2djYy5kZy9pcGEvdnJwOC5jICAgIHwgICAyICstCiAxMyBmaWxlcyBjaGFuZ2VkLCAxNDAgaW5z ZXJ0aW9ucygrKSwgOTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2lwYS1jcC5jYyBi L2djYy9pcGEtY3AuY2MKaW5kZXggOGNkMGZhMmNhZTcuLjBmMzdiYjVlMzM2IDEwMDY0NAotLS0g YS9nY2MvaXBhLWNwLmNjCisrKyBiL2djYy9pcGEtY3AuY2MKQEAgLTE5MTksNyArMTkxOSw3IEBA IGlwYV92cl9vcGVyYXRpb25fYW5kX3R5cGVfZWZmZWN0cyAodmFsdWVfcmFuZ2UgKmRzdF92ciwK IAkgICYmICFkc3RfdnItPnVuZGVmaW5lZF9wICgpKTsKIH0KIAotLyogRGV0ZXJtaW5lIHZhbHVl X3JhbmdlIG9mIEpGVU5DIGdpdmVuIHRoYXQgSU5GTyBkZXNjcmliZXMgdGhlIGNhbGxlciBub2Rl IG9yCisvKiBEZXRlcm1pbmUgcmFuZ2Ugb2YgSkZVTkMgZ2l2ZW4gdGhhdCBJTkZPIGRlc2NyaWJl cyB0aGUgY2FsbGVyIG5vZGUgb3IKICAgIHRoZSBvbmUgaXQgaXMgaW5saW5lZCB0bywgQ1MgaXMg dGhlIGNhbGwgZ3JhcGggZWRnZSBjb3JyZXNwb25kaW5nIHRvIEpGVU5DCiAgICBhbmQgUEFSTV9U WVBFIG9mIHRoZSBwYXJhbWV0ZXIuICAqLwogCkBAIC0xOTQ3LDEzICsxOTQ3LDExIEBAIGlwYV92 YWx1ZV9yYW5nZV9mcm9tX2pmdW5jIChpcGFfbm9kZV9wYXJhbXMgKmluZm8sIGNncmFwaF9lZGdl ICpjcywKIAogICAgICAgaWR4ID0gaXBhX2dldF9qZl9wYXNzX3Rocm91Z2hfZm9ybWFsX2lkIChq ZnVuYyk7CiAKLSAgICAgIGlmICghKCpzdW0tPm1fdnIpW2lkeF0ua25vd24pCisgICAgICBpZiAo ISgqc3VtLT5tX3ZyKVtpZHhdLmtub3duX3AgKCkpCiAJcmV0dXJuIHZyOwogICAgICAgdHJlZSB2 cl90eXBlID0gaXBhX2dldF90eXBlIChpbmZvLCBpZHgpOwotICAgICAgdmFsdWVfcmFuZ2Ugc3Jj dnIgKHZyX3R5cGUsCi0JCQkgKCpzdW0tPm1fdnIpW2lkeF0ubWluLAotCQkJICgqc3VtLT5tX3Zy KVtpZHhdLm1heCwKLQkJCSAoKnN1bS0+bV92cilbaWR4XS50eXBlKTsKKyAgICAgIHZhbHVlX3Jh bmdlIHNyY3ZyOworICAgICAgKCpzdW0tPm1fdnIpW2lkeF0uZ2V0X3ZyYW5nZSAoc3JjdnIpOwog CiAgICAgICBlbnVtIHRyZWVfY29kZSBvcGVyYXRpb24gPSBpcGFfZ2V0X2pmX3Bhc3NfdGhyb3Vn aF9vcGVyYXRpb24gKGpmdW5jKTsKIApAQCAtNjYyMSwyNSArNjYxOSwxOSBAQCBpcGNwX3N0b3Jl X3ZyX3Jlc3VsdHMgKHZvaWQpCiAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7 IGkrKykKIAl7CiAJICBpcGNwX3BhcmFtX2xhdHRpY2VzICpwbGF0cyA9IGlwYV9nZXRfcGFybV9s YXR0aWNlcyAoaW5mbywgaSk7Ci0JICBpcGFfdnIgdnI7CiAKIAkgIGlmICghcGxhdHMtPm1fdmFs dWVfcmFuZ2UuYm90dG9tX3AgKCkKIAkgICAgICAmJiAhcGxhdHMtPm1fdmFsdWVfcmFuZ2UudG9w X3AgKCkKIAkgICAgICAmJiBkYmdfY250IChpcGFfY3BfdnIpKQogCSAgICB7Ci0JICAgICAgdHJl ZSBtaW4sIG1heDsKLQkgICAgICB2ci5rbm93biA9IHRydWU7Ci0JICAgICAgdnIudHlwZSA9IGdl dF9sZWdhY3lfcmFuZ2UgKHBsYXRzLT5tX3ZhbHVlX3JhbmdlLm1fdnIsIG1pbiwgbWF4KTsKLQkg ICAgICB2ci5taW4gPSB3aTo6dG9fd2lkZSAobWluKTsKLQkgICAgICB2ci5tYXggPSB3aTo6dG9f d2lkZSAobWF4KTsKKwkgICAgICBpcGFfdnIgdnIgKHBsYXRzLT5tX3ZhbHVlX3JhbmdlLm1fdnIp OworCSAgICAgIHRzLT5tX3ZyLT5xdWlja19wdXNoICh2cik7CiAJICAgIH0KIAkgIGVsc2UKIAkg ICAgewotCSAgICAgIHZyLmtub3duID0gZmFsc2U7Ci0JICAgICAgdnIudHlwZSA9IFZSX1ZBUllJ Tkc7Ci0JICAgICAgdnIubWluID0gdnIubWF4ID0gd2k6Onplcm8gKElOVF9UWVBFX1NJWkUpOwor CSAgICAgIGlwYV92ciB2cjsKKwkgICAgICB0cy0+bV92ci0+cXVpY2tfcHVzaCAodnIpOwogCSAg ICB9Ci0JICB0cy0+bV92ci0+cXVpY2tfcHVzaCAodnIpOwogCX0KICAgICB9CiB9CmRpZmYgLS1n aXQgYS9nY2MvaXBhLXByb3AuY2MgYi9nY2MvaXBhLXByb3AuY2MKaW5kZXggNjBiN2YwOTIxNGYu LmFiNmRlOWYxMGRhIDEwMDY0NAotLS0gYS9nY2MvaXBhLXByb3AuY2MKKysrIGIvZ2NjL2lwYS1w cm9wLmNjCkBAIC01Niw2ICs1Niw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09Q WUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAic3ltdGFiLWNsb25lcy5oIgogI2luY2x1ZGUg ImF0dHItZm5zcGVjLmgiCiAjaW5jbHVkZSAiZ2ltcGxlLXJhbmdlLmgiCisjaW5jbHVkZSAidmFs dWUtcmFuZ2Utc3RvcmFnZS5oIgogCiAvKiBGdW5jdGlvbiBzdW1tYXJ5IHdoZXJlIHRoZSBwYXJh bWV0ZXIgaW5mb3MgYXJlIGFjdHVhbGx5IHN0b3JlZC4gKi8KIGlwYV9ub2RlX3BhcmFtc190ICpp cGFfbm9kZV9wYXJhbXNfc3VtID0gTlVMTDsKQEAgLTE3Nyw2ICsxNzgsOTIgQEAgc3RydWN0IGlw YV9jc3RfcmVmX2Rlc2MKIHN0YXRpYyBvYmplY3RfYWxsb2NhdG9yPGlwYV9jc3RfcmVmX2Rlc2M+ IGlwYV9yZWZkZXNjX3Bvb2wKICAgKCJJUEEtUFJPUCByZWYgZGVzY3JpcHRpb25zIik7CiAKK2lw YV92cjo6aXBhX3ZyICgpCisgIDogbV9zdG9yYWdlIChOVUxMKSwKKyAgICBtX3R5cGUgKE5VTEwp Cit7Cit9CisKK2lwYV92cjo6aXBhX3ZyIChjb25zdCB2cmFuZ2UgJnIpCisgIDogbV9zdG9yYWdl IChnZ2NfYWxsb2NfdnJhbmdlX3N0b3JhZ2UgKHIpKSwKKyAgICBtX3R5cGUgKHIudHlwZSAoKSkK K3sKK30KKworYm9vbAoraXBhX3ZyOjplcXVhbF9wIChjb25zdCB2cmFuZ2UgJnIpIGNvbnN0Cit7 CisgIGdjY19jaGVja2luZ19hc3NlcnQgKCFyLnVuZGVmaW5lZF9wICgpKTsKKyAgcmV0dXJuICh0 eXBlc19jb21wYXRpYmxlX3AgKG1fdHlwZSwgci50eXBlICgpKSAmJiBtX3N0b3JhZ2UtPmVxdWFs X3AgKHIpKTsKK30KKwordm9pZAoraXBhX3ZyOjpnZXRfdnJhbmdlICh2cmFuZ2UgJnIpIGNvbnN0 Cit7CisgIG1fc3RvcmFnZS0+Z2V0X3ZyYW5nZSAociwgbV90eXBlKTsKK30KKwordm9pZAoraXBh X3ZyOjpzZXRfdW5rbm93biAoKQoreworICBpZiAobV9zdG9yYWdlKQorICAgIGdnY19mcmVlICht X3N0b3JhZ2UpOworCisgIG1fc3RvcmFnZSA9IE5VTEw7Cit9CisKK3ZvaWQKK2lwYV92cjo6c3Ry ZWFtZXJfcmVhZCAobHRvX2lucHV0X2Jsb2NrICppYiwgZGF0YV9pbiAqZGF0YV9pbikKK3sKKyAg c3RydWN0IGJpdHBhY2tfZCBicCA9IHN0cmVhbWVyX3JlYWRfYml0cGFjayAoaWIpOworICBib29s IGtub3duID0gYnBfdW5wYWNrX3ZhbHVlICgmYnAsIDEpOworICBpZiAoa25vd24pCisgICAgewor ICAgICAgVmFsdWVfUmFuZ2UgdnI7CisgICAgICBzdHJlYW1lcl9yZWFkX3ZhbHVlX3JhbmdlIChp YiwgZGF0YV9pbiwgdnIpOworICAgICAgaWYgKCFtX3N0b3JhZ2UgfHwgIW1fc3RvcmFnZS0+Zml0 c19wICh2cikpCisJeworCSAgaWYgKG1fc3RvcmFnZSkKKwkgICAgZ2djX2ZyZWUgKG1fc3RvcmFn ZSk7CisJICBtX3N0b3JhZ2UgPSBnZ2NfYWxsb2NfdnJhbmdlX3N0b3JhZ2UgKHZyKTsKKwl9Cisg ICAgICBtX3N0b3JhZ2UtPnNldF92cmFuZ2UgKHZyKTsKKyAgICAgIG1fdHlwZSA9IHZyLnR5cGUg KCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbV9zdG9yYWdlID0gTlVMTDsKKyAgICAg IG1fdHlwZSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkCitpcGFfdnI6OnN0cmVhbWVyX3dyaXRl IChvdXRwdXRfYmxvY2sgKm9iKSBjb25zdAoreworICBzdHJ1Y3QgYml0cGFja19kIGJwID0gYml0 cGFja19jcmVhdGUgKG9iLT5tYWluX3N0cmVhbSk7CisgIGJwX3BhY2tfdmFsdWUgKCZicCwgISFt X3N0b3JhZ2UsIDEpOworICBzdHJlYW1lcl93cml0ZV9iaXRwYWNrICgmYnApOworICBpZiAobV9z dG9yYWdlKQorICAgIHsKKyAgICAgIFZhbHVlX1JhbmdlIHZyIChtX3R5cGUpOworICAgICAgbV9z dG9yYWdlLT5nZXRfdnJhbmdlICh2ciwgbV90eXBlKTsKKyAgICAgIHN0cmVhbWVyX3dyaXRlX3Zy YW5nZSAob2IsIHZyKTsKKyAgICB9Cit9CisKK3ZvaWQKK2lwYV92cjo6ZHVtcCAoRklMRSAqb3V0 KSBjb25zdAoreworICBpZiAoa25vd25fcCAoKSkKKyAgICB7CisgICAgICBWYWx1ZV9SYW5nZSB2 ciAobV90eXBlKTsKKyAgICAgIG1fc3RvcmFnZS0+Z2V0X3ZyYW5nZSAodnIsIG1fdHlwZSk7Cisg ICAgICB2ci5kdW1wIChvdXQpOworICAgIH0KKyAgZWxzZQorICAgIGZwcmludGYgKG91dCwgIk5P IFJBTkdFIik7Cit9CisKIC8qIFJldHVybiB0cnVlIGlmIERFQ0xfRlVOQ1RJT05fU1BFQ0lGSUNf T1BUSU1JWkFUSU9OIG9mIHRoZSBkZWNsIGFzc29jaWF0ZWQKICAgIHdpdGggTk9ERSBzaG91bGQg cHJldmVudCB1cyBmcm9tIGFuYWx5emluZyBpdCBmb3IgdGhlIHB1cnBvc2VzIG9mIElQQS1DUC4g ICovCiAKQEAgLTUzMzcsMTkgKzU0MjQsNyBAQCB3cml0ZV9pcGNwX3RyYW5zZm9ybWF0aW9uX2lu Zm8gKG91dHB1dF9ibG9jayAqb2IsIGNncmFwaF9ub2RlICpub2RlLAogCiAgIHN0cmVhbWVyX3dy aXRlX3Vod2kgKG9iLCB2ZWNfc2FmZV9sZW5ndGggKHRzLT5tX3ZyKSk7CiAgIGZvciAoY29uc3Qg aXBhX3ZyICZwYXJtX3ZyIDogdHMtPm1fdnIpCi0gICAgewotICAgICAgc3RydWN0IGJpdHBhY2tf ZCBicDsKLSAgICAgIGJwID0gYml0cGFja19jcmVhdGUgKG9iLT5tYWluX3N0cmVhbSk7Ci0gICAg ICBicF9wYWNrX3ZhbHVlICgmYnAsIHBhcm1fdnIua25vd24sIDEpOwotICAgICAgc3RyZWFtZXJf d3JpdGVfYml0cGFjayAoJmJwKTsKLSAgICAgIGlmIChwYXJtX3ZyLmtub3duKQotCXsKLQkgIHN0 cmVhbWVyX3dyaXRlX2VudW0gKG9iLT5tYWluX3N0cmVhbSwgdmFsdWVfcmFuZ190eXBlLAotCQkJ ICAgICAgIFZSX0xBU1QsIHBhcm1fdnIudHlwZSk7Ci0JICBzdHJlYW1lcl93cml0ZV93aWRlX2lu dCAob2IsIHBhcm1fdnIubWluKTsKLQkgIHN0cmVhbWVyX3dyaXRlX3dpZGVfaW50IChvYiwgcGFy bV92ci5tYXgpOwotCX0KLSAgICB9CisgICAgcGFybV92ci5zdHJlYW1lcl93cml0ZSAob2IpOwog CiAgIHN0cmVhbWVyX3dyaXRlX3Vod2kgKG9iLCB2ZWNfc2FmZV9sZW5ndGggKHRzLT5iaXRzKSk7 CiAgIGZvciAoY29uc3QgaXBhX2JpdHMgKmJpdHNfamZ1bmMgOiB0cy0+Yml0cykKQEAgLTU0MDAs MTYgKzU0NzUsNyBAQCByZWFkX2lwY3BfdHJhbnNmb3JtYXRpb25faW5mbyAobHRvX2lucHV0X2Js b2NrICppYiwgY2dyYXBoX25vZGUgKm5vZGUsCiAJewogCSAgaXBhX3ZyICpwYXJtX3ZyOwogCSAg cGFybV92ciA9ICYoKnRzLT5tX3ZyKVtpXTsKLQkgIHN0cnVjdCBiaXRwYWNrX2QgYnA7Ci0JICBi cCA9IHN0cmVhbWVyX3JlYWRfYml0cGFjayAoaWIpOwotCSAgcGFybV92ci0+a25vd24gPSBicF91 bnBhY2tfdmFsdWUgKCZicCwgMSk7Ci0JICBpZiAocGFybV92ci0+a25vd24pCi0JICAgIHsKLQkg ICAgICBwYXJtX3ZyLT50eXBlID0gc3RyZWFtZXJfcmVhZF9lbnVtIChpYiwgdmFsdWVfcmFuZ2Vf a2luZCwKLQkJCQkJCSAgVlJfTEFTVCk7Ci0JICAgICAgcGFybV92ci0+bWluID0gc3RyZWFtZXJf cmVhZF93aWRlX2ludCAoaWIpOwotCSAgICAgIHBhcm1fdnItPm1heCA9IHN0cmVhbWVyX3JlYWRf d2lkZV9pbnQgKGliKTsKLQkgICAgfQorCSAgcGFybV92ci0+c3RyZWFtZXJfcmVhZCAoaWIsIGRh dGFfaW4pOwogCX0KICAgICB9CiAgIGNvdW50ID0gc3RyZWFtZXJfcmVhZF91aHdpIChpYik7CkBA IC01ODQ3LDE5ICs1OTEzLDYgQEAgaXBjcF91cGRhdGVfYml0cyAoc3RydWN0IGNncmFwaF9ub2Rl ICpub2RlKQogICAgIH0KIH0KIAotYm9vbAotaXBhX3ZyOjpub256ZXJvX3AgKHRyZWUgZXhwcl90 eXBlKSBjb25zdAotewotICBpZiAodHlwZSA9PSBWUl9BTlRJX1JBTkdFICYmIHdpOjplcV9wICht aW4sIDApICYmIHdpOjplcV9wIChtYXgsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIHVuc2ln bmVkIHByZWMgPSBUWVBFX1BSRUNJU0lPTiAoZXhwcl90eXBlKTsKLSAgcmV0dXJuICh0eXBlID09 IFZSX1JBTkdFCi0JICAmJiBUWVBFX1VOU0lHTkVEIChleHByX3R5cGUpCi0JICAmJiB3aTo6ZXFf cCAobWluLCB3aTo6b25lIChwcmVjKSkKLQkgICYmIHdpOjplcV9wIChtYXgsIHdpOjptYXhfdmFs dWUgKHByZWMsIFRZUEVfU0lHTiAoZXhwcl90eXBlKSkpKTsKLX0KLQogLyogVXBkYXRlIHZhbHVl IHJhbmdlIG9mIGZvcm1hbCBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBpbgogICAgaXBjcF90cmFu c2Zvcm1hdGlvbi4gICovCiAKQEAgLTU5MDgsMzggKzU5NjEsMjEgQEAgaXBjcF91cGRhdGVfdnIg KHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSkKICAgICAgIGlmICghZGRlZiB8fCAhaXNfZ2ltcGxl X3JlZyAocGFybSkpCiAJY29udGludWU7CiAKLSAgICAgIGlmICh2cltpXS5rbm93bgotCSAgJiYg KHZyW2ldLnR5cGUgPT0gVlJfUkFOR0UgfHwgdnJbaV0udHlwZSA9PSBWUl9BTlRJX1JBTkdFKSkK KyAgICAgIGlmICh2cltpXS5rbm93bl9wICgpKQogCXsKLQkgIHRyZWUgdHlwZSA9IFRSRUVfVFlQ RSAoZGRlZik7Ci0JICB1bnNpZ25lZCBwcmVjID0gVFlQRV9QUkVDSVNJT04gKHR5cGUpOwotCSAg aWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChkZGVmKSkpCisJICB2YWx1ZV9yYW5nZSB0 bXA7CisJICB2cltpXS5nZXRfdnJhbmdlICh0bXApOworCisJICBpZiAoIXRtcC51bmRlZmluZWRf cCAoKSAmJiAhdG1wLnZhcnlpbmdfcCAoKSkKIAkgICAgewogCSAgICAgIGlmIChkdW1wX2ZpbGUp CiAJCXsKIAkJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJTZXR0aW5nIHZhbHVlIHJhbmdlIG9mIHBh cmFtICV1ICIKIAkJCSAgICIobm93ICVpKSAiLCBpLCByZW1hcHBlZF9pZHgpOwotCQkgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIiVzWyIsCi0JCQkgICAodnJbaV0udHlwZSA9PSBWUl9BTlRJX1JBTkdF KSA/ICJ+IiA6ICIiKTsKLQkJICBwcmludF9kZWNzICh2cltpXS5taW4sIGR1bXBfZmlsZSk7Ci0J CSAgZnByaW50ZiAoZHVtcF9maWxlLCAiLCAiKTsKLQkJICBwcmludF9kZWNzICh2cltpXS5tYXgs IGR1bXBfZmlsZSk7CisJCSAgdG1wLmR1bXAgKGR1bXBfZmlsZSk7CiAJCSAgZnByaW50ZiAoZHVt cF9maWxlLCAiXVxuIik7CiAJCX0KLQkgICAgICB2YWx1ZV9yYW5nZSB2ICh0eXBlLAotCQkJICAg ICB3aWRlX2ludF9zdG9yYWdlOjpmcm9tICh2cltpXS5taW4sIHByZWMsCi0JCQkJCQkgICAgIFRZ UEVfU0lHTiAodHlwZSkpLAotCQkJICAgICB3aWRlX2ludF9zdG9yYWdlOjpmcm9tICh2cltpXS5t YXgsIHByZWMsCi0JCQkJCQkgICAgIFRZUEVfU0lHTiAodHlwZSkpLAotCQkJICAgICB2cltpXS50 eXBlKTsKLQkgICAgICBzZXRfcmFuZ2VfaW5mbyAoZGRlZiwgdik7Ci0JICAgIH0KLQkgIGVsc2Ug aWYgKFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGRkZWYpKQotCQkgICAmJiB2cltpXS5ub256 ZXJvX3AgKFRSRUVfVFlQRSAoZGRlZikpKQotCSAgICB7Ci0JICAgICAgaWYgKGR1bXBfZmlsZSkK LQkJZnByaW50ZiAoZHVtcF9maWxlLCAiU2V0dGluZyBub25udWxsIGZvciAldVxuIiwgaSk7Ci0J ICAgICAgc2V0X3B0cl9ub25udWxsIChkZGVmKTsKKwkgICAgICBzZXRfcmFuZ2VfaW5mbyAoZGRl ZiwgdG1wKTsKIAkgICAgfQogCX0KICAgICB9CmRpZmYgLS1naXQgYS9nY2MvaXBhLXByb3AuaCBi L2djYy9pcGEtcHJvcC5oCmluZGV4IGQ0OTM2ZDRlYWZmLi42NThiZTJmNTk1MiAxMDA2NDQKLS0t IGEvZ2NjL2lwYS1wcm9wLmgKKysrIGIvZ2NjL2lwYS1wcm9wLmgKQEAgLTMwOSwxMiArMzA5LDI5 IEBAIHB1YmxpYzoKIGNsYXNzIEdUWSgoKSkgaXBhX3ZyCiB7CiBwdWJsaWM6Ci0gIC8qIFRoZSBk YXRhIGZpZWxkcyBiZWxvdyBhcmUgdmFsaWQgb25seSBpZiBrbm93biBpcyB0cnVlLiAgKi8KLSAg Ym9vbCBrbm93bjsKLSAgZW51bSB2YWx1ZV9yYW5nZV9raW5kIHR5cGU7Ci0gIHdpZGVfaW50IG1p bjsKLSAgd2lkZV9pbnQgbWF4OwotICBib29sIG5vbnplcm9fcCAodHJlZSkgY29uc3Q7CisgIGlw YV92ciAoKTsKKyAgaXBhX3ZyIChjb25zdCB2cmFuZ2UgJik7CisgIHZvaWQgc2V0X3Vua25vd24g KCk7CisgIGJvb2wga25vd25fcCAoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2UgIT0gTlVMTDsg fQorICB0cmVlIHR5cGUgKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgIHZvaWQgZ2V0X3Zy YW5nZSAodnJhbmdlICYpIGNvbnN0OworICBib29sIGVxdWFsX3AgKGNvbnN0IHZyYW5nZSAmKSBj b25zdDsKKyAgY29uc3QgdnJhbmdlX3N0b3JhZ2UgKnN0b3JhZ2UgKCkgY29uc3QgeyByZXR1cm4g bV9zdG9yYWdlOyB9CisgIHZvaWQgc3RyZWFtZXJfcmVhZCAobHRvX2lucHV0X2Jsb2NrICosIGRh dGFfaW4gKik7CisgIHZvaWQgc3RyZWFtZXJfd3JpdGUgKG91dHB1dF9ibG9jayAqKSBjb25zdDsK KyAgdm9pZCBkdW1wIChGSUxFICopIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgdm9pZCBn dF9wY2hfbnggKHN0cnVjdCBpcGFfdnIgJik7CisgIGZyaWVuZCB2b2lkIGd0X2dnY19teCAoc3Ry dWN0IGlwYV92ciAmKTsKKyAgZnJpZW5kIHZvaWQgZ3RfcGNoX254IChzdHJ1Y3QgaXBhX3ZyICos IGd0X3BvaW50ZXJfb3BlcmF0b3IsIHZvaWQgKik7CisKKyAgdnJhbmdlX3N0b3JhZ2UgKm1fc3Rv cmFnZTsKKyAgLy8gdnJhbmdlX3N0b3JhZ2UgaXMgdHlwZWxlc3MsIGJ1dCB3ZSBuZWVkIHRvIGtu b3cgd2hhdCB0eXBlIG9mCisgIC8vIHJhbmdlIGlzIGJlaW5nIHN0cmVhbWVkIG91dCAoaXJhbmdl LCBmcmFuZ2UsIGV0YykuICBBRkFJQ1QsCisgIC8vIHRoZXJlJ3Mgbm8gd2F5IHRvIGdldCBhdCB0 aGUgdW5kZXJseWluZyB0eXBlIGJ5IHRoZSB0aW1lIHdlCisgIC8vIHN0cmVhbSBvdXQgaW4gd3Jp dGVfaXBjcF90cmFuc2Zvcm1hdGlvbl9pbmZvLgorICB0cmVlIG1fdHlwZTsKIH07CiAKIC8qIEEg anVtcCBmdW5jdGlvbiBmb3IgYSBjYWxsc2l0ZSByZXByZXNlbnRzIHRoZSB2YWx1ZXMgcGFzc2Vk IGFzIGFjdHVhbApkaWZmIC0tZ2l0IGEvZ2NjL2lwYS1zcmEuY2MgYi9nY2MvaXBhLXNyYS5jYwpp bmRleCA3MjMwNTIyNTI2Zi4uM2ZlZThmYjIyY2UgMTAwNjQ0Ci0tLSBhL2djYy9pcGEtc3JhLmNj CisrKyBiL2djYy9pcGEtc3JhLmNjCkBAIC00MDgxLDExICs0MDgxLDExIEBAIHphcF91c2VsZXNz X2lwY3BfcmVzdWx0cyAoY29uc3QgaXNyYV9mdW5jX3N1bW1hcnkgKmlmcywgaXBjcF90cmFuc2Zv cm1hdGlvbiAqdHMpCiAgIGJvb2wgdXNlZnVsX3ZyID0gZmFsc2U7CiAgIGNvdW50ID0gdmVjX3Nh ZmVfbGVuZ3RoICh0cy0+bV92cik7CiAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsg aSsrKQotICAgIGlmICgoKnRzLT5tX3ZyKVtpXS5rbm93bikKKyAgICBpZiAoKCp0cy0+bV92cilb aV0ua25vd25fcCAoKSkKICAgICAgIHsKIAljb25zdCBpc3JhX3BhcmFtX2Rlc2MgKmRlc2MgPSAm KCppZnMtPm1fcGFyYW1ldGVycylbaV07CiAJaWYgKGRlc2MtPmxvY2FsbHlfdW51c2VkKQotCSAg KCp0cy0+bV92cilbaV0ua25vd24gPSBmYWxzZTsKKwkgICgqdHMtPm1fdnIpW2ldLnNldF91bmtu b3duICgpOwogCWVsc2UKIAkgIHVzZWZ1bF92ciA9IHRydWU7CiAgICAgICB9CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvcHI3ODEyMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvaXBhL3ByNzgxMjEuYwppbmRleCAxOWQ2ZWRhMjJmOC4uN2UzMDgzNGU2NDUgMTAwNjQ0Ci0t LSBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS9wcjc4MTIxLmMKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvaXBhL3ByNzgxMjEuYwpAQCAtMTMsNCArMTMsNCBAQCBzdGF0aWMgdm9pZCBmbjEo YykgdW5zaWduZWQgY2hhciBjOwogCiB2b2lkIGZuMygpIHsgZm4xICgyNjcpOyB9CiAKLS8qIHsg ZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJTZXR0aW5nIHZhbHVlIHJhbmdlIG9mIHBhcmFtIDAg XFwobm93IDBcXCkgXFxcWzExLCAzNVxcXF0iICJjcCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1pcGEtZHVtcCAiU2V0dGluZyB2YWx1ZSByYW5nZSBvZiBwYXJhbSAwIFxcKG5vdyAwXFwp LiogXFxcWzExLCAuKjM1XFxcXSIgImNwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL2lwYS92cnAxLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMS5jCmlu ZGV4IGUzMmExM2MzZDZhLi40MmI4ZWM3Nzg1ZCAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvaXBhL3ZycDEuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMS5jCkBA IC0yOCw1ICsyOCw1IEBAIGludCBtYWluICgpCiAgIHJldHVybiAwOwogfQogCi0vKiB7IGRnLWZp bmFsIHsgc2Nhbi1pcGEtZHVtcCAiU2V0dGluZyB2YWx1ZSByYW5nZSBvZiBwYXJhbSAwIFxcKG5v dyAwXFwpIFxcXFs2LCIgImNwIiB9IH0gKi8KLS8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1w ICJTZXR0aW5nIHZhbHVlIHJhbmdlIG9mIHBhcmFtIDAgXFwobm93IDBcXCkgXFxcWzAsIDk5OVxc XF0iICJjcCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcCAiU2V0dGluZyB2 YWx1ZSByYW5nZSBvZiBwYXJhbSAwIFxcKG5vdyAwXFwpLiogXFxcWzYsIiAiY3AiIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAgIlNldHRpbmcgdmFsdWUgcmFuZ2Ugb2YgcGFy YW0gMCBcXChub3cgMFxcKS4qIFxcXFswLCA5OTlcXFxdIiAiY3AiIH0gfSAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRn L2lwYS92cnAyLmMKaW5kZXggMzE5MDliZGJmMjQuLmIzZWY5MjczODkxIDEwMDY0NAotLS0gYS9n Y2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMi5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRn L2lwYS92cnAyLmMKQEAgLTMxLDUgKzMxLDUgQEAgaW50IG1haW4gKCkKICAgcmV0dXJuIDA7CiB9 CiAKLS8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJTZXR0aW5nIHZhbHVlIHJhbmdlIG9m IHBhcmFtIDAgXFwobm93IDBcXCkgXFxcWzQsIiAiY3AiIH0gfSAqLwotLyogeyBkZy1maW5hbCB7 IHNjYW4taXBhLWR1bXAgIlNldHRpbmcgdmFsdWUgcmFuZ2Ugb2YgcGFyYW0gMCBcXChub3cgMFxc KSBcXFxbMCwgMTFcXFxdIiAiY3AiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1 bXAgIlNldHRpbmcgdmFsdWUgcmFuZ2Ugb2YgcGFyYW0gMCBcXChub3cgMFxcKS4qIFxcXFs0LCIg ImNwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJTZXR0aW5nIHZhbHVl IHJhbmdlIG9mIHBhcmFtIDAgXFwobm93IDBcXCkuKiBcXFxbMCwgMTFcXFxdIiAiY3AiIH0gfSAq LwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDMuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLmRnL2lwYS92cnAzLmMKaW5kZXggOWIxZGNmOThiMjUuLjE3MWYwMzQxZTE4IDEw MDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwMy5jCisrKyBiL2djYy90ZXN0 c3VpdGUvZ2NjLmRnL2lwYS92cnAzLmMKQEAgLTI3LDQgKzI3LDQgQEAgaW50IG1haW4gKCkKICAg cmV0dXJuIDA7CiB9CiAKLS8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wLXRpbWVzICJTZXR0 aW5nIHZhbHVlIHJhbmdlIG9mIHBhcmFtIDAgXFwobm93IDBcXCkgXFxcWzAsIDlcXFxdIiAyICJj cCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcC10aW1lcyAiU2V0dGluZyB2 YWx1ZSByYW5nZSBvZiBwYXJhbSAwIFxcKG5vdyAwXFwpIC5pcmFuZ2UuIGludCBcXFxbMCwgOVxc XF0iIDIgImNwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92 cnA0LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwNC5jCmluZGV4IDk0MWY4MGUwMGIy Li5kMDJiMDlmMmM4NCAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDQu YworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwNC5jCkBAIC0yNCw1ICsyNCw1IEBA IGludCBiYXIgKHN0cnVjdCBzdCAqcykKICAgZm9vICgmcy0+Yik7CiB9CiAKLS8qIHsgZGctZmlu YWwgeyBzY2FuLWlwYS1kdW1wICJTZXR0aW5nIG5vbm51bGwgZm9yIDAiICJjcCIgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcCAiU2V0dGluZyB2YWx1ZSByYW5nZS4qIFxcXFsx LCBcXCtJTkZcXFxdIiAiY3AiIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w LXRpbWVzICJpZiIgMSAidnJwMSIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9pcGEvdnJwNS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDUuYwppbmRleCA1 NzE3OThkYWI1MS4uNmJiZDNmMTY0MzkgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLmRn L2lwYS92cnA1LmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDUuYwpAQCAtMzAs NSArMzAsNSBAQCBpbnQgYmFyIChzdHJ1Y3Qgc3QgKnMpCiAgIGZvbyAoJmFycjJbMV0pOwogfQog Ci0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcCAiU2V0dGluZyBub25udWxsIGZvciAwIiAi Y3AiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAgIlNldHRpbmcgdmFsdWUg cmFuZ2UuKiBcXFxbMSwgXFwrSU5GXFxcXSIgImNwIiB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcC10aW1lcyAiaWYiIDEgInZycDEiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDYuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92 cnA2LmMKaW5kZXggOTcxZGI0NDM0NDIuLjAzZTdhYjkzMzYzIDEwMDY0NAotLS0gYS9nY2MvdGVz dHN1aXRlL2djYy5kZy9pcGEvdnJwNi5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92 cnA2LmMKQEAgLTMwLDUgKzMwLDUgQEAgaW50IGJhciAoc3RydWN0IHN0ICpzKQogICBmb28gKCZi KTsKIH0KIAotLyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAgIlNldHRpbmcgbm9ubnVsbCBm b3IgMCIgImNwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJTZXR0aW5n IHZhbHVlIHJhbmdlLiogXFxcWzEsIFxcK0lORlxcXF0iICJjcCIgfSB9ICovCiAvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgImlmIiAxICJ2cnAxIiB9IH0gKi8KZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92cnA3LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy9pcGEvdnJwNy5jCmluZGV4IGNhNWFhMjllOTc1Li40NzFjNjIyYTUzNyAxMDA2NDQKLS0tIGEv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDcuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy9pcGEvdnJwNy5jCkBAIC0yOSw0ICsyOSw0IEBAIGludCBtYWluICgpCiAgIHJldHVybiAwOwog fQogCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcC10aW1lcyAiU2V0dGluZyB2YWx1ZSBy YW5nZSBvZiBwYXJhbSAwIFxcKG5vdyAwXFwpIFxcXFstMTAsIDlcXFxdIiAxICJjcCIgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcC10aW1lcyAiU2V0dGluZyB2YWx1ZSByYW5n ZSBvZiBwYXJhbSAwIFxcKG5vdyAwXFwpIC5pcmFuZ2UuIGludCBcXFxbLTEwLCA5XFxcXSIgMSAi Y3AiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ZycDguYyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92cnA4LmMKaW5kZXggMGFjNWZiNTI3N2QuLmEwMWZm YmNjNzU3IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvdnJwOC5jCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2lwYS92cnA4LmMKQEAgLTM5LDQgKzM5LDQgQEAgbWFpbiAo KQogICByZXR1cm4gMDsKIH0KIAotLyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAtdGltZXMg IlNldHRpbmcgdmFsdWUgcmFuZ2Ugb2YgcGFyYW0gMCBcXChub3cgMFxcKSBcXFxbLTEwLCA5XFxc XSIgMSAiY3AiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAtdGltZXMgIlNl dHRpbmcgdmFsdWUgcmFuZ2Ugb2YgcGFyYW0gMCBcXChub3cgMFxcKSAuaXJhbmdlLiBpbnQgXFxc Wy0xMCwgOVxcXF0iIDEgImNwIiB9IH0gKi8KLS0gCjIuNDAuMQoK --000000000000c25f1e05fc4ca259--