From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o90.zoho.com (sender4-pp-o90.zoho.com [136.143.188.90]) by sourceware.org (Postfix) with ESMTPS id E49FC3858C39; Fri, 21 Jan 2022 23:41:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E49FC3858C39 ARC-Seal: i=1; a=rsa-sha256; t=1642808479; cv=none; d=zohomail.com; s=zohoarc; b=i3jtB/v2hJO95JcLkukvigy8LQT5vnssWaJMBkB991u3qPjbMxJ1qcEmNAFB9wy139dakTFn8K0vCUy5vQpIkkJ0bd9f7Ev7+lQzUgc4FllihEnX8A6FvrY2VkY9DcJPVELeqpnOV6fhcGfYm4Uq6biFCjMh24A1Y599kP7ByqQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1642808479; h=Content-Type:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=CoLol0r+oHjC+S4ez8sK6StsUxdtqjXtrFR4J3Km+mE=; b=M0I7+lYVEEqSej9cLNn2ky/Ma6eWUxoj1seMafIoxVuCUxzkqQyiXDtHMsfpyupkcrW0jfoaP3YBmkeGAEeWjNM79bfhhR4bQzAA2GmY/NsIx0EKEks3jBusM7OSKoGl1Gm7NFtikFV8T8/eF9Nx/8HdrzElEkWEiuC6zgyrzS0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=zoho.com; spf=pass smtp.mailfrom=bouanto@zoho.com; dmarc=pass header.from= Received: from [192.168.1.174] (38.87.11.6 [38.87.11.6]) by mx.zohomail.com with SMTPS id 1642808479296830.1589692451957; Fri, 21 Jan 2022 15:41:19 -0800 (PST) Message-ID: <1cb2b6d3e9a1afb6135a9dc1a97e85ba8c3a4a0d.camel@zoho.com> Subject: Re: [PATCH] libgccjit: Add support for bitcasts [PR104071] From: Antoni Boucher To: David Malcolm , gcc-patches@gcc.gnu.org, jit@gcc.gnu.org Date: Fri, 21 Jan 2022 18:41:17 -0500 In-Reply-To: References: <13bdd05cfd7006a332ec785ab371356f0354db4d.camel@zoho.com> <19fe391c6c77e0e38acdcaf7e864651849913d46.camel@zoho.com> Content-Type: multipart/mixed; boundary="=-B4q20x/5r5N5MCKLGHsV" User-Agent: Evolution 3.42.3 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: jit@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Jit mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Jan 2022 23:41:29 -0000 --=-B4q20x/5r5N5MCKLGHsV Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi. Here's the updated patch. See comments below. Le mardi 18 janvier 2022 =C3=A0 18:06 -0500, David Malcolm a =C3=A9crit=C2= =A0: > On Mon, 2022-01-17 at 19:30 -0500, Antoni Boucher via Gcc-patches > wrote: > > I was missing the define, so I added it. > > Here's the new patch with it. >=20 > Thanks for the patch. >=20 > > Le lundi 17 janvier 2022 =C3=A0 17:18 -0500, Antoni Boucher via Jit a > > =C3=A9crit=C2=A0: > > > Hi. > > > This patch add support for bitcasts in libgccjit. > > >=20 > > > It passes the JIT tests, but since I added a function in tree.c, > > > I > > > wonder if I should run the whole testsuite. >=20 > We're in stage 4 for GCC 12 now, so we need to be especially careful > and conservative about every change.=C2=A0 A strict reading on the rules > is > that we shouldn't be adding new features - but if they're confined to > libgccjit we may be able to get release manager approval. Ok, if the 4 patches currently being reviewed (and listed here: https://github.com/antoyo/libgccjit-patches) were included in gcc 12, I'd be able to build rustc_codegen_gcc with an unpatched gcc. It is to be noted however, that I'll need more patches for future work. Off the top of my head, I'll at least need a patch for the inline attribute, try/catch and target-specific builtins. The last 2 features will probably take some time to implement, so I'll let you judge if you think it's worth merging the 4 patches currently being reviewed for gcc 12. >=20 > > >=20 > > > David, you can now disregard my question in my email about 128- > > > bit > > > integers regarding my issue with initialize_sizetypes being > > > called > > > multiple times because this patch fix this issue. > > > I turns out there was a cache of types that needed to be cleared > > > when > > > you initialize the JIT. > > >=20 > > > The check for sizes is pending, because it requires the updates > > > to > > > get_size I made in my patch for 128-bit integers. >=20 > Sorry, I seem to have mislaid that patch; do you have the "Subject" > line handy? I recently sent an email with that patch updated, but here's the subject line: [PATCH] libgccjit: Add support for sized integer types, including 128- bit integers [PR95325] >=20 > Do you have a list of the patches I need to review? Yes, on this repo: https://github.com/antoyo/libgccjit-patches They are outdated but I can update them if you want. >=20 > As for this patch, overall I like it, but there are various nits... >=20 > > >=20 > > > Thanks for the review! >=20 > > 2022-01-17=C2=A0 Antoni Boucher > >=20 > > gcc/jit/ > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PR target/104071 >=20 > Should be "jit" rather than "target". >=20 > Various source files are now .cc rather than .c after yesterday's big > renaming. >=20 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* docs/topics/compatibi= lity.rst (LIBGCCJIT_ABI_20): New ABI > > tag. > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* docs/topics/expressio= ns.rst: Add documentation for the > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0function gcc_jit_contex= t_new_bitcast. > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* dummy-frontend.c: cle= ar the cache of non-standard integer > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0types to avoid having i= ssues with some optimizations of > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bitcast where the SSA_N= AME will have a size of a cached > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0integer type that shoul= d have been invalidated, causing a > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0comparison of integer c= onstant to fail. > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit-playback.c: New f= unction (new_bitcast). > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit-playback.h: New f= unction (new_bitcast). > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit-recording.c: New = functions (new_bitcast, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bitcast::replay_into, b= itcast::visit_children, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bitcast::make_debug_str= ing, bitcast::write_reproducer). > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit-recording.h: New = calss (bitcast) and new function > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(new_bitcast, bitcast::= replay_into, > > bitcast::visit_children, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bitcast::make_debug_str= ing, bitcast::write_reproducer, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bitcast::get_precedence= ). > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* libgccjit.c: New func= tion (gcc_jit_context_new_bitcast) > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* libgccjit.h: New func= tion (gcc_jit_context_new_bitcast) > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* libgccjit.map (LIBGCC= JIT_ABI_20): New ABI tag. > >=20 > > gcc/testsuite/ > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PR target/104071 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit.dg/all-non-failin= g-tests.h: Add new test-bitcast. > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* jit.dg/test-bitcast.c= : New test. > >=20 > > gcc/ > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PR target/104071 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* tree.c: New function > > (clear_nonstandard_integer_type_cache). > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* tree.h: New function > > (clear_nonstandard_integer_type_cache). > > --- > > =C2=A0gcc/jit/docs/topics/compatibility.rst=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0 9 +++ > > =C2=A0gcc/jit/docs/topics/expressions.rst=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 | 17 +++++ > > =C2=A0gcc/jit/dummy-frontend.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 |=C2=A0 2 + > > =C2=A0gcc/jit/jit-playback.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 | 13 ++++ > > =C2=A0gcc/jit/jit-playback.h=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0 5 ++ > > =C2=A0gcc/jit/jit-recording.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | 66 > > ++++++++++++++++++++ > > =C2=A0gcc/jit/jit-recording.h=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | 32 ++++++++++ > > =C2=A0gcc/jit/libgccjit.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 28 +++++++++ > > =C2=A0gcc/jit/libgccjit.h=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 15 +++++ > > =C2=A0gcc/jit/libgccjit.map=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0 6 ++ > > =C2=A0gcc/testsuite/jit.dg/all-non-failing-tests.h | 10 +++ > > =C2=A0gcc/testsuite/jit.dg/test-bitcast.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 | 60 > > ++++++++++++++++++ > > =C2=A0gcc/tree.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= |=C2=A0 8 +++ > > =C2=A0gcc/tree.h=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= |=C2=A0 1 + > > =C2=A014 files changed, 272 insertions(+) > > =C2=A0create mode 100644 gcc/testsuite/jit.dg/test-bitcast.c > >=20 > > diff --git a/gcc/jit/docs/topics/compatibility.rst > > b/gcc/jit/docs/topics/compatibility.rst > > index 16cebe31a10..b5a6b704dda 100644 > > --- a/gcc/jit/docs/topics/compatibility.rst > > +++ b/gcc/jit/docs/topics/compatibility.rst > > @@ -302,3 +302,12 @@ thread-local storage model of a variable: > > =C2=A0section of a variable: > > =C2=A0 > > =C2=A0=C2=A0 * :func:`gcc_jit_lvalue_set_link_section` > > + > > +.. _LIBGCCJIT_ABI_20: > > + > > +``LIBGCCJIT_ABI_20`` > > +----------------------- > > +``LIBGCCJIT_ABI_20`` covers the addition of an API entrypoint to > > bitcast a > > +value from one type to another: > > + > > +=C2=A0 * :func:`gcc_jit_context_new_bitcast` > > diff --git a/gcc/jit/docs/topics/expressions.rst > > b/gcc/jit/docs/topics/expressions.rst > > index 791a20398ca..1328a53f70f 100644 > > --- a/gcc/jit/docs/topics/expressions.rst > > +++ b/gcc/jit/docs/topics/expressions.rst > > @@ -649,6 +649,23 @@ Type-coercion > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * int <-> bool > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * P*=C2=A0 <-> Q*, for pointer types P a= nd Q > > =C2=A0 > > +.. function:: gcc_jit_rvalue *\ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 gcc_jit_context_new_bitcast (gcc_jit_context *ctxt,\ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_location *loc,\ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_rvalue > > *rvalue,\ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_type *type) > > + > > +=C2=A0=C2=A0 Given an rvalue of T, bitcast it to another type. >=20 > I think it's worth defining what "bitcast" means in the docs here; > presumably you mean something like "generating a new rvalue by > interpreting the bits of the input rvalue according to the layout of > type" or somesuch. Done. >=20 >=20 > > + > > +=C2=A0=C2=A0 The type of rvalue must be the same size as the size of > > ``type``. > > + > > +=C2=A0=C2=A0 This entrypoint was added in :ref:`LIBGCCJIT_ABI_20`; you= can > > test for > > +=C2=A0=C2=A0 its presence using > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_n= ew_bitcast > > + > > =C2=A0Lvalues > > =C2=A0------- > > =C2=A0 > > diff --git a/gcc/jit/dummy-frontend.c b/gcc/jit/dummy-frontend.c > > index 84ff359bfe3..c3da97642e3 100644 > > --- a/gcc/jit/dummy-frontend.c > > +++ b/gcc/jit/dummy-frontend.c > > @@ -592,6 +592,8 @@ jit_langhook_init (void) > > =C2=A0=C2=A0 global_dc->begin_diagnostic =3D jit_begin_diagnostic; > > =C2=A0=C2=A0 global_dc->end_diagnostic =3D jit_end_diagnostic; > > =C2=A0 > > +=C2=A0 clear_nonstandard_integer_type_cache (); > > + >=20 > I've been putting code to cleanup global state in foo.c into > foo_c_finalize functions; I'm testing a patch right now to rename > these > to foo_cc_finalize functions to reflect the renaming of .c to .cc > These cleanup functions are called from toplev::finalize. >=20 > I think it would be better to invoke this cleanup from a new > tree_cc_finalize that follows that pattern. Done. >=20 > > =C2=A0=C2=A0 build_common_tree_nodes (false); > > =C2=A0 > > =C2=A0=C2=A0 /* I don't know why this has to be done explicitly.=C2=A0 = */ >=20 > [...snip...] >=20 > > diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c > > index 03704ef10b8..cd8516d1c4d 100644 > > --- a/gcc/jit/libgccjit.c > > +++ b/gcc/jit/libgccjit.c > > @@ -2405,6 +2405,34 @@ gcc_jit_context_new_cast (gcc_jit_context > > *ctxt, > > =C2=A0=C2=A0 return static_cast (ctxt->new_cast (loc= , > > rvalue, type)); > > =C2=A0} > > =C2=A0 > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::context::new_bitcast method in jit- > > recording.c.=C2=A0 */ > > + > > +gcc_jit_rvalue * > > +gcc_jit_context_new_bitcast (gcc_jit_context *ctxt, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 gcc_jit_location *loc, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 gcc_jit_rvalue *rvalue, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 gcc_jit_type *type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (ctxt, NULL, loc, "NULL context"); > > +=C2=A0 JIT_LOG_FUNC (ctxt->get_logger ()); > > +=C2=A0 /* LOC can be NULL.=C2=A0 */ > > +=C2=A0 RETURN_NULL_IF_FAIL (rvalue, ctxt, loc, "NULL rvalue"); > > +=C2=A0 RETURN_NULL_IF_FAIL (type, ctxt, loc, "NULL type"); > > +=C2=A0 // TODO: check the sizes. > > +=C2=A0 /*RETURN_NULL_IF_FAIL_PRINTF3 ( > > +=C2=A0=C2=A0=C2=A0 is_valid_cast (rvalue->get_type (), type), > > +=C2=A0=C2=A0=C2=A0 ctxt, loc, > > +=C2=A0=C2=A0=C2=A0 "cannot cast %s from type: %s to type: %s", > > +=C2=A0=C2=A0=C2=A0 rvalue->get_debug_string (), > > +=C2=A0=C2=A0=C2=A0 rvalue->get_type ()->get_debug_string (), > > +=C2=A0=C2=A0=C2=A0 type->get_debug_string ());*/ >=20 > I belive that in general we can't do the checking for equal size > until > we have trees i.e. at playback time.=C2=A0 I suspect that if the user get= s > this wrong, it will lead to an internal compiler error at playback > time. Done. >=20 > Please can you add a testcase that tests mismatching sizes e.g. > trying > to interpret an int as a array of 4096 bytes, or something similar > that's wildly wrong (ideally coverage for casting in both > directions). Done. > =C2=A0 > Ideally we can generate a useful error message, or, at least, not > crash. >=20 > > + > > +=C2=A0 return static_cast (ctxt->new_bitcast (loc, > > rvalue, type)); > > +} > > + > > =C2=A0/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > =C2=A0 > > =C2=A0=C2=A0=C2=A0 After error-checking, the real work is done by the >=20 > [...snip...] >=20 > > diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h > > b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > index 29afe064db6..656351edce1 100644 > > --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h > > +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > @@ -77,6 +77,13 @@ > > =C2=A0/* test-builtin-unreachable.c: We don't add this one, since it > > touches > > =C2=A0=C2=A0=C2=A0 the optimization level of the context as a whole.=C2= =A0 */ > > =C2=A0 > > +/* test-bitcast.c */ > > +#define create_code create_code_bitcast > > +#define verify_code verify_code_bitcast > > +#include "test-bitcast.c" > > +#undef create_code > > +#undef verify_code > > + > > =C2=A0/* test-calling-external-function.c */ > > =C2=A0#define create_code create_code_calling_external_function > > =C2=A0#define verify_code verify_code_calling_external_function > > @@ -400,6 +407,9 @@ const struct testcase testcases[] =3D { > > =C2=A0=C2=A0 {"builtin-memcpy", > > =C2=A0=C2=A0=C2=A0 create_code_builtin_memcpy, > > =C2=A0=C2=A0=C2=A0 verify_code_builtin_memcpy}, > > +=C2=A0 {"bitcast", > > +=C2=A0=C2=A0 create_code_bitcast, > > +=C2=A0=C2=A0 verify_code_bitcast}, > > =C2=A0=C2=A0 {"calling_external_function", > > =C2=A0=C2=A0=C2=A0 create_code_calling_external_function, > > =C2=A0=C2=A0=C2=A0 verify_code_calling_external_function}, > > diff --git a/gcc/testsuite/jit.dg/test-bitcast.c > > b/gcc/testsuite/jit.dg/test-bitcast.c > > new file mode 100644 > > index 00000000000..2d70622051a > > --- /dev/null > > +++ b/gcc/testsuite/jit.dg/test-bitcast.c > > @@ -0,0 +1,60 @@ > > +#include > > +#include > > +#include > > + > > +#include "libgccjit.h" > > + > > +#include "harness.h" > > + > > +void > > +create_code (gcc_jit_context *ctxt, void *user_data) > > +{ > > +=C2=A0 /* Let's try to inject the equivalent of: > > +int > > +my_bitcast (double x) > > +{ > > +=C2=A0=C2=A0 return bitcast(x, int); > > +} > > +=C2=A0=C2=A0 */ > > +=C2=A0 gcc_jit_type *int_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); > > +=C2=A0 gcc_jit_type *double_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT)= ; >=20 > This says "double_type" but is GCC_JIT_TYPE_FLOAT. >=20 > I don't think we're guaranteed that sizeof(int) =3D=3D sizeof(float) on > all targets. I switched to using `gcc_jit_context_get_int_type (ctxt, 4, 1)` for the integer type. >=20 > > + > > +=C2=A0 gcc_jit_param *x =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_param ( > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ctxt, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 double_type, "x"); > > +=C2=A0 gcc_jit_param *params[1] =3D {x}; > > +=C2=A0 gcc_jit_function *func =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_function (ctxt, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GCC_JIT_FUNCTION_EXPORTED, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int_type, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "my_bitcast", > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1, params, 0); > > + > > +=C2=A0 gcc_jit_block *initial =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_new_block (func, "initial"); > > + > > +=C2=A0 gcc_jit_block_end_with_return(initial, NULL, > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_bitcast(ctxt, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_param_as_rvalue(x), > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int_type > > +=C2=A0=C2=A0=C2=A0 )); > > +} > > + > > +void > > +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) > > +{ > > +=C2=A0 typedef int (*my_bitcast_fn_type) (double); > > +=C2=A0 CHECK_NON_NULL (result); > > +=C2=A0 my_bitcast_fn_type my_bitcast =3D > > +=C2=A0=C2=A0=C2=A0 (my_bitcast_fn_type)gcc_jit_result_get_code (result= , > "my_bitcast"); > > +=C2=A0 CHECK_NON_NULL (my_bitcast); > > +=C2=A0 int val =3D my_bitcast (-5.1298714); > > +=C2=A0 note ("my_bitcast returned: %d", val); > > +=C2=A0 CHECK_VALUE (val, 35569201); > > +} > > diff --git a/gcc/tree.c b/gcc/tree.c > > index d98b77db50b..e4bf4e84675 100644 > > --- a/gcc/tree.c > > +++ b/gcc/tree.c > > @@ -6963,6 +6963,14 @@ build_reference_type (tree to_type) > > =C2=A0=C2=A0 (HOST_BITS_PER_WIDE_INT > 64 ? HOST_BITS_PER_WIDE_INT : 64= ) > > =C2=A0static GTY(()) tree nonstandard_integer_type_cache[2 * > MAX_INT_CACHED_PREC + 2]; > > =C2=A0 > > +void clear_nonstandard_integer_type_cache (void) > > +{ > > +=C2=A0 for (size_t i =3D 0 ; i < 2 * MAX_INT_CACHED_PREC + 2 ; i++) > > +=C2=A0 { > > +=C2=A0=C2=A0=C2=A0 nonstandard_integer_type_cache[i] =3D NULL; > > +=C2=A0 } > > +} > > + >=20 > As noted above (for gcc/jit/dummy-frontend.c), make this static, and > call it from a new tree_cc_finalize function, and call that from > toplev::finalize. >=20 > > =C2=A0/* Builds a signed or unsigned integer type of precision > > PRECISION. > > =C2=A0=C2=A0=C2=A0 Used for C bitfields whose precision does not match = that of > > =C2=A0=C2=A0=C2=A0 built-in target types.=C2=A0 */ > > diff --git a/gcc/tree.h b/gcc/tree.h > > index 318019c4dc5..640b492802c 100644 > > --- a/gcc/tree.h > > +++ b/gcc/tree.h > > @@ -5385,6 +5385,7 @@ extern bool real_minus_onep (const_tree); > > =C2=A0extern void init_ttree (void); > > =C2=A0extern void build_common_tree_nodes (bool); > > =C2=A0extern void build_common_builtin_nodes (void); > > +extern void clear_nonstandard_integer_type_cache (void); >=20 > ...and get rid of this in favor of a tree_cc_finalize. >=20 > > =C2=A0extern tree build_nonstandard_integer_type (unsigned > > HOST_WIDE_INT, > int); > > =C2=A0extern tree build_nonstandard_boolean_type (unsigned > > HOST_WIDE_INT); > > =C2=A0extern tree build_range_type (tree, tree, tree); > > --=20 > > 2.26.2.7.g19db9cfb68.dirty > >=20 >=20 > Hope this is constructive; thanks again for the patch > Dave >=20 --=-B4q20x/5r5N5MCKLGHsV Content-Disposition: attachment; filename="0001-libgccjit-Add-support-for-bitcasts-PR104071.patch" Content-Type: text/x-patch; name="0001-libgccjit-Add-support-for-bitcasts-PR104071.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBkN2Y0OTE3MDM5NGRlNzg0NzExNjRhOWZiOGQwOGFkOTI1MDhiNDJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogV2VkLCA5IEp1biAyMDIxIDE4OjI5OjE0IC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gbGliZ2Nj aml0OiBBZGQgc3VwcG9ydCBmb3IgYml0Y2FzdHMgW1BSMTA0MDcxXQoKMjAyMi0wMS0yMSAgQW50 b25pIEJvdWNoZXIgPGJvdWFudG9Aem9oby5jb20+CgpnY2Mvaml0LwoJUFIgaml0LzEwNDA3MQoJ KiBkb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAoTElCR0NDSklUX0FCSV8yMSk6IE5ldyBB QkkgdGFnLgoJKiBkb2NzL3RvcGljcy9leHByZXNzaW9ucy5yc3Q6IEFkZCBkb2N1bWVudGF0aW9u IGZvciB0aGUKCWZ1bmN0aW9uIGdjY19qaXRfY29udGV4dF9uZXdfYml0Y2FzdC4KCSogaml0LXBs YXliYWNrLmNjOiBOZXcgZnVuY3Rpb24gKG5ld19iaXRjYXN0KS4KCSogaml0LXBsYXliYWNrLmg6 IE5ldyBmdW5jdGlvbiAobmV3X2JpdGNhc3QpLgoJKiBqaXQtcmVjb3JkaW5nLmNjOiBOZXcgZnVu Y3Rpb25zIChuZXdfYml0Y2FzdCwKCWJpdGNhc3Q6OnJlcGxheV9pbnRvLCBiaXRjYXN0Ojp2aXNp dF9jaGlsZHJlbiwKCWJpdGNhc3Q6Om1ha2VfZGVidWdfc3RyaW5nLCBiaXRjYXN0Ojp3cml0ZV9y ZXByb2R1Y2VyKS4KCSogaml0LXJlY29yZGluZy5oOiBOZXcgY2Fsc3MgKGJpdGNhc3QpIGFuZCBu ZXcgZnVuY3Rpb24KCShuZXdfYml0Y2FzdCwgYml0Y2FzdDo6cmVwbGF5X2ludG8sIGJpdGNhc3Q6 OnZpc2l0X2NoaWxkcmVuLAoJYml0Y2FzdDo6bWFrZV9kZWJ1Z19zdHJpbmcsIGJpdGNhc3Q6Ondy aXRlX3JlcHJvZHVjZXIsCgliaXRjYXN0OjpnZXRfcHJlY2VkZW5jZSkuCgkqIGxpYmdjY2ppdC5j YzogTmV3IGZ1bmN0aW9uIChnY2Nfaml0X2NvbnRleHRfbmV3X2JpdGNhc3QpCgkqIGxpYmdjY2pp dC5oOiBOZXcgZnVuY3Rpb24gKGdjY19qaXRfY29udGV4dF9uZXdfYml0Y2FzdCkKCSogbGliZ2Nj aml0Lm1hcCAoTElCR0NDSklUX0FCSV8yMSk6IE5ldyBBQkkgdGFnLgoKZ2NjL3Rlc3RzdWl0ZS8K CVBSIGppdC8xMDQwNzEKCSogaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oOiBBZGQgbmV3 IHRlc3QtYml0Y2FzdC4KCSogaml0LmRnL3Rlc3QtYml0Y2FzdC5jOiBOZXcgdGVzdC4KCSogaml0 LmRnL3Rlc3QtZXJyb3ItYmFkLWJpdGNhc3QuYzogTmV3IHRlc3QuCgkqIGppdC5kZy90ZXN0LWVy cm9yLWJhZC1iaXRjYXN0Mi5jOiBOZXcgdGVzdC4KCmdjYy8KCVBSIGppdC8xMDQwNzEKCSogdG9w bGV2LmNjOiBDYWxsIHRoZSBuZXcgZnVuY3Rpb24gdHJlZV9jY19maW5hbGl6ZSBpbgoJdG9wbGV2 OjpmaW5hbGl6ZS4KCSogdHJlZS5jYzogTmV3IGZ1bmN0aW9ucyAoY2xlYXJfbm9uc3RhbmRhcmRf aW50ZWdlcl90eXBlX2NhY2hlCglhbmQgdHJlZV9jY19maW5hbGl6ZSkgdG8gY2xlYXIgdGhlIGNh Y2hlIG9mIG5vbi1zdGFuZGFyZCBpbnRlZ2VyCgl0eXBlcyB0byBhdm9pZCBoYXZpbmcgaXNzdWVz IHdpdGggc29tZSBvcHRpbWl6YXRpb25zIG9mCgliaXRjYXN0IHdoZXJlIHRoZSBTU0FfTkFNRSB3 aWxsIGhhdmUgYSBzaXplIG9mIGEgY2FjaGVkCglpbnRlZ2VyIHR5cGUgdGhhdCBzaG91bGQgaGF2 ZSBiZWVuIGludmFsaWRhdGVkLCBjYXVzaW5nIGEKCWNvbXBhcmlzb24gb2YgaW50ZWdlciBjb25z dGFudCB0byBmYWlsLgoJKiB0cmVlLmg6IE5ldyBmdW5jdGlvbiAodHJlZV9jY19maW5hbGl6ZSku Ci0tLQogZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAgICAgICAgIHwgIDkg KysrCiBnY2Mvaml0L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdCAgICAgICAgICAgfCAxOSAr KysrKysKIGdjYy9qaXQvaml0LXBsYXliYWNrLmNjICAgICAgICAgICAgICAgICAgICAgICB8IDI3 ICsrKysrKysrCiBnY2Mvaml0L2ppdC1wbGF5YmFjay5oICAgICAgICAgICAgICAgICAgICAgICAg fCAgNSArKwogZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmNjICAgICAgICAgICAgICAgICAgICAgIHwg NjYgKysrKysrKysrKysrKysrKysrKwogZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmggICAgICAgICAg ICAgICAgICAgICAgIHwgMzIgKysrKysrKysrCiBnY2Mvaml0L2xpYmdjY2ppdC5jYyAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAyOCArKysrKysrKwogZ2NjL2ppdC9saWJnY2NqaXQuaCAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMTUgKysrKysKIGdjYy9qaXQvbGliZ2Njaml0Lm1hcCAg ICAgICAgICAgICAgICAgICAgICAgICB8ICA5ICsrKwogZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxs LW5vbi1mYWlsaW5nLXRlc3RzLmggIHwgMTAgKysrCiBnY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0 LWJpdGNhc3QuYyAgICAgICAgICAgfCA2MCArKysrKysrKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0 ZS9qaXQuZGcvdGVzdC1lcnJvci1iYWQtYml0Y2FzdC5jIHwgNjIgKysrKysrKysrKysrKysrKysK IC4uLi9qaXQuZGcvdGVzdC1lcnJvci1iYWQtYml0Y2FzdDIuYyAgICAgICAgICB8IDYyICsrKysr KysrKysrKysrKysrCiBnY2MvdG9wbGV2LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgMSArCiBnY2MvdHJlZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAxNSArKysrKwogZ2NjL3RyZWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgIDEgKwogMTYgZmlsZXMgY2hhbmdlZCwgNDIxIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LWJpdGNhc3QuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtZXJyb3ItYmFkLWJpdGNhc3QuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtZXJyb3ItYmFkLWJpdGNh c3QyLmMKCmRpZmYgLS1naXQgYS9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0 IGIvZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdAppbmRleCAxNmNlYmUzMWEx MC4uNjEwZDlkYzE3NWYgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvZG9jcy90b3BpY3MvY29tcGF0aWJp bGl0eS5yc3QKKysrIGIvZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdApAQCAt MzAyLDMgKzMwMiwxMiBAQCB0aHJlYWQtbG9jYWwgc3RvcmFnZSBtb2RlbCBvZiBhIHZhcmlhYmxl Ogogc2VjdGlvbiBvZiBhIHZhcmlhYmxlOgogCiAgICogOmZ1bmM6YGdjY19qaXRfbHZhbHVlX3Nl dF9saW5rX3NlY3Rpb25gCisKKy4uIF9MSUJHQ0NKSVRfQUJJXzIxOgorCitgYExJQkdDQ0pJVF9B QklfMjFgYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2BgTElCR0NDSklUX0FCSV8yMWBgIGNv dmVycyB0aGUgYWRkaXRpb24gb2YgYW4gQVBJIGVudHJ5cG9pbnQgdG8gYml0Y2FzdCBhCit2YWx1 ZSBmcm9tIG9uZSB0eXBlIHRvIGFub3RoZXI6CisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9jb250ZXh0 X25ld19iaXRjYXN0YApkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9kb2NzL3RvcGljcy9leHByZXNzaW9u cy5yc3QgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdAppbmRleCA3OTFhMjAz OThjYS4uZTBiNmY0MjZhZWUgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvZG9jcy90b3BpY3MvZXhwcmVz c2lvbnMucnN0CisrKyBiL2djYy9qaXQvZG9jcy90b3BpY3MvZXhwcmVzc2lvbnMucnN0CkBAIC02 NDksNiArNjQ5LDI1IEBAIFR5cGUtY29lcmNpb24KICAgICAgKiBpbnQgPC0+IGJvb2wKICAgICAg KiBQKiAgPC0+IFEqLCBmb3IgcG9pbnRlciB0eXBlcyBQIGFuZCBRCiAKKy4uIGZ1bmN0aW9uOjog Z2NjX2ppdF9ydmFsdWUgKlwKKyAgICAgICAgICAgICAgZ2NjX2ppdF9jb250ZXh0X25ld19iaXRj YXN0IChnY2Nfaml0X2NvbnRleHQgKmN0eHQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGdjY19qaXRfbG9jYXRpb24gKmxvYyxcCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NjX2ppdF9ydmFsdWUgKnJ2YWx1ZSxcCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlICp0eXBl KQorCisgICBHaXZlbiBhbiBydmFsdWUgb2YgVCwgYml0Y2FzdCBpdCB0byBhbm90aGVyIHR5cGUs IG1lYW5pbmcgdGhhdCB0aGlzIHdpbGwKKyAgIGdlbmVyYXRlIGEgbmV3IHJ2YWx1ZSBieSBpbnRl cnByZXRpbmcgdGhlIGJpdHMgb2YgYGBydmFsdWVgYCB0byB0aGUgbGF5b3V0CisgICBvZiBgYHR5 cGVgYC4KKworICAgVGhlIHR5cGUgb2YgcnZhbHVlIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0 aGUgc2l6ZSBvZiBgYHR5cGVgYC4KKworICAgVGhpcyBlbnRyeXBvaW50IHdhcyBhZGRlZCBpbiA6 cmVmOmBMSUJHQ0NKSVRfQUJJXzIxYDsgeW91IGNhbiB0ZXN0IGZvcgorICAgaXRzIHByZXNlbmNl IHVzaW5nCisKKyAgIC4uIGNvZGUtYmxvY2s6OiBjCisKKyAgICAgICNpZmRlZiBMSUJHQ0NKSVRf SEFWRV9nY2Nfaml0X2NvbnRleHRfbmV3X2JpdGNhc3QKKwogTHZhbHVlcwogLS0tLS0tLQogCmRp ZmYgLS1naXQgYS9nY2Mvaml0L2ppdC1wbGF5YmFjay5jYyBiL2djYy9qaXQvaml0LXBsYXliYWNr LmNjCmluZGV4IGQxODM1Yzc5ODYzLi5kMmVmYWUxYzE2MyAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9q aXQtcGxheWJhY2suY2MKKysrIGIvZ2NjL2ppdC9qaXQtcGxheWJhY2suY2MKQEAgLTEzOTAsNiAr MTM5MCwzMyBAQCBuZXdfY2FzdCAocGxheWJhY2s6OmxvY2F0aW9uICpsb2MsCiAgIHJldHVybiBu ZXcgcnZhbHVlICh0aGlzLCB0X2Nhc3QpOwogfQogCitwbGF5YmFjazo6cnZhbHVlICoKK3BsYXli YWNrOjpjb250ZXh0OjoKK25ld19iaXRjYXN0IChsb2NhdGlvbiAqbG9jLAorCQkgICAgICAgcnZh bHVlICpleHByLAorCQkgICAgICAgdHlwZSAqdHlwZV8pCit7CisgIHRyZWUgZXhwcl9zaXplID0g VFlQRV9TSVpFIChleHByLT5nZXRfdHlwZSAoKS0+YXNfdHJlZSAoKSk7CisgIHRyZWUgdHlwZV9z aXplID0gVFlQRV9TSVpFICh0eXBlXy0+YXNfdHJlZSAoKSk7CisgIHRyZWUgdF9leHByID0gZXhw ci0+YXNfdHJlZSAoKTsKKyAgdHJlZSB0X2RzdF90eXBlID0gdHlwZV8tPmFzX3RyZWUgKCk7Cisg IGlmIChleHByX3NpemUgIT0gdHlwZV9zaXplKQorICB7CisgICAgYWN0aXZlX3BsYXliYWNrX2N0 eHQtPmFkZF9lcnJvciAobG9jLAorICAgICAgImJpdGNhc3Qgd2l0aCB0eXBlcyBvZiBkaWZmZXJl bnQgc2l6ZXMiKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJpbnB1dCBleHByZXNzaW9uIChzaXpl OiAlbGQpOlxuIiwKKyAgICAgIHRyZWVfdG9fdWh3aSAoZXhwcl9zaXplKSk7CisgICAgZGVidWdf dHJlZSAodF9leHByKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJyZXF1ZXN0ZWQgdHlwZSAoc2l6 ZTogJWxkKTpcbiIsCisgICAgICB0cmVlX3RvX3Vod2kgKHR5cGVfc2l6ZSkpOworICAgIGRlYnVn X3RyZWUgKHRfZHN0X3R5cGUpOworICB9CisgIHRyZWUgdF9iaXRjYXN0ID0gYnVpbGQxIChWSUVX X0NPTlZFUlRfRVhQUiwgdF9kc3RfdHlwZSwgdF9leHByKTsKKyAgaWYgKGxvYykKKyAgICBzZXRf dHJlZV9sb2NhdGlvbiAodF9iaXRjYXN0LCBsb2MpOworICByZXR1cm4gbmV3IHJ2YWx1ZSAodGhp cywgdF9iaXRjYXN0KTsKK30KKwogLyogQ29uc3RydWN0IGEgcGxheWJhY2s6Omx2YWx1ZSBpbnN0 YW5jZSAod3JhcHBpbmcgYSB0cmVlKSBmb3IgYW4KICAgIGFycmF5IGFjY2Vzcy4gICovCiAKZGlm ZiAtLWdpdCBhL2djYy9qaXQvaml0LXBsYXliYWNrLmggYi9nY2Mvaml0L2ppdC1wbGF5YmFjay5o CmluZGV4IGM5M2Q3MDU1ZDQzLi41YjEwN2JlOWQ2OSAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9qaXQt cGxheWJhY2suaAorKysgYi9nY2Mvaml0L2ppdC1wbGF5YmFjay5oCkBAIC0xODAsNiArMTgwLDEx IEBAIHB1YmxpYzoKIAkgICAgcnZhbHVlICpleHByLAogCSAgICB0eXBlICp0eXBlXyk7CiAKKyAg cnZhbHVlICoKKyAgbmV3X2JpdGNhc3QgKGxvY2F0aW9uICpsb2MsCisJICAgICAgIHJ2YWx1ZSAq ZXhwciwKKwkgICAgICAgdHlwZSAqdHlwZV8pOworCiAgIGx2YWx1ZSAqCiAgIG5ld19hcnJheV9h Y2Nlc3MgKGxvY2F0aW9uICpsb2MsCiAJCSAgICBydmFsdWUgKnB0ciwKZGlmZiAtLWdpdCBhL2dj Yy9qaXQvaml0LXJlY29yZGluZy5jYyBiL2djYy9qaXQvaml0LXJlY29yZGluZy5jYwppbmRleCAx ZTNmYWRmYWNkNy4uZTEwMjkwODZkYTggMTAwNjQ0Ci0tLSBhL2djYy9qaXQvaml0LXJlY29yZGlu Zy5jYworKysgYi9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuY2MKQEAgLTEyNDIsNiArMTI0MiwyMiBA QCByZWNvcmRpbmc6OmNvbnRleHQ6Om5ld19jYXN0IChyZWNvcmRpbmc6OmxvY2F0aW9uICpsb2Ms CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKKy8qIENyZWF0ZSBhIHJlY29yZGluZzo6Yml0Y2FzdCBp bnN0YW5jZSBhbmQgYWRkIGl0IHRvIHRoaXMgY29udGV4dCdzIGxpc3QKKyAgIG9mIG1lbWVudG9z LgorCisgICBJbXBsZW1lbnRzIHRoZSBwb3N0LWVycm9yLWNoZWNraW5nIHBhcnQgb2YKKyAgIGdj Y19qaXRfY29udGV4dF9uZXdfYml0Y2FzdC4gICovCisKK3JlY29yZGluZzo6cnZhbHVlICoKK3Jl Y29yZGluZzo6Y29udGV4dDo6bmV3X2JpdGNhc3QgKGxvY2F0aW9uICpsb2MsCisJCQkJIHJ2YWx1 ZSAqZXhwciwKKwkJCQkgdHlwZSAqdHlwZV8pCit7CisgIHJlY29yZGluZzo6cnZhbHVlICpyZXN1 bHQgPSBuZXcgYml0Y2FzdCAodGhpcywgbG9jLCBleHByLCB0eXBlXyk7CisgIHJlY29yZCAocmVz dWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwogLyogQ3JlYXRlIGEgcmVjb3JkaW5nOjpjYWxs IGluc3RhbmNlIGFuZCBhZGQgaXQgdG8gdGhpcyBjb250ZXh0J3MgbGlzdAogICAgb2YgbWVtZW50 b3MuCiAKQEAgLTU3NDAsNiArNTc1Niw1NiBAQCByZWNvcmRpbmc6OmNhc3Q6OndyaXRlX3JlcHJv ZHVjZXIgKHJlcHJvZHVjZXIgJnIpCiAJICAgci5nZXRfaWRlbnRpZmllcl9hc190eXBlIChnZXRf dHlwZSAoKSkpOwogfQogCisvKiBJbXBsZW1lbnRhdGlvbiBvZiBwdXJlIHZpcnR1YWwgaG9vayBy ZWNvcmRpbmc6Om1lbWVudG86OnJlcGxheV9pbnRvCisgICBmb3IgcmVjb3JkaW5nOjpiaXRjYXN0 LiAgKi8KKwordm9pZAorcmVjb3JkaW5nOjpiaXRjYXN0OjpyZXBsYXlfaW50byAocmVwbGF5ZXIg KnIpCit7CisgIHNldF9wbGF5YmFja19vYmogKHItPm5ld19iaXRjYXN0IChwbGF5YmFja19sb2Nh dGlvbiAociwgbV9sb2MpLAorCQkJCSAgICBtX3J2YWx1ZS0+cGxheWJhY2tfcnZhbHVlICgpLAor CQkJCSAgICBnZXRfdHlwZSAoKS0+cGxheWJhY2tfdHlwZSAoKSkpOworfQorCisvKiBJbXBsZW1l bnRhdGlvbiBvZiBwdXJlIHZpcnR1YWwgaG9vayByZWNvcmRpbmc6OnJ2YWx1ZTo6dmlzaXRfY2hp bGRyZW4KKyAgIGZvciByZWNvcmRpbmc6OmJpdGNhc3QuICAqLwordm9pZAorcmVjb3JkaW5nOjpi aXRjYXN0Ojp2aXNpdF9jaGlsZHJlbiAocnZhbHVlX3Zpc2l0b3IgKnYpCit7CisgIHYtPnZpc2l0 IChtX3J2YWx1ZSk7Cit9CisKKy8qIEltcGxlbWVudGF0aW9uIG9mIHJlY29yZGluZzo6bWVtZW50 bzo6bWFrZV9kZWJ1Z19zdHJpbmcgZm9yCisgICBjYXN0cy4gICovCisKK3JlY29yZGluZzo6c3Ry aW5nICoKK3JlY29yZGluZzo6Yml0Y2FzdDo6bWFrZV9kZWJ1Z19zdHJpbmcgKCkKK3sKKyAgZW51 bSBwcmVjZWRlbmNlIHByZWMgPSBnZXRfcHJlY2VkZW5jZSAoKTsKKyAgcmV0dXJuIHN0cmluZzo6 ZnJvbV9wcmludGYgKG1fY3R4dCwKKwkJCSAgICAgICJiaXRjYXN0KCVzLCAlcykiLAorCQkJICAg ICAgbV9ydmFsdWUtPmdldF9kZWJ1Z19zdHJpbmdfcGFyZW5zIChwcmVjKSwKKwkJCSAgICAgIGdl dF90eXBlICgpLT5nZXRfZGVidWdfc3RyaW5nICgpKTsKK30KKworLyogSW1wbGVtZW50YXRpb24g b2YgcmVjb3JkaW5nOjptZW1lbnRvOjp3cml0ZV9yZXByb2R1Y2VyIGZvciBjYXN0cy4gICovCisK K3ZvaWQKK3JlY29yZGluZzo6Yml0Y2FzdDo6d3JpdGVfcmVwcm9kdWNlciAocmVwcm9kdWNlciAm cikKK3sKKyAgY29uc3QgY2hhciAqaWQgPSByLm1ha2VfaWRlbnRpZmllciAodGhpcywgInJ2YWx1 ZSIpOworICByLndyaXRlICgiICBnY2Nfaml0X3J2YWx1ZSAqJXMgPVxuIgorCSAgICIgICAgZ2Nj X2ppdF9jb250ZXh0X25ld19iaXRjYXN0ICglcyxcbiIKKwkgICAiICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJXMsIC8qIGdjY19qaXRfbG9jYXRpb24gKmxvYyAqL1xuIgorCSAgICIg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlcywgLyogZ2NjX2ppdF9ydmFsdWUgKnJ2 YWx1ZSAqL1xuIgorCSAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlcyk7IC8q IGdjY19qaXRfdHlwZSAqdHlwZSAqL1xuIiwKKwkgICBpZCwKKwkgICByLmdldF9pZGVudGlmaWVy IChnZXRfY29udGV4dCAoKSksCisJICAgci5nZXRfaWRlbnRpZmllciAobV9sb2MpLAorCSAgIHIu Z2V0X2lkZW50aWZpZXJfYXNfcnZhbHVlIChtX3J2YWx1ZSksCisJICAgci5nZXRfaWRlbnRpZmll cl9hc190eXBlIChnZXRfdHlwZSAoKSkpOworfQorCiAvKiBUaGUgaW1wbGVtZW50YXRpb24gb2Yg Y2xhc3MgZ2NjOjpqaXQ6OnJlY29yZGluZzo6YmFzZV9jYWxsLiAgKi8KIAogLyogVGhlIGNvbnN0 cnVjdG9yIGZvciBnY2M6OmppdDo6cmVjb3JkaW5nOjpiYXNlX2NhbGwuICAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmggYi9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuaAppbmRl eCA4NDZkNjVjYjIwMi4uZWQwM2IzYTI0YzggMTAwNjQ0Ci0tLSBhL2djYy9qaXQvaml0LXJlY29y ZGluZy5oCisrKyBiL2djYy9qaXQvaml0LXJlY29yZGluZy5oCkBAIC0yMDUsNiArMjA1LDExIEBA IHB1YmxpYzoKIAkgICAgcnZhbHVlICpleHByLAogCSAgICB0eXBlICp0eXBlXyk7CiAKKyAgcnZh bHVlICoKKyAgbmV3X2JpdGNhc3QgKGxvY2F0aW9uICpsb2MsCisJICAgICAgIHJ2YWx1ZSAqZXhw ciwKKwkgICAgICAgdHlwZSAqdHlwZV8pOworCiAgIGx2YWx1ZSAqCiAgIG5ld19hcnJheV9hY2Nl c3MgKGxvY2F0aW9uICpsb2MsCiAJCSAgICBydmFsdWUgKnB0ciwKQEAgLTE2OTEsNiArMTY5Niwz MyBAQCBwcml2YXRlOgogICBydmFsdWUgKm1fcnZhbHVlOwogfTsKIAorY2xhc3MgYml0Y2FzdCA6 IHB1YmxpYyBydmFsdWUKK3sKK3B1YmxpYzoKKyAgYml0Y2FzdCAoY29udGV4dCAqY3R4dCwKKwkg ICBsb2NhdGlvbiAqbG9jLAorCSAgIHJ2YWx1ZSAqYSwKKwkgICB0eXBlICp0eXBlXykKKyAgOiBy dmFsdWUgKGN0eHQsIGxvYywgdHlwZV8pLAorICAgIG1fcnZhbHVlIChhKQorICB7fQorCisgIHZv aWQgcmVwbGF5X2ludG8gKHJlcGxheWVyICpyKSBGSU5BTCBPVkVSUklERTsKKworICB2b2lkIHZp c2l0X2NoaWxkcmVuIChydmFsdWVfdmlzaXRvciAqdikgRklOQUwgT1ZFUlJJREU7CisKK3ByaXZh dGU6CisgIHN0cmluZyAqIG1ha2VfZGVidWdfc3RyaW5nICgpIEZJTkFMIE9WRVJSSURFOworICB2 b2lkIHdyaXRlX3JlcHJvZHVjZXIgKHJlcHJvZHVjZXIgJnIpIEZJTkFMIE9WRVJSSURFOworICBl bnVtIHByZWNlZGVuY2UgZ2V0X3ByZWNlZGVuY2UgKCkgY29uc3QgRklOQUwgT1ZFUlJJREUKKyAg eworICAgIHJldHVybiBQUkVDRURFTkNFX0NBU1Q7CisgIH0KKworcHJpdmF0ZToKKyAgcnZhbHVl ICptX3J2YWx1ZTsKK307CisKIGNsYXNzIGJhc2VfY2FsbCA6IHB1YmxpYyBydmFsdWUKIHsKICBw dWJsaWM6CmRpZmYgLS1naXQgYS9nY2Mvaml0L2xpYmdjY2ppdC5jYyBiL2djYy9qaXQvbGliZ2Nj aml0LmNjCmluZGV4IDRjMzUyZThjOTNkLi42YmYxZTFjZWVlMCAxMDA2NDQKLS0tIGEvZ2NjL2pp dC9saWJnY2NqaXQuY2MKKysrIGIvZ2NjL2ppdC9saWJnY2NqaXQuY2MKQEAgLTI0MDUsNiArMjQw NSwzNCBAQCBnY2Nfaml0X2NvbnRleHRfbmV3X2Nhc3QgKGdjY19qaXRfY29udGV4dCAqY3R4dCwK ICAgcmV0dXJuIHN0YXRpY19jYXN0IDxnY2Nfaml0X3J2YWx1ZSAqPiAoY3R4dC0+bmV3X2Nhc3Qg KGxvYywgcnZhbHVlLCB0eXBlKSk7CiB9CiAKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRl c2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhl IHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6Y29udGV4 dDo6bmV3X2JpdGNhc3QgbWV0aG9kIGluIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRf cnZhbHVlICoKK2djY19qaXRfY29udGV4dF9uZXdfYml0Y2FzdCAoZ2NjX2ppdF9jb250ZXh0ICpj dHh0LAorCQkJICAgICBnY2Nfaml0X2xvY2F0aW9uICpsb2MsCisJCQkgICAgIGdjY19qaXRfcnZh bHVlICpydmFsdWUsCisJCQkgICAgIGdjY19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX05V TExfSUZfRkFJTCAoY3R4dCwgTlVMTCwgbG9jLCAiTlVMTCBjb250ZXh0Iik7CisgIEpJVF9MT0df RlVOQyAoY3R4dC0+Z2V0X2xvZ2dlciAoKSk7CisgIC8qIExPQyBjYW4gYmUgTlVMTC4gICovCisg IFJFVFVSTl9OVUxMX0lGX0ZBSUwgKHJ2YWx1ZSwgY3R4dCwgbG9jLCAiTlVMTCBydmFsdWUiKTsK KyAgUkVUVVJOX05VTExfSUZfRkFJTCAodHlwZSwgY3R4dCwgbG9jLCAiTlVMTCB0eXBlIik7Cisg IC8vIFRPRE86IGNoZWNrIHRoZSBzaXplcy4KKyAgLypSRVRVUk5fTlVMTF9JRl9GQUlMX1BSSU5U RjMgKAorICAgIGlzX3ZhbGlkX2Nhc3QgKHJ2YWx1ZS0+Z2V0X3R5cGUgKCksIHR5cGUpLAorICAg IGN0eHQsIGxvYywKKyAgICAiY2Fubm90IGNhc3QgJXMgZnJvbSB0eXBlOiAlcyB0byB0eXBlOiAl cyIsCisgICAgcnZhbHVlLT5nZXRfZGVidWdfc3RyaW5nICgpLAorICAgIHJ2YWx1ZS0+Z2V0X3R5 cGUgKCktPmdldF9kZWJ1Z19zdHJpbmcgKCksCisgICAgdHlwZS0+Z2V0X2RlYnVnX3N0cmluZyAo KSk7Ki8KKworICByZXR1cm4gc3RhdGljX2Nhc3QgPGdjY19qaXRfcnZhbHVlICo+IChjdHh0LT5u ZXdfYml0Y2FzdCAobG9jLCBydmFsdWUsIHR5cGUpKTsKK30KKwogLyogUHVibGljIGVudHJ5cG9p bnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGliZ2Njaml0LmguCiAKICAgIEFmdGVyIGVycm9yLWNo ZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlCmRpZmYgLS1naXQgYS9nY2Mvaml0 L2xpYmdjY2ppdC5oIGIvZ2NjL2ppdC9saWJnY2NqaXQuaAppbmRleCAyYTVmZmFjYjFmZS4uOTYw ZTRmNDI2MWUgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvbGliZ2Njaml0LmgKKysrIGIvZ2NjL2ppdC9s aWJnY2NqaXQuaApAQCAtMTIwNiw2ICsxMjA2LDIxIEBAIGdjY19qaXRfY29udGV4dF9uZXdfY2Fz dCAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0LAogCQkJICBnY2Nfaml0X3J2YWx1ZSAqcnZhbHVlLAog CQkJICBnY2Nfaml0X3R5cGUgKnR5cGUpOwogCisvKiBSZWludGVycHJldCBhIHZhbHVlIGFzIGFu b3RoZXIgdHlwZS4KKworI2RlZmluZSBMSUJHQ0NKSVRfSEFWRV9nY2Nfaml0X2NvbnRleHRfbmV3 X2JpdGNhc3QKKworICAgVGhlIHR5cGVzIG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKworICAg VGhpcyBBUEkgZW50cnlwb2ludCB3YXMgYWRkZWQgaW4gTElCR0NDSklUX0FCSV8yMTsgeW91IGNh biB0ZXN0IGZvciBpdHMKKyAgIHByZXNlbmNlIHVzaW5nCisgICAgICNpZmRlZiBMSUJHQ0NKSVRf SEFWRV9nY2Nfaml0X2NvbnRleHRfbmV3X2JpdGNhc3QgICovCitleHRlcm4gZ2NjX2ppdF9ydmFs dWUgKgorZ2NjX2ppdF9jb250ZXh0X25ld19iaXRjYXN0IChnY2Nfaml0X2NvbnRleHQgKmN0eHQs CisJCQkgICAgIGdjY19qaXRfbG9jYXRpb24gKmxvYywKKwkJCSAgICAgZ2NjX2ppdF9ydmFsdWUg KnJ2YWx1ZSwKKwkJCSAgICAgZ2NjX2ppdF90eXBlICp0eXBlKTsKKwogZXh0ZXJuIGdjY19qaXRf bHZhbHVlICoKIGdjY19qaXRfY29udGV4dF9uZXdfYXJyYXlfYWNjZXNzIChnY2Nfaml0X2NvbnRl eHQgKmN0eHQsCiAJCQkJICBnY2Nfaml0X2xvY2F0aW9uICpsb2MsCmRpZmYgLS1naXQgYS9nY2Mv aml0L2xpYmdjY2ppdC5tYXAgYi9nY2Mvaml0L2xpYmdjY2ppdC5tYXAKaW5kZXggZjM3M2ZkMzlh YzcuLjM4YzM1NTQzN2JmIDEwMDY0NAotLS0gYS9nY2Mvaml0L2xpYmdjY2ppdC5tYXAKKysrIGIv Z2NjL2ppdC9saWJnY2NqaXQubWFwCkBAIC0yMzgsOCArMjM4LDE3IEBAIExJQkdDQ0pJVF9BQklf MTggewogfSBMSUJHQ0NKSVRfQUJJXzE3OwogCiBMSUJHQ0NKSVRfQUJJXzE5IHsKKyAgZ2xvYmFs OgogICAgIGdjY19qaXRfY29udGV4dF9uZXdfYXJyYXlfY29uc3RydWN0b3I7CiAgICAgZ2NjX2pp dF9jb250ZXh0X25ld19zdHJ1Y3RfY29uc3RydWN0b3I7CiAgICAgZ2NjX2ppdF9jb250ZXh0X25l d191bmlvbl9jb25zdHJ1Y3RvcjsKICAgICBnY2Nfaml0X2dsb2JhbF9zZXRfaW5pdGlhbGl6ZXJf cnZhbHVlOwogfSBMSUJHQ0NKSVRfQUJJXzE4OworCitMSUJHQ0NKSVRfQUJJXzIwIHsKK30gTElC R0NDSklUX0FCSV8xOTsKKworTElCR0NDSklUX0FCSV8yMSB7CisgIGdsb2JhbDoKKyAgICBnY2Nf aml0X2NvbnRleHRfbmV3X2JpdGNhc3Q7Cit9IExJQkdDQ0pJVF9BQklfMjA7CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaCBiL2djYy90ZXN0 c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oCmluZGV4IDI5YWZlMDY0ZGI2Li42 NTYzNTFlZGNlMSAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWls aW5nLXRlc3RzLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5nLXRl c3RzLmgKQEAgLTc3LDYgKzc3LDEzIEBACiAvKiB0ZXN0LWJ1aWx0aW4tdW5yZWFjaGFibGUuYzog V2UgZG9uJ3QgYWRkIHRoaXMgb25lLCBzaW5jZSBpdCB0b3VjaGVzCiAgICB0aGUgb3B0aW1pemF0 aW9uIGxldmVsIG9mIHRoZSBjb250ZXh0IGFzIGEgd2hvbGUuICAqLwogCisvKiB0ZXN0LWJpdGNh c3QuYyAqLworI2RlZmluZSBjcmVhdGVfY29kZSBjcmVhdGVfY29kZV9iaXRjYXN0CisjZGVmaW5l IHZlcmlmeV9jb2RlIHZlcmlmeV9jb2RlX2JpdGNhc3QKKyNpbmNsdWRlICJ0ZXN0LWJpdGNhc3Qu YyIKKyN1bmRlZiBjcmVhdGVfY29kZQorI3VuZGVmIHZlcmlmeV9jb2RlCisKIC8qIHRlc3QtY2Fs bGluZy1leHRlcm5hbC1mdW5jdGlvbi5jICovCiAjZGVmaW5lIGNyZWF0ZV9jb2RlIGNyZWF0ZV9j b2RlX2NhbGxpbmdfZXh0ZXJuYWxfZnVuY3Rpb24KICNkZWZpbmUgdmVyaWZ5X2NvZGUgdmVyaWZ5 X2NvZGVfY2FsbGluZ19leHRlcm5hbF9mdW5jdGlvbgpAQCAtNDAwLDYgKzQwNyw5IEBAIGNvbnN0 IHN0cnVjdCB0ZXN0Y2FzZSB0ZXN0Y2FzZXNbXSA9IHsKICAgeyJidWlsdGluLW1lbWNweSIsCiAg ICBjcmVhdGVfY29kZV9idWlsdGluX21lbWNweSwKICAgIHZlcmlmeV9jb2RlX2J1aWx0aW5fbWVt Y3B5fSwKKyAgeyJiaXRjYXN0IiwKKyAgIGNyZWF0ZV9jb2RlX2JpdGNhc3QsCisgICB2ZXJpZnlf Y29kZV9iaXRjYXN0fSwKICAgeyJjYWxsaW5nX2V4dGVybmFsX2Z1bmN0aW9uIiwKICAgIGNyZWF0 ZV9jb2RlX2NhbGxpbmdfZXh0ZXJuYWxfZnVuY3Rpb24sCiAgICB2ZXJpZnlfY29kZV9jYWxsaW5n X2V4dGVybmFsX2Z1bmN0aW9ufSwKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvaml0LmRnL3Rl c3QtYml0Y2FzdC5jIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1iaXRjYXN0LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmEwOTJmYTExN2U2Ci0tLSAvZGV2L251 bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1iaXRjYXN0LmMKQEAgLTAsMCArMSw2 MCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8 c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJnY2NqaXQuaCIKKworI2luY2x1ZGUgImhhcm5lc3Mu aCIKKwordm9pZAorY3JlYXRlX2NvZGUgKGdjY19qaXRfY29udGV4dCAqY3R4dCwgdm9pZCAqdXNl cl9kYXRhKQoreworICAvKiBMZXQncyB0cnkgdG8gaW5qZWN0IHRoZSBlcXVpdmFsZW50IG9mOgor aW50CitteV9iaXRjYXN0IChkb3VibGUgeCkKK3sKKyAgIHJldHVybiBiaXRjYXN0KHgsIGludCk7 Cit9CisgICAqLworICBnY2Nfaml0X3R5cGUgKmludF90eXBlID0KKyAgICBnY2Nfaml0X2NvbnRl eHRfZ2V0X2ludF90eXBlIChjdHh0LCA0LCAxKTsKKyAgZ2NjX2ppdF90eXBlICpmbG9hdF90eXBl ID0KKyAgICBnY2Nfaml0X2NvbnRleHRfZ2V0X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQRV9GTE9B VCk7CisKKyAgZ2NjX2ppdF9wYXJhbSAqeCA9CisgICAgZ2NjX2ppdF9jb250ZXh0X25ld19wYXJh bSAoCisgICAgICBjdHh0LAorICAgICAgTlVMTCwKKyAgICAgIGZsb2F0X3R5cGUsICJ4Iik7Cisg IGdjY19qaXRfcGFyYW0gKnBhcmFtc1sxXSA9IHt4fTsKKyAgZ2NjX2ppdF9mdW5jdGlvbiAqZnVu YyA9CisgICAgZ2NjX2ppdF9jb250ZXh0X25ld19mdW5jdGlvbiAoY3R4dCwKKwkJCQkgIE5VTEws CisJCQkJICBHQ0NfSklUX0ZVTkNUSU9OX0VYUE9SVEVELAorCQkJCSAgaW50X3R5cGUsCisJCQkJ ICAibXlfYml0Y2FzdCIsCisJCQkJICAxLCBwYXJhbXMsIDApOworCisgIGdjY19qaXRfYmxvY2sg KmluaXRpYWwgPQorICAgIGdjY19qaXRfZnVuY3Rpb25fbmV3X2Jsb2NrIChmdW5jLCAiaW5pdGlh bCIpOworCisgIGdjY19qaXRfYmxvY2tfZW5kX3dpdGhfcmV0dXJuKGluaXRpYWwsIE5VTEwsCisg ICAgZ2NjX2ppdF9jb250ZXh0X25ld19iaXRjYXN0KGN0eHQsCisgICAgICAgIE5VTEwsCisgICAg ICAgIGdjY19qaXRfcGFyYW1fYXNfcnZhbHVlKHgpLAorICAgICAgICBpbnRfdHlwZQorICAgICkp OworfQorCit2b2lkCit2ZXJpZnlfY29kZSAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0LCBnY2Nfaml0 X3Jlc3VsdCAqcmVzdWx0KQoreworICB0eXBlZGVmIGludCAoKm15X2JpdGNhc3RfZm5fdHlwZSkg KGRvdWJsZSk7CisgIENIRUNLX05PTl9OVUxMIChyZXN1bHQpOworICBteV9iaXRjYXN0X2ZuX3R5 cGUgbXlfYml0Y2FzdCA9CisgICAgKG15X2JpdGNhc3RfZm5fdHlwZSlnY2Nfaml0X3Jlc3VsdF9n ZXRfY29kZSAocmVzdWx0LCAibXlfYml0Y2FzdCIpOworICBDSEVDS19OT05fTlVMTCAobXlfYml0 Y2FzdCk7CisgIGludCB2YWwgPSBteV9iaXRjYXN0ICgtNS4xMjk4NzE0KTsKKyAgbm90ZSAoIm15 X2JpdGNhc3QgcmV0dXJuZWQ6ICVkIiwgdmFsKTsKKyAgQ0hFQ0tfVkFMVUUgKHZhbCwgMzU1Njky MDEpOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1lcnJvci1iYWQt Yml0Y2FzdC5jIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1lcnJvci1iYWQtYml0Y2FzdC5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42NDI4OTA2MDVhZAotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtZXJyb3ItYmFkLWJpdGNh c3QuYwpAQCAtMCwwICsxLDYyIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3Rk aW8uaD4KKworI2luY2x1ZGUgImxpYmdjY2ppdC5oIgorCisjaW5jbHVkZSAiaGFybmVzcy5oIgor Cit2b2lkCitjcmVhdGVfY29kZSAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0LCB2b2lkICp1c2VyX2Rh dGEpCit7CisgIC8qIExldCdzIHRyeSB0byBpbmplY3QgdGhlIGVxdWl2YWxlbnQgb2Y6CisKKyAg ICAgaW50CisgICAgIHRlc3RfZm4gKCkKKyAgICAgeworICAgICAgIGNoYXIgZls0MDk2XTsKKyAg ICAgICByZXR1cm4gYml0Y2FzdChmLCBpbnQpOworICAgICB9CisKKyAgICAgYW5kIHZlcmlmeSB0 aGF0IHRoZSBBUEkgY29tcGxhaW5zIGFib3V0IHRoZSBiYWQgY2FzdC4KKyAgKi8KKyAgZ2NjX2pp dF90eXBlICppbnRfdHlwZSA9CisgICAgZ2NjX2ppdF9jb250ZXh0X2dldF90eXBlIChjdHh0LCBH Q0NfSklUX1RZUEVfSU5UKTsKKyAgZ2NjX2ppdF90eXBlICpjaGFyX3R5cGUgPQorICAgIGdjY19q aXRfY29udGV4dF9nZXRfdHlwZSAoY3R4dCwgR0NDX0pJVF9UWVBFX0NIQVIpOworCisKKyAgZ2Nj X2ppdF90eXBlICphcnJheV90eXBlID0KKyAgICBnY2Nfaml0X2NvbnRleHRfbmV3X2FycmF5X3R5 cGUgKGN0eHQsIE5VTEwsIGNoYXJfdHlwZSwgNDA5Nik7CisKKyAgZ2NjX2ppdF9mdW5jdGlvbiAq dGVzdF9mbiA9CisgICAgZ2NjX2ppdF9jb250ZXh0X25ld19mdW5jdGlvbiAoY3R4dCwgTlVMTCwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NfSklUX0ZVTkNUSU9OX0VYUE9S VEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF90eXBlLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X2ZuIiwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDApOworICBnY2Nfaml0X2x2YWx1ZSAqZiA9CisgICAgZ2NjX2ppdF9mdW5jdGlvbl9uZXdf bG9jYWwgKAorICAgICAgdGVzdF9mbiwKKyAgICAgIE5VTEwsCisgICAgICBhcnJheV90eXBlLCAi ZiIpOworCisgIGdjY19qaXRfYmxvY2sgKmJsb2NrID0gZ2NjX2ppdF9mdW5jdGlvbl9uZXdfYmxv Y2sgKHRlc3RfZm4sIE5VTEwpOworCisgIGdjY19qaXRfYmxvY2tfZW5kX3dpdGhfcmV0dXJuICgK KyAgICBibG9jaywgTlVMTCwKKyAgICBnY2Nfaml0X2NvbnRleHRfbmV3X2JpdGNhc3QgKGN0eHQs IE5VTEwsCisJCQkgICAgICBnY2Nfaml0X2x2YWx1ZV9hc19ydmFsdWUgKGYpLAorCQkJICAgICAg aW50X3R5cGUpKTsKK30KKwordm9pZAordmVyaWZ5X2NvZGUgKGdjY19qaXRfY29udGV4dCAqY3R4 dCwgZ2NjX2ppdF9yZXN1bHQgKnJlc3VsdCkKK3sKKyAgQ0hFQ0tfVkFMVUUgKHJlc3VsdCwgTlVM TCk7CisKKyAgLyogVmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSB3YXMgZW1p dHRlZC4gICovCisgIENIRUNLX1NUUklOR19WQUxVRSAoZ2NjX2ppdF9jb250ZXh0X2dldF9maXJz dF9lcnJvciAoY3R4dCksCisJCSAgICAgICJiaXRjYXN0IHdpdGggdHlwZXMgb2YgZGlmZmVyZW50 IHNpemVzIik7Cit9CisKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtZXJy b3ItYmFkLWJpdGNhc3QyLmMgYi9nY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LWVycm9yLWJhZC1i aXRjYXN0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42MDJhZTQw NzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtZXJyb3It YmFkLWJpdGNhc3QyLmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lu Y2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJnY2NqaXQuaCIKKworI2luY2x1ZGUgImhh cm5lc3MuaCIKKwordm9pZAorY3JlYXRlX2NvZGUgKGdjY19qaXRfY29udGV4dCAqY3R4dCwgdm9p ZCAqdXNlcl9kYXRhKQoreworICAvKiBMZXQncyB0cnkgdG8gaW5qZWN0IHRoZSBlcXVpdmFsZW50 IG9mOgorCisgICAgIGNoYXJbNDA5Nl0KKyAgICAgdGVzdF9mbiAoKQorICAgICB7CisgICAgICAg aW50IGY7CisgICAgICAgcmV0dXJuIGJpdGNhc3QoZiwgY2hhcls0MDk2XSk7CisgICAgIH0KKwor ICAgICBhbmQgdmVyaWZ5IHRoYXQgdGhlIEFQSSBjb21wbGFpbnMgYWJvdXQgdGhlIGJhZCBjYXN0 LgorICAqLworICBnY2Nfaml0X3R5cGUgKmludF90eXBlID0KKyAgICBnY2Nfaml0X2NvbnRleHRf Z2V0X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQRV9JTlQpOworICBnY2Nfaml0X3R5cGUgKmNoYXJf dHlwZSA9CisgICAgZ2NjX2ppdF9jb250ZXh0X2dldF90eXBlIChjdHh0LCBHQ0NfSklUX1RZUEVf Q0hBUik7CisKKworICBnY2Nfaml0X3R5cGUgKmFycmF5X3R5cGUgPQorICAgIGdjY19qaXRfY29u dGV4dF9uZXdfYXJyYXlfdHlwZSAoY3R4dCwgTlVMTCwgY2hhcl90eXBlLCA0MDk2KTsKKworICBn Y2Nfaml0X2Z1bmN0aW9uICp0ZXN0X2ZuID0KKyAgICBnY2Nfaml0X2NvbnRleHRfbmV3X2Z1bmN0 aW9uIChjdHh0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ19K SVRfRlVOQ1RJT05fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YXJyYXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9mbiIs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgZ2NjX2ppdF9sdmFsdWUgKmYgPQorICAgIGdj Y19qaXRfZnVuY3Rpb25fbmV3X2xvY2FsICgKKyAgICAgIHRlc3RfZm4sCisgICAgICBOVUxMLAor ICAgICAgaW50X3R5cGUsICJmIik7CisKKyAgZ2NjX2ppdF9ibG9jayAqYmxvY2sgPSBnY2Nfaml0 X2Z1bmN0aW9uX25ld19ibG9jayAodGVzdF9mbiwgTlVMTCk7CisKKyAgZ2NjX2ppdF9ibG9ja19l bmRfd2l0aF9yZXR1cm4gKAorICAgIGJsb2NrLCBOVUxMLAorICAgIGdjY19qaXRfY29udGV4dF9u ZXdfYml0Y2FzdCAoY3R4dCwgTlVMTCwKKwkJCSAgICAgIGdjY19qaXRfbHZhbHVlX2FzX3J2YWx1 ZSAoZiksCisJCQkgICAgICBhcnJheV90eXBlKSk7Cit9CisKK3ZvaWQKK3ZlcmlmeV9jb2RlIChn Y2Nfaml0X2NvbnRleHQgKmN0eHQsIGdjY19qaXRfcmVzdWx0ICpyZXN1bHQpCit7CisgIENIRUNL X1ZBTFVFIChyZXN1bHQsIE5VTEwpOworCisgIC8qIFZlcmlmeSB0aGF0IHRoZSBjb3JyZWN0IGVy cm9yIG1lc3NhZ2Ugd2FzIGVtaXR0ZWQuICAqLworICBDSEVDS19TVFJJTkdfVkFMVUUgKGdjY19q aXRfY29udGV4dF9nZXRfZmlyc3RfZXJyb3IgKGN0eHQpLAorCQkgICAgICAiYml0Y2FzdCB3aXRo IHR5cGVzIG9mIGRpZmZlcmVudCBzaXplcyIpOworfQorCmRpZmYgLS1naXQgYS9nY2MvdG9wbGV2 LmNjIGIvZ2NjL3RvcGxldi5jYwppbmRleCA1MzRkYTE0NjJlOC4uYmM0OTIxOTc0ZWIgMTAwNjQ0 Ci0tLSBhL2djYy90b3BsZXYuY2MKKysrIGIvZ2NjL3RvcGxldi5jYwpAQCAtMjM2OCw2ICsyMzY4 LDcgQEAgdG9wbGV2OjpmaW5hbGl6ZSAodm9pZCkKICAgZ2NzZV9jX2ZpbmFsaXplICgpOwogICBp cGFfY3BfY19maW5hbGl6ZSAoKTsKICAgaXJhX2Nvc3RzX2NfZmluYWxpemUgKCk7CisgIHRyZWVf Y2NfZmluYWxpemUgKCk7CiAKICAgLyogc2F2ZV9kZWNvZGVkX29wdGlvbnMgdXNlcyBvcHRzX29i c3RhY2ssIHNvIHRoZXNlIG11c3QKICAgICAgYmUgY2xlYW5lZCB1cCB0b2dldGhlci4gICovCmRp ZmYgLS1naXQgYS9nY2MvdHJlZS5jYyBiL2djYy90cmVlLmNjCmluZGV4IGFlMTU5ZWUyMGNlLi5m ZTlkOTA4MzAyNiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUuY2MKKysrIGIvZ2NjL3RyZWUuY2MKQEAg LTY5NjMsNiArNjk2MywxNSBAQCBidWlsZF9yZWZlcmVuY2VfdHlwZSAodHJlZSB0b190eXBlKQog ICAoSE9TVF9CSVRTX1BFUl9XSURFX0lOVCA+IDY0ID8gSE9TVF9CSVRTX1BFUl9XSURFX0lOVCA6 IDY0KQogc3RhdGljIEdUWSgoKSkgdHJlZSBub25zdGFuZGFyZF9pbnRlZ2VyX3R5cGVfY2FjaGVb MiAqIE1BWF9JTlRfQ0FDSEVEX1BSRUMgKyAyXTsKIAorc3RhdGljIHZvaWQKK2NsZWFyX25vbnN0 YW5kYXJkX2ludGVnZXJfdHlwZV9jYWNoZSAodm9pZCkKK3sKKyAgZm9yIChzaXplX3QgaSA9IDAg OyBpIDwgMiAqIE1BWF9JTlRfQ0FDSEVEX1BSRUMgKyAyIDsgaSsrKQorICB7CisgICAgbm9uc3Rh bmRhcmRfaW50ZWdlcl90eXBlX2NhY2hlW2ldID0gTlVMTDsKKyAgfQorfQorCiAvKiBCdWlsZHMg YSBzaWduZWQgb3IgdW5zaWduZWQgaW50ZWdlciB0eXBlIG9mIHByZWNpc2lvbiBQUkVDSVNJT04u CiAgICBVc2VkIGZvciBDIGJpdGZpZWxkcyB3aG9zZSBwcmVjaXNpb24gZG9lcyBub3QgbWF0Y2gg dGhhdCBvZgogICAgYnVpbHQtaW4gdGFyZ2V0IHR5cGVzLiAgKi8KQEAgLTE0NTY1LDYgKzE0NTc0 LDEyIEBAIGdldF9hdHRyX25vbnN0cmluZ19kZWNsICh0cmVlIGV4cHIsIHRyZWUgKnJlZikKICAg cmV0dXJuIE5VTExfVFJFRTsKIH0KIAordm9pZAordHJlZV9jY19maW5hbGl6ZSAodm9pZCkKK3sK KyAgY2xlYXJfbm9uc3RhbmRhcmRfaW50ZWdlcl90eXBlX2NhY2hlICgpOworfQorCiAjaWYgQ0hF Q0tJTkdfUAogCiBuYW1lc3BhY2Ugc2VsZnRlc3QgewpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUuaCBi L2djYy90cmVlLmgKaW5kZXggMzBiYzUzYzI5OTYuLmJmODg2ZmMyNDcyIDEwMDY0NAotLS0gYS9n Y2MvdHJlZS5oCisrKyBiL2djYy90cmVlLmgKQEAgLTUzODUsNiArNTM4NSw3IEBAIGV4dGVybiBi b29sIHJlYWxfbWludXNfb25lcCAoY29uc3RfdHJlZSk7CiBleHRlcm4gdm9pZCBpbml0X3R0cmVl ICh2b2lkKTsKIGV4dGVybiB2b2lkIGJ1aWxkX2NvbW1vbl90cmVlX25vZGVzIChib29sKTsKIGV4 dGVybiB2b2lkIGJ1aWxkX2NvbW1vbl9idWlsdGluX25vZGVzICh2b2lkKTsKK2V4dGVybiB2b2lk IHRyZWVfY2NfZmluYWxpemUgKHZvaWQpOwogZXh0ZXJuIHRyZWUgYnVpbGRfbm9uc3RhbmRhcmRf aW50ZWdlcl90eXBlICh1bnNpZ25lZCBIT1NUX1dJREVfSU5ULCBpbnQpOwogZXh0ZXJuIHRyZWUg YnVpbGRfbm9uc3RhbmRhcmRfYm9vbGVhbl90eXBlICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UKTsK IGV4dGVybiB0cmVlIGJ1aWxkX3JhbmdlX3R5cGUgKHRyZWUsIHRyZWUsIHRyZWUpOwotLSAKMi4y Ni4yLjcuZzE5ZGI5Y2ZiNjguZGlydHkKCg== --=-B4q20x/5r5N5MCKLGHsV--