From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o91.zoho.com (sender4-pp-o90.zoho.com [136.143.188.90]) by sourceware.org (Postfix) with ESMTPS id 0B2363858D39; Sat, 20 Nov 2021 22:34:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0B2363858D39 ARC-Seal: i=1; a=rsa-sha256; t=1637447644; cv=none; d=zohomail.com; s=zohoarc; b=Y+mVjQlj2TDoyveE0kHF5wORIpIinrhPiwjnG/zClbVMnAfye5oF05QPM7wra9UsrTvKcoZSUuM4OulVijwZlrOFjJAiktGOLCSOqQSlPdxonHJR6WukE7cUYZcNic1hZ+4nyxbJQENXeSlpagRkEZPf7e2/lkqSnu/iTaos0Ew= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1637447644; h=Content-Type:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=/hy8m0JGsIgup7j4bOo1N9LPLN0wJWbdDQ8RjhQ9o8o=; b=NWuY+tfUZWgB0yQtB4cPwQLJu1pOWCNJVdnQ4kwOjnz82OnS9GliMUAGxNMVatRbkK6M6F3XOwD3bS8179aykj6Haiqa/TuP/cSsbGjCDELQVxO3Bx0u7KCeTqYLpMdVzsRgW3wdwdOmXfwFTEufLkRONA2b4jZ3dewNBcBJ/Gc= 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 1637447642508934.8962916245141; Sat, 20 Nov 2021 14:34:02 -0800 (PST) Message-ID: Subject: Re: [PATCH] libgccjit: Add support for TLS variable [PR95415] From: Antoni Boucher To: David Malcolm , jit@gcc.gnu.org, gcc-patches@gcc.gnu.org Date: Sat, 20 Nov 2021 17:34:00 -0500 In-Reply-To: References: <750892c90ccd75ae1df099b829ce2d51fe886195.camel@zoho.com> Content-Type: multipart/mixed; boundary="=-tQgUHGO3g/SXnJHviU5s" User-Agent: Evolution 3.42.1 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, 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: Sat, 20 Nov 2021 22:34:14 -0000 --=-tQgUHGO3g/SXnJHviU5s Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi. Here's the updated patch. See comments below. Thanks for your reviews! Le jeudi 20 mai 2021 =C3=A0 16:11 -0400, David Malcolm a =C3=A9crit=C2=A0: > On Tue, 2021-05-18 at 20:43 -0400, Antoni Boucher via Gcc-patches > wrote: > > Hello. > > This patch adds support for TLS variables. > > One thing to fix before we merge it is the libgccjit.map file which > > contains LIBGCCJIT_ABI_16 instead of LIBGCCJIT_ABI_17. > > LIBGCCJIT_ABI_16 was added in one of my other patches. > > Thanks for the review. >=20 > > diff --git a/gcc/jit/docs/topics/compatibility.rst > > b/gcc/jit/docs/topics/compatibility.rst > > index 239b6aa1a92..d10bc1df080 100644 > > --- a/gcc/jit/docs/topics/compatibility.rst > > +++ b/gcc/jit/docs/topics/compatibility.rst > > @@ -243,3 +243,12 @@ embedding assembler instructions: > > =C2=A0=C2=A0 * :func:`gcc_jit_extended_asm_add_input_operand` > > =C2=A0=C2=A0 * :func:`gcc_jit_extended_asm_add_clobber` > > =C2=A0=C2=A0 * :func:`gcc_jit_context_add_top_level_asm` > > + > > +.. _LIBGCCJIT_ABI_17: > > + > > +``LIBGCCJIT_ABI_17`` > > +----------------------- > > +``LIBGCCJIT_ABI_17`` covers the addition of an API entrypoint to set > > the > > +thread-local storage model of a variable: > > + > > +=C2=A0 * :func:`gcc_jit_lvalue_set_tls_model` >=20 > Sorry about the delay in reviewing patches. >=20 > Is there a summary somewhere of the various outstanding patches and > their associated ABI versions?=C2=A0 Are there dependencies between the > patches? The list of patches is there: https://github.com/antoyo/libgccjit-patches but I don't keep them up- to-date. If that would help you, I could add a README to tell what is the new ABI version for each patch. I believe there might be some patches that depend on a previous one. >=20 > > diff --git a/gcc/jit/docs/topics/expressions.rst > b/gcc/jit/docs/topics/expressions.rst > > index 396259ef07e..68defd6a311 100644 > > --- a/gcc/jit/docs/topics/expressions.rst > > +++ b/gcc/jit/docs/topics/expressions.rst > > @@ -539,6 +539,34 @@ where the rvalue is computed by reading from > > the storage area. > > =C2=A0 > > =C2=A0=C2=A0=C2=A0 in C. > > =C2=A0 > > +.. function:: void\ > > +=C2=A0=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_lvalue_set_tls_model (gcc_jit_lvalue > > *lvalue,\ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 enum gcc_jit_tls_model > > model) > > + > > +=C2=A0=C2=A0 Make a variable a thread-local variable. > > + > > +=C2=A0=C2=A0 The "model" parameter determines the thread-local storage= model > > of the "lvalue": > > + > > +=C2=A0=C2=A0 .. type:: enum gcc_jit_tls_model > > + > > +=C2=A0=C2=A0 .. c:macro:: GCC_JIT_TLS_MODEL_GLOBAL_DYNAMIC > > + > > +=C2=A0=C2=A0 .. c:macro:: GCC_JIT_TLS_MODEL_LOCAL_DYNAMIC > > + > > +=C2=A0=C2=A0 .. c:macro:: GCC_JIT_TLS_MODEL_INITIAL_EXEC > > + > > +=C2=A0=C2=A0 .. c:macro:: GCC_JIT_TLS_MODEL_LOCAL_EXEC > > + > > +=C2=A0=C2=A0 .. c:macro:: GCC_JIT_TLS_MODEL_DEFAULT > > + > > +=C2=A0=C2=A0 This is analogous to: > > + > > +=C2=A0=C2=A0 .. code-block:: c > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0 _Thread_local int foo; > > + > > +=C2=A0=C2=A0 in C. >=20 > This comment needs the usual "This entrypoint was added in" text to > state which API version it was added in. >=20 > I confess to being a bit hazy on the different TLS models, and it's > unclear to me what all the different enum values do.=C2=A0 Is this > equivalent to the various values for > __attribute__((tls_model(VALUE))) > ?=C2=A0 This attribute is documented in > https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html, > though sadly that document doesn't seem to have a good anchor for > that > attribute. Yes, it is the equivalent of this attribute. >=20 > https://gcc.gnu.org/onlinedocs/gcc/Thread-Local.html=C2=A0currently links > to > https://www.akkadia.org/drepper/tls.pdf=C2=A0"for a detailed explanation > of > the four thread-local storage addressing models, and how the runtime > is > expected to function." >=20 > One thing that should be clarified: does GCC_JIT_TLS_MODEL_DEFAULT > mean > (a) thread-local storage, using a default model, or > (b) non-thread-local storage i.e. normal storage. >=20 > ? >=20 > Reading the docs I thought it meant (a), but when I looked in more > detail at the implementation it looks like it means (b); is it meant > to?=C2=A0 This needs clarifying. >=20 > Are you using all of these enum values in your code?=C2=A0 Is this > something > you need to expose for the rustc backend? Yes, I use all of these enum values in the rustc gcc codegen. >=20 >=20 > > =C2=A0Global variables > > =C2=A0**************** > > =C2=A0 > > diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h > > index 825a3e172e9..654a9c472d4 100644 > > --- a/gcc/jit/jit-playback.h > > +++ b/gcc/jit/jit-playback.h > > @@ -650,6 +650,8 @@ public: > > =C2=A0 > > =C2=A0private: > > =C2=A0=C2=A0 context *m_ctxt; > > + > > +protected: > > =C2=A0=C2=A0 tree m_inner; > > =C2=A0}; >=20 > As noted in another review, I don't think you need to make this > protected... >=20 > > =C2=A0 > > @@ -670,6 +672,12 @@ public: > > =C2=A0=C2=A0 rvalue * > > =C2=A0=C2=A0 get_address (location *loc); > > =C2=A0 > > +=C2=A0 void > > +=C2=A0 set_tls_model (enum tls_model tls_model) > > +=C2=A0 { > > +=C2=A0=C2=A0=C2=A0 set_decl_tls_model (m_inner, tls_model); > > +=C2=A0 } >=20 > ...as I think you can use "as_tree ()" to get at m_inner here. >=20 >=20 > > diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c > > index 117ff70114c..64f3ae2d8f9 100644 > > --- a/gcc/jit/jit-recording.c > > +++ b/gcc/jit/jit-recording.c > > @@ -3713,6 +3713,12 @@ recording::lvalue::get_address > > (recording::location *loc) > > =C2=A0=C2=A0 return result; > > =C2=A0} > > =C2=A0 > > +void > > +recording::lvalue::set_tls_model (enum gcc_jit_tls_model model) > > +{ > > +=C2=A0=C2=A0=C2=A0 m_tls_model =3D model; > > +} > > + > > =C2=A0/* The implementation of class gcc::jit::recording::param.=C2=A0 = */ > > =C2=A0 > > =C2=A0/* Implementation of pure virtual hook > > recording::memento::replay_into > > @@ -4539,6 +4545,15 @@ recording::block::dump_edges_to_dot > > (pretty_printer *pp) > > =C2=A0#=C2=A0 pragma GCC diagnostic pop > > =C2=A0#endif > > =C2=A0 > > +namespace recording { > > +static const enum tls_model tls_models[] =3D { > > +=C2=A0 TLS_MODEL_GLOBAL_DYNAMIC, /* GCC_JIT_TLS_MODEL_GLOBAL_DYNAMIC *= / > > +=C2=A0 TLS_MODEL_LOCAL_DYNAMIC, /* GCC_JIT_TLS_MODEL_LOCAL_DYNAMIC */ > > +=C2=A0 TLS_MODEL_INITIAL_EXEC, /* GCC_JIT_TLS_MODEL_INITIAL_EXEC */ > > +=C2=A0 TLS_MODEL_LOCAL_EXEC, /* GCC_JIT_TLS_MODEL_LOCAL_EXEC */ > > +}; > > +} /* namespace recording */ > > + > > =C2=A0/* The implementation of class gcc::jit::recording::global.=C2=A0= */ > > =C2=A0 > > =C2=A0/* Implementation of pure virtual hook > > recording::memento::replay_into > > @@ -4547,8 +4562,7 @@ recording::block::dump_edges_to_dot > > (pretty_printer *pp) > > =C2=A0void > > =C2=A0recording::global::replay_into (replayer *r) > > =C2=A0{ > > -=C2=A0 set_playback_obj ( > > -=C2=A0=C2=A0=C2=A0 m_initializer > > +=C2=A0=C2=A0=C2=A0 playback::lvalue *global =3D m_initializer > > =C2=A0=C2=A0=C2=A0=C2=A0 ? r->new_global_initialized (playback_location= (r, m_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 m_kind, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 m_type->playback_type (), > > @@ -4560,7 +4574,12 @@ recording::global::replay_into (replayer *r) > > =C2=A0=C2=A0=C2=A0=C2=A0 : r->new_global (playback_location (r, m_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 m_kind, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 m_type->playback_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 playback_string (m_name))); > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 playback_string (m_name)); > > +=C2=A0 if (m_tls_model !=3D GCC_JIT_TLS_MODEL_DEFAULT) > > +=C2=A0 { > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 global->set_tls_model (recording::tls_m= odels[m_tls_model]); > > +=C2=A0 } > > +=C2=A0 set_playback_obj (global); > > =C2=A0} > > =C2=A0 > > =C2=A0/* Override the default implementation of >=20 > [...snip...] >=20 > > @@ -4675,6 +4702,14 @@ recording::global::write_reproducer > > (reproducer &r) > > =C2=A0=C2=A0=C2=A0=C2=A0 r.get_identifier_as_type (get_type ()), > > =C2=A0=C2=A0=C2=A0=C2=A0 m_name->get_debug_string ()); > > =C2=A0 > > +=C2=A0 if (m_tls_model) > > +=C2=A0 { >=20 > I think this conditional should be: >=20 > =C2=A0=C2=A0=C2=A0=C2=A0 if (m_tls_model !=3D GCC_JIT_TLS_MODEL_DEFAULT) >=20 > since the default value isn't 0.=C2=A0 (Maybe it should be?) >=20 > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0r.write ("=C2=A0 gcc_jit_lva= lue_set_tls_model (%s, /* > gcc_jit_lvalue *lvalue */\n" > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 %s); /* enum > > gcc_jit_tls_model model */\n", > > +=C2=A0=C2=A0=C2=A0 id, > > +=C2=A0=C2=A0=C2=A0 tls_model_enum_strings[m_tls_model]); > > +=C2=A0 } > > + > > =C2=A0=C2=A0 if (m_initializer) > > =C2=A0=C2=A0=C2=A0=C2=A0 switch (m_type->dereference ()->get_size ()) > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 { >=20 > [...snip...] >=20 > > =C2=A0class param : public lvalue > > diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c > > index 0cc650f9810..768b99499cf 100644 > > --- a/gcc/jit/libgccjit.c > > +++ b/gcc/jit/libgccjit.c > > @@ -1953,6 +1953,24 @@ gcc_jit_lvalue_get_address (gcc_jit_lvalue > > *lvalue, > > =C2=A0=C2=A0 return (gcc_jit_rvalue *)lvalue->get_address (loc); > > =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::lvalue::set_tls_model method in jit- > > recording.c.=C2=A0 */ > > + > > +void > > +gcc_jit_lvalue_set_tls_model (gcc_jit_lvalue *lvalue, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 enum gcc_jit_tls_model model) > > +{ > > +=C2=A0 RETURN_IF_FAIL (lvalue, NULL, NULL, "NULL lvalue"); > > +=C2=A0 JIT_LOG_FUNC (lvalue->get_context ()->get_logger ()); > > +=C2=A0 RETURN_IF_FAIL_PRINTF1 (lvalue->is_global (), NULL, 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 "lvalue \"%s\" not a global", > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 lvalue->get_debug_string ()); >=20 > This should pass lvalue's context to the RETURN_IF_FAIL_PRINTF1, so > that if it fails, the error is associated with the context. >=20 >=20 > > +=C2=A0 lvalue->set_tls_model (model); > > +} > > + > > =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 > > diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h > > index 5c722c2c57f..2a52b351a49 100644 > > --- a/gcc/jit/libgccjit.h > > +++ b/gcc/jit/libgccjit.h > > @@ -722,6 +722,16 @@ enum gcc_jit_function_kind > > =C2=A0=C2=A0 GCC_JIT_FUNCTION_ALWAYS_INLINE > > =C2=A0}; > > =C2=A0 > > +/* Thread local storage model.=C2=A0 */ > > +enum gcc_jit_tls_model > > +{ > > +=C2=A0 GCC_JIT_TLS_MODEL_GLOBAL_DYNAMIC, > > +=C2=A0 GCC_JIT_TLS_MODEL_LOCAL_DYNAMIC, > > +=C2=A0 GCC_JIT_TLS_MODEL_INITIAL_EXEC, > > +=C2=A0 GCC_JIT_TLS_MODEL_LOCAL_EXEC, > > +=C2=A0 GCC_JIT_TLS_MODEL_DEFAULT, >=20 > As noted above, should the DEFAULT one be the first? I made it the first one. >=20 > If DEFAULT means "not thread-local", maybe "NONE" would be clearer > than > "DEFAULT"? >=20 > > +}; > > + > > =C2=A0/* Create a function.=C2=A0 */ > > =C2=A0extern gcc_jit_function * > > =C2=A0gcc_jit_context_new_function (gcc_jit_context *ctxt, > > @@ -1072,6 +1082,17 @@ extern gcc_jit_rvalue * > > =C2=A0gcc_jit_lvalue_get_address (gcc_jit_lvalue *lvalue, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=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 > > +#define LIBGCCJIT_HAVE_gcc_jit_lvalue_set_tls_model > > + > > +/* Set the thread-local storage model of a global variable > > + > > +=C2=A0=C2=A0 This API entrypoint was added in LIBGCCJIT_ABI_17; you ca= n test > > for its > > +=C2=A0=C2=A0 presence using > > +=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_gcc_jit_lvalue_set_tls_= model=C2=A0 */ > > +extern void > > +gcc_jit_lvalue_set_tls_model (gcc_jit_lvalue *lvalue, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 enum gcc_jit_tls_model model); > > + > > =C2=A0extern gcc_jit_lvalue * > > =C2=A0gcc_jit_function_new_local (gcc_jit_function *func, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=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, > > diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map > > index 337ea6c7fe4..605c624ec4a 100644 > > --- a/gcc/jit/libgccjit.map > > +++ b/gcc/jit/libgccjit.map > > @@ -205,3 +205,8 @@ LIBGCCJIT_ABI_15 { > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_extended_asm_add_clobber; > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_context_add_top_level_asm; > > =C2=A0} LIBGCCJIT_ABI_14; > > + > > +LIBGCCJIT_ABI_16 { > > +=C2=A0 global: > > +=C2=A0=C2=A0=C2=A0 gcc_jit_lvalue_set_tls_model; > > +} LIBGCCJIT_ABI_15; >=20 > Obviously the ABI needs to be fixed up here. >=20 > > diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h > > b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > index 4202eb7798b..c2d87a30cca 100644 > > --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h > > +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h > > @@ -181,6 +181,13 @@ > > =C2=A0#undef create_code > > =C2=A0#undef verify_code > > =C2=A0 > > +/* test-tls.c */ > > +#define create_code create_code_tls > > +#define verify_code verify_code_tls > > +#include "test-tls.c" > > +#undef create_code > > +#undef verify_code > > + > > =C2=A0/* test-hello-world.c */ > > =C2=A0#define create_code create_code_hello_world > > =C2=A0#define verify_code verify_code_hello_world >=20 > This is missing an entry in the "testcases" array at the bottom of > the > header to make use of the new {create|verify}_code_tls functions. >=20 > > diff --git a/gcc/testsuite/jit.dg/test-tls.c > > b/gcc/testsuite/jit.dg/test-tls.c > > new file mode 100644 > > index 00000000000..d4508b16c1e > > --- /dev/null > > +++ b/gcc/testsuite/jit.dg/test-tls.c > > @@ -0,0 +1,29 @@ > > +#include > > +#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: > > + > > +=C2=A0=C2=A0=C2=A0=C2=A0 _Thread_local int foo; > > +=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_lvalue *foo =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_new_global ( > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ctxt, NULL, GCC_JIT_GLOBAL_EXPORTED, in= t_type, "foo"); > > +=C2=A0 gcc_jit_lvalue_set_tls_model (foo, > > GCC_JIT_TLS_MODEL_GLOBAL_DYNAMIC); >=20 > How many of the different enum values can be supported?=C2=A0 How target- > dependent is this? I'm not sure what you mean here. Are you asking that I test all the different enum values? The tls_model enum is defined in gcc/coretypes.h and does not seem to change depending on the target. Maybe there are checks elsewhere for that, though. >=20 > > +} > > + > > +void > > +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) > > +{ >=20 > Should probably at least try to read and write the global(s). >=20 > Hope this is constructive > Dave >=20 >=20 --=-tQgUHGO3g/SXnJHviU5s Content-Disposition: attachment; filename="0001-libgccjit-Add-support-for-TLS-variable-PR95415.patch" Content-Type: text/x-patch; name="0001-libgccjit-Add-support-for-TLS-variable-PR95415.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBkNjRmNTBmZjk1NTFkMWJkNDljOWU1MzA0ZjJkMDU2YjAzMWQwNDZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogVHVlLCAxMSBNYXkgMjAyMSAxOToyMzo1NCAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdIGxpYmdj Y2ppdDogQWRkIHN1cHBvcnQgZm9yIFRMUyB2YXJpYWJsZSBbUFI5NTQxNV0KCjIwMjEtMTEtMjAg IEFudG9uaSBCb3VjaGVyICA8Ym91YW50b0B6b2hvLmNvbT4KCiAgICBnY2Mvaml0LwogICAgICAg ICAgICBQUiB0YXJnZXQvOTU0MTUKICAgICAgICAgICAgKiBkb2NzL3RvcGljcy9jb21wYXRpYmls aXR5LnJzdCAoTElCR0NDSklUX0FCSV8xNyk6IE5ldyBBQkkKICAgICAgICAgICAgdGFnLgogICAg ICAgICAgICAqIGRvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdDogQWRkIGRvY3VtZW50IGZvciB0 aGUgZnVuY3Rpb24KICAgICAgICAgICAgZ2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2RlbC4KICAg ICAgICAgICAgKiBqaXQtcGxheWJhY2suaDogTmV3IGZ1bmN0aW9uIChzZXRfdGxzX21vZGVsKSBh bmQgbWFrZQogICAgICAgICAgICBydmFsdWU6Om1faW5uZXIgcHVibGljLgogICAgICAgICAgICAq IGppdC1yZWNvcmRpbmcuYzogTmV3IGZ1bmN0aW9uIChzZXRfdGxzX21vZGVsKSwgbmV3CiAgICAg ICAgICAgIHZhcmlhYmxlcyAodGxzX21vZGVscyBhbmQgdGxzX21vZGVsX2VudW1fc3RyaW5ncykg YW5kIHN1cHBvcnQKICAgICAgICAgICAgZm9yIHNldHRpbmcgdGhlIHRscyBtb2RlbC4KICAgICAg ICAgICAgKiBqaXQtcmVjb3JkaW5nLmg6IE5ldyBmdW5jdGlvbiAoc2V0X3Rsc19tb2RlbCkgYW5k IG5ldwogICAgICAgICAgICBmaWVsZCBtX3Rsc19tb2RlbC4KICAgICAgICAgICAgKiBsaWJnY2Nq aXQuYzogTmV3IGZ1bmN0aW9uIChnY2Nfaml0X2x2YWx1ZV9zZXRfdGxzX21vZGVsKS4KICAgICAg ICAgICAgKiBsaWJnY2NqaXQuaDogTmV3IGZ1bmN0aW9uIChnY2Nfaml0X2x2YWx1ZV9zZXRfdGxz X21vZGVsKQogICAgICAgICAgICBhbmQgbmV3IGVudW0gKGdjY19qaXRfdGxzX21vZGVsKS4KICAg ICAgICAgICAgKiBsaWJnY2NqaXQubWFwIChMSUJHQ0NKSVRfQUJJXzE3KTogTmV3IEFCSSB0YWcu CgogICAgZ2NjL3Rlc3RzdWl0ZS8KICAgICAgICAgICAgUFIgdGFyZ2V0Lzk1NDE1CiAgICAgICAg ICAgICogaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oOiBBZGQgdGVzdC10bHMuYy4KICAg ICAgICAgICAgKiBqaXQuZGcvdGVzdC10bHMuYzogTmV3IHRlc3QuCi0tLQogZ2NjL2ppdC9kb2Nz L3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAgICAgICAgfCAgOSArKysKIGdjYy9qaXQvZG9jcy90 b3BpY3MvZXhwcmVzc2lvbnMucnN0ICAgICAgICAgIHwgMzcgKysrKysrKysrKysKIGdjYy9qaXQv aml0LXBsYXliYWNrLmggICAgICAgICAgICAgICAgICAgICAgIHwgIDYgKysKIGdjYy9qaXQvaml0 LXJlY29yZGluZy5jICAgICAgICAgICAgICAgICAgICAgIHwgNDIgKysrKysrKysrKysrLQogZ2Nj L2ppdC9qaXQtcmVjb3JkaW5nLmggICAgICAgICAgICAgICAgICAgICAgfCAgNyArKy0KIGdjYy9q aXQvbGliZ2Njaml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTggKysrKysrCiBnY2Mv aml0L2xpYmdjY2ppdC5oICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIxICsrKysrKysKIGdj Yy9qaXQvbGliZ2Njaml0Lm1hcCAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUgKysKIGdjYy90 ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5oIHwgMTAgKysrCiBnY2MvdGVz dHN1aXRlL2ppdC5kZy90ZXN0LXRscy5jICAgICAgICAgICAgICB8IDY0ICsrKysrKysrKysrKysr KysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCAyMTUgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMo LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXRscy5jCgpk aWZmIC0tZ2l0IGEvZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCBiL2djYy9q aXQvZG9jcy90b3BpY3MvY29tcGF0aWJpbGl0eS5yc3QKaW5kZXggNTJlZTNmODYwYTcuLjJhZDZl NDIzMmY3IDEwMDY0NAotLS0gYS9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0 CisrKyBiL2djYy9qaXQvZG9jcy90b3BpY3MvY29tcGF0aWJpbGl0eS5yc3QKQEAgLTI4NCwzICsy ODQsMTIgQEAgZW50cnlwb2ludHM6CiAgICogOmZ1bmM6YGdjY19qaXRfc3RydWN0X2dldF9maWVs ZGAKIAogICAqIDpmdW5jOmBnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGRfY291bnRgCisKKy4uIF9M SUJHQ0NKSVRfQUJJXzE3OgorCitgYExJQkdDQ0pJVF9BQklfMTdgYAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KK2BgTElCR0NDSklUX0FCSV8xN2BgIGNvdmVycyB0aGUgYWRkaXRpb24gb2YgYW4g QVBJIGVudHJ5cG9pbnQgdG8gc2V0IHRoZQordGhyZWFkLWxvY2FsIHN0b3JhZ2UgbW9kZWwgb2Yg YSB2YXJpYWJsZToKKworICAqIDpmdW5jOmBnY2Nfaml0X2x2YWx1ZV9zZXRfdGxzX21vZGVsYApk aWZmIC0tZ2l0IGEvZ2NjL2ppdC9kb2NzL3RvcGljcy9leHByZXNzaW9ucy5yc3QgYi9nY2Mvaml0 L2RvY3MvdG9waWNzL2V4cHJlc3Npb25zLnJzdAppbmRleCAzOTYyNTllZjA3ZS4uMzg2YjgwZDhm OGIgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvZG9jcy90b3BpY3MvZXhwcmVzc2lvbnMucnN0CisrKyBi L2djYy9qaXQvZG9jcy90b3BpY3MvZXhwcmVzc2lvbnMucnN0CkBAIC01MzksNiArNTM5LDQzIEBA IHdoZXJlIHRoZSBydmFsdWUgaXMgY29tcHV0ZWQgYnkgcmVhZGluZyBmcm9tIHRoZSBzdG9yYWdl IGFyZWEuCiAKICAgIGluIEMuCiAKKy4uIGZ1bmN0aW9uOjogdm9pZFwKKyAgICAgICAgICAgICAg Z2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2RlbCAoZ2NjX2ppdF9sdmFsdWUgKmx2YWx1ZSxcCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZ2NjX2ppdF90 bHNfbW9kZWwgbW9kZWwpCisKKyAgIE1ha2UgYSB2YXJpYWJsZSBhIHRocmVhZC1sb2NhbCB2YXJp YWJsZS4KKworICAgVGhlICJtb2RlbCIgcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIHRocmVhZC1s b2NhbCBzdG9yYWdlIG1vZGVsIG9mIHRoZSAibHZhbHVlIjoKKworICAgLi4gdHlwZTo6IGVudW0g Z2NjX2ppdF90bHNfbW9kZWwKKworICAgLi4gYzptYWNybzo6IEdDQ19KSVRfVExTX01PREVMX05P TkUKKworICAgICAgRG9uJ3Qgc2V0IHRoZSBUTFMgbW9kZWwuCisKKyAgIC4uIGM6bWFjcm86OiBH Q0NfSklUX1RMU19NT0RFTF9HTE9CQUxfRFlOQU1JQworCisgICAuLiBjOm1hY3JvOjogR0NDX0pJ VF9UTFNfTU9ERUxfTE9DQUxfRFlOQU1JQworCisgICAuLiBjOm1hY3JvOjogR0NDX0pJVF9UTFNf TU9ERUxfSU5JVElBTF9FWEVDCisKKyAgIC4uIGM6bWFjcm86OiBHQ0NfSklUX1RMU19NT0RFTF9M T0NBTF9FWEVDCisKKyAgIFRoaXMgaXMgYW5hbG9nb3VzIHRvOgorCisgICAuLiBjb2RlLWJsb2Nr OjogYworCisgICAgIF9UaHJlYWRfbG9jYWwgaW50IGZvbyBfX2F0dHJpYnV0ZV9fICgodGxzX21v ZGVsKCJNT0RFTCIpKSk7CisKKyAgIGluIEMuCisKKyAgIFRoaXMgZW50cnlwb2ludCB3YXMgYWRk ZWQgaW4gOnJlZjpgTElCR0NDSklUX0FCSV8xN2A7IHlvdSBjYW4gdGVzdCBmb3IKKyAgIGl0cyBw cmVzZW5jZSB1c2luZworCisgICAuLiBjb2RlLWJsb2NrOjogYworCisgICAgICAjaWZkZWYgTElC R0NDSklUX0hBVkVfZ2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2RlbAorCiBHbG9iYWwgdmFyaWFi bGVzCiAqKioqKioqKioqKioqKioqCiAKZGlmZiAtLWdpdCBhL2djYy9qaXQvaml0LXBsYXliYWNr LmggYi9nY2Mvaml0L2ppdC1wbGF5YmFjay5oCmluZGV4IGY2NzBjOWU4MWRmLi5jOTgzOWMyMWE2 NiAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9qaXQtcGxheWJhY2suaAorKysgYi9nY2Mvaml0L2ppdC1w bGF5YmFjay5oCkBAIC02NzUsNiArNjc1LDEyIEBAIHB1YmxpYzoKICAgcnZhbHVlICoKICAgZ2V0 X2FkZHJlc3MgKGxvY2F0aW9uICpsb2MpOwogCisgIHZvaWQKKyAgc2V0X3Rsc19tb2RlbCAoZW51 bSB0bHNfbW9kZWwgdGxzX21vZGVsKQorICB7CisgICAgc2V0X2RlY2xfdGxzX21vZGVsIChhc190 cmVlICgpLCB0bHNfbW9kZWwpOworICB9CisKIHByaXZhdGU6CiAgIGJvb2wgbWFya19hZGRyZXNz YWJsZSAobG9jYXRpb24gKmxvYyk7CiB9OwpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9qaXQtcmVjb3Jk aW5nLmMgYi9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuYwppbmRleCAxMTdmZjcwMTE0Yy4uMTI5NmZl Y2U0Y2YgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvaml0LXJlY29yZGluZy5jCisrKyBiL2djYy9qaXQv aml0LXJlY29yZGluZy5jCkBAIC0zNzEzLDYgKzM3MTMsMTIgQEAgcmVjb3JkaW5nOjpsdmFsdWU6 OmdldF9hZGRyZXNzIChyZWNvcmRpbmc6OmxvY2F0aW9uICpsb2MpCiAgIHJldHVybiByZXN1bHQ7 CiB9CiAKK3ZvaWQKK3JlY29yZGluZzo6bHZhbHVlOjpzZXRfdGxzX21vZGVsIChlbnVtIGdjY19q aXRfdGxzX21vZGVsIG1vZGVsKQoreworICAgIG1fdGxzX21vZGVsID0gbW9kZWw7Cit9CisKIC8q IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjbGFzcyBnY2M6OmppdDo6cmVjb3JkaW5nOjpwYXJhbS4g ICovCiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIHB1cmUgdmlydHVhbCBob29rIHJlY29yZGluZzo6 bWVtZW50bzo6cmVwbGF5X2ludG8KQEAgLTQ1MzksNiArNDU0NSwxNiBAQCByZWNvcmRpbmc6OmJs b2NrOjpkdW1wX2VkZ2VzX3RvX2RvdCAocHJldHR5X3ByaW50ZXIgKnBwKQogIyAgcHJhZ21hIEdD QyBkaWFnbm9zdGljIHBvcAogI2VuZGlmCiAKK25hbWVzcGFjZSByZWNvcmRpbmcgeworc3RhdGlj IGNvbnN0IGVudW0gdGxzX21vZGVsIHRsc19tb2RlbHNbXSA9IHsKKyAgVExTX01PREVMX05PTkUs IC8qIEdDQ19KSVRfVExTX01PREVMX05PTkUgKi8KKyAgVExTX01PREVMX0dMT0JBTF9EWU5BTUlD LCAvKiBHQ0NfSklUX1RMU19NT0RFTF9HTE9CQUxfRFlOQU1JQyAqLworICBUTFNfTU9ERUxfTE9D QUxfRFlOQU1JQywgLyogR0NDX0pJVF9UTFNfTU9ERUxfTE9DQUxfRFlOQU1JQyAqLworICBUTFNf TU9ERUxfSU5JVElBTF9FWEVDLCAvKiBHQ0NfSklUX1RMU19NT0RFTF9JTklUSUFMX0VYRUMgKi8K KyAgVExTX01PREVMX0xPQ0FMX0VYRUMsIC8qIEdDQ19KSVRfVExTX01PREVMX0xPQ0FMX0VYRUMg Ki8KK307Cit9IC8qIG5hbWVzcGFjZSByZWNvcmRpbmcgKi8KKwogLyogVGhlIGltcGxlbWVudGF0 aW9uIG9mIGNsYXNzIGdjYzo6aml0OjpyZWNvcmRpbmc6Omdsb2JhbC4gICovCiAKIC8qIEltcGxl bWVudGF0aW9uIG9mIHB1cmUgdmlydHVhbCBob29rIHJlY29yZGluZzo6bWVtZW50bzo6cmVwbGF5 X2ludG8KQEAgLTQ1NDcsOCArNDU2Myw3IEBAIHJlY29yZGluZzo6YmxvY2s6OmR1bXBfZWRnZXNf dG9fZG90IChwcmV0dHlfcHJpbnRlciAqcHApCiB2b2lkCiByZWNvcmRpbmc6Omdsb2JhbDo6cmVw bGF5X2ludG8gKHJlcGxheWVyICpyKQogewotICBzZXRfcGxheWJhY2tfb2JqICgKLSAgICBtX2lu aXRpYWxpemVyCisgICAgcGxheWJhY2s6Omx2YWx1ZSAqZ2xvYmFsID0gbV9pbml0aWFsaXplcgog ICAgID8gci0+bmV3X2dsb2JhbF9pbml0aWFsaXplZCAocGxheWJhY2tfbG9jYXRpb24gKHIsIG1f bG9jKSwKIAkJCQkgbV9raW5kLAogCQkJCSBtX3R5cGUtPnBsYXliYWNrX3R5cGUgKCksCkBAIC00 NTYwLDcgKzQ1NzUsMTIgQEAgcmVjb3JkaW5nOjpnbG9iYWw6OnJlcGxheV9pbnRvIChyZXBsYXll ciAqcikKICAgICA6IHItPm5ld19nbG9iYWwgKHBsYXliYWNrX2xvY2F0aW9uIChyLCBtX2xvYyks CiAJCSAgICAgbV9raW5kLAogCQkgICAgIG1fdHlwZS0+cGxheWJhY2tfdHlwZSAoKSwKLQkJICAg ICBwbGF5YmFja19zdHJpbmcgKG1fbmFtZSkpKTsKKwkJICAgICBwbGF5YmFja19zdHJpbmcgKG1f bmFtZSkpOworICBpZiAobV90bHNfbW9kZWwgIT0gR0NDX0pJVF9UTFNfTU9ERUxfTk9ORSkKKyAg eworICAgICAgZ2xvYmFsLT5zZXRfdGxzX21vZGVsIChyZWNvcmRpbmc6OnRsc19tb2RlbHNbbV90 bHNfbW9kZWxdKTsKKyAgfQorICBzZXRfcGxheWJhY2tfb2JqIChnbG9iYWwpOwogfQogCiAvKiBP dmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgpAQCAtNDY1OCw2ICs0Njc4LDE0 IEBAIHJlY29yZGluZzo6Z2xvYmFsOjp3cml0ZV9pbml0aWFsaXplcl9yZXByb2R1Y2VyIChjb25z dCBjaGFyICppZCwgcmVwcm9kdWNlciAmcikKIAogLyogSW1wbGVtZW50YXRpb24gb2YgcmVjb3Jk aW5nOjptZW1lbnRvOjp3cml0ZV9yZXByb2R1Y2VyIGZvciBnbG9iYWxzLiAqLwogCitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IHRsc19tb2RlbF9lbnVtX3N0cmluZ3NbXSA9IHsKKyAgIkdDQ19K SVRfVExTX01PREVMX05PTkUiLAorICAiR0NDX0pJVF9UTFNfTU9ERUxfR0xPQkFMX0RZTkFNSUMi LAorICAiR0NDX0pJVF9UTFNfTU9ERUxfTE9DQUxfRFlOQU1JQyIsCisgICJHQ0NfSklUX1RMU19N T0RFTF9JTklUSUFMX0VYRUMiLAorICAiR0NDX0pJVF9UTFNfTU9ERUxfTE9DQUxfRVhFQyIsCit9 OworCiB2b2lkCiByZWNvcmRpbmc6Omdsb2JhbDo6d3JpdGVfcmVwcm9kdWNlciAocmVwcm9kdWNl ciAmcikKIHsKQEAgLTQ2NzUsNiArNDcwMywxNCBAQCByZWNvcmRpbmc6Omdsb2JhbDo6d3JpdGVf cmVwcm9kdWNlciAocmVwcm9kdWNlciAmcikKICAgICByLmdldF9pZGVudGlmaWVyX2FzX3R5cGUg KGdldF90eXBlICgpKSwKICAgICBtX25hbWUtPmdldF9kZWJ1Z19zdHJpbmcgKCkpOwogCisgIGlm IChtX3Rsc19tb2RlbCAhPSBHQ0NfSklUX1RMU19NT0RFTF9OT05FKQorICB7CisJci53cml0ZSAo IiAgZ2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2RlbCAoJXMsIC8qIGdjY19qaXRfbHZhbHVlICps dmFsdWUgKi9cbiIKKwkgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzKTsg LyogZW51bSBnY2Nfaml0X3Rsc19tb2RlbCBtb2RlbCAqL1xuIiwKKyAgICBpZCwKKyAgICB0bHNf bW9kZWxfZW51bV9zdHJpbmdzW21fdGxzX21vZGVsXSk7CisgIH0KKwogICBpZiAobV9pbml0aWFs aXplcikKICAgICBzd2l0Y2ggKG1fdHlwZS0+ZGVyZWZlcmVuY2UgKCktPmdldF9zaXplICgpKQog ICAgICAgewpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmggYi9nY2Mvaml0L2pp dC1yZWNvcmRpbmcuaAppbmRleCA0YTk5NGZlNzA5NC4uZjY0ZTliZWU5YTYgMTAwNjQ0Ci0tLSBh L2djYy9qaXQvaml0LXJlY29yZGluZy5oCisrKyBiL2djYy9qaXQvaml0LXJlY29yZGluZy5oCkBA IC0xMTEyLDcgKzExMTIsOCBAQCBwdWJsaWM6CiAgIGx2YWx1ZSAoY29udGV4dCAqY3R4dCwKIAkg IGxvY2F0aW9uICpsb2MsCiAJICB0eXBlICp0eXBlXykKLSAgICA6IHJ2YWx1ZSAoY3R4dCwgbG9j LCB0eXBlXykKKyAgICA6IHJ2YWx1ZSAoY3R4dCwgbG9jLCB0eXBlXyksCisgICAgbV90bHNfbW9k ZWwgKEdDQ19KSVRfVExTX01PREVMX05PTkUpCiAgICAge30KIAogICBwbGF5YmFjazo6bHZhbHVl ICoKQEAgLTExMzQsNiArMTEzNSwxMCBAQCBwdWJsaWM6CiAgIGNvbnN0IGNoYXIgKmFjY2Vzc19h c19ydmFsdWUgKHJlcHJvZHVjZXIgJnIpIE9WRVJSSURFOwogICB2aXJ0dWFsIGNvbnN0IGNoYXIg KmFjY2Vzc19hc19sdmFsdWUgKHJlcHJvZHVjZXIgJnIpOwogICB2aXJ0dWFsIGJvb2wgaXNfZ2xv YmFsICgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZvaWQgc2V0X3Rsc19tb2RlbCAoZW51 bSBnY2Nfaml0X3Rsc19tb2RlbCBtb2RlbCk7CisKK3Byb3RlY3RlZDoKKyAgZW51bSBnY2Nfaml0 X3Rsc19tb2RlbCBtX3Rsc19tb2RlbDsKIH07CiAKIGNsYXNzIHBhcmFtIDogcHVibGljIGx2YWx1 ZQpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9saWJnY2NqaXQuYyBiL2djYy9qaXQvbGliZ2Njaml0LmMK aW5kZXggYzc0NGI2MzRmNGIuLmUxNmVlZDRhNmMwIDEwMDY0NAotLS0gYS9nY2Mvaml0L2xpYmdj Y2ppdC5jCisrKyBiL2djYy9qaXQvbGliZ2Njaml0LmMKQEAgLTIyMTcsNiArMjIxNywyNCBAQCBn Y2Nfaml0X2x2YWx1ZV9nZXRfYWRkcmVzcyAoZ2NjX2ppdF9sdmFsdWUgKmx2YWx1ZSwKICAgcmV0 dXJuIChnY2Nfaml0X3J2YWx1ZSAqKWx2YWx1ZS0+Z2V0X2FkZHJlc3MgKGxvYyk7CiB9CiAKKy8q IFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisg ICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAg Z2NjOjpqaXQ6OnJlY29yZGluZzo6bHZhbHVlOjpzZXRfdGxzX21vZGVsIG1ldGhvZCBpbiBqaXQt cmVjb3JkaW5nLmMuICAqLworCit2b2lkCitnY2Nfaml0X2x2YWx1ZV9zZXRfdGxzX21vZGVsIChn Y2Nfaml0X2x2YWx1ZSAqbHZhbHVlLAorCQkJICAgIGVudW0gZ2NjX2ppdF90bHNfbW9kZWwgbW9k ZWwpCit7CisgIFJFVFVSTl9JRl9GQUlMIChsdmFsdWUsIE5VTEwsIE5VTEwsICJOVUxMIGx2YWx1 ZSIpOworICBKSVRfTE9HX0ZVTkMgKGx2YWx1ZS0+Z2V0X2NvbnRleHQgKCktPmdldF9sb2dnZXIg KCkpOworICBSRVRVUk5fSUZfRkFJTF9QUklOVEYxIChsdmFsdWUtPmlzX2dsb2JhbCAoKSwgbHZh bHVlLT5nZXRfY29udGV4dCAoKSwgTlVMTCwKKwkJCSAgICAgICAibHZhbHVlIFwiJXNcIiBub3Qg YSBnbG9iYWwiLAorCQkJICAgICAgIGx2YWx1ZS0+Z2V0X2RlYnVnX3N0cmluZyAoKSk7CisKKyAg bHZhbHVlLT5zZXRfdGxzX21vZGVsIChtb2RlbCk7Cit9CisKIC8qIFB1YmxpYyBlbnRyeXBvaW50 LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgogCiAgICBBZnRlciBlcnJvci1jaGVj a2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9s aWJnY2NqaXQuaCBiL2djYy9qaXQvbGliZ2Njaml0LmgKaW5kZXggYTFjOTQzNmM1NDUuLjVhYTJl NDBjN2E0IDEwMDY0NAotLS0gYS9nY2Mvaml0L2xpYmdjY2ppdC5oCisrKyBiL2djYy9qaXQvbGli Z2Njaml0LmgKQEAgLTczOSw2ICs3MzksMTYgQEAgZW51bSBnY2Nfaml0X2Z1bmN0aW9uX2tpbmQK ICAgR0NDX0pJVF9GVU5DVElPTl9BTFdBWVNfSU5MSU5FCiB9OwogCisvKiBUaHJlYWQgbG9jYWwg c3RvcmFnZSBtb2RlbC4gICovCitlbnVtIGdjY19qaXRfdGxzX21vZGVsCit7CisgIEdDQ19KSVRf VExTX01PREVMX05PTkUsCisgIEdDQ19KSVRfVExTX01PREVMX0dMT0JBTF9EWU5BTUlDLAorICBH Q0NfSklUX1RMU19NT0RFTF9MT0NBTF9EWU5BTUlDLAorICBHQ0NfSklUX1RMU19NT0RFTF9JTklU SUFMX0VYRUMsCisgIEdDQ19KSVRfVExTX01PREVMX0xPQ0FMX0VYRUMsCit9OworCiAvKiBDcmVh dGUgYSBmdW5jdGlvbi4gICovCiBleHRlcm4gZ2NjX2ppdF9mdW5jdGlvbiAqCiBnY2Nfaml0X2Nv bnRleHRfbmV3X2Z1bmN0aW9uIChnY2Nfaml0X2NvbnRleHQgKmN0eHQsCkBAIC0xMDg5LDYgKzEw OTksMTcgQEAgZXh0ZXJuIGdjY19qaXRfcnZhbHVlICoKIGdjY19qaXRfbHZhbHVlX2dldF9hZGRy ZXNzIChnY2Nfaml0X2x2YWx1ZSAqbHZhbHVlLAogCQkJICAgIGdjY19qaXRfbG9jYXRpb24gKmxv Yyk7CiAKKyNkZWZpbmUgTElCR0NDSklUX0hBVkVfZ2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2Rl bAorCisvKiBTZXQgdGhlIHRocmVhZC1sb2NhbCBzdG9yYWdlIG1vZGVsIG9mIGEgZ2xvYmFsIHZh cmlhYmxlCisKKyAgIFRoaXMgQVBJIGVudHJ5cG9pbnQgd2FzIGFkZGVkIGluIExJQkdDQ0pJVF9B QklfMTc7IHlvdSBjYW4gdGVzdCBmb3IgaXRzCisgICBwcmVzZW5jZSB1c2luZworICAgICAjaWZk ZWYgTElCR0NDSklUX0hBVkVfZ2NjX2ppdF9sdmFsdWVfc2V0X3Rsc19tb2RlbCAgKi8KK2V4dGVy biB2b2lkCitnY2Nfaml0X2x2YWx1ZV9zZXRfdGxzX21vZGVsIChnY2Nfaml0X2x2YWx1ZSAqbHZh bHVlLAorCQkJICAgIGVudW0gZ2NjX2ppdF90bHNfbW9kZWwgbW9kZWwpOworCiBleHRlcm4gZ2Nj X2ppdF9sdmFsdWUgKgogZ2NjX2ppdF9mdW5jdGlvbl9uZXdfbG9jYWwgKGdjY19qaXRfZnVuY3Rp b24gKmZ1bmMsCiAJCQkgICAgZ2NjX2ppdF9sb2NhdGlvbiAqbG9jLApkaWZmIC0tZ2l0IGEvZ2Nj L2ppdC9saWJnY2NqaXQubWFwIGIvZ2NjL2ppdC9saWJnY2NqaXQubWFwCmluZGV4IDY0ZTc5MDk0 OWU4Li45OGQ2OTNmZDAwYyAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9saWJnY2NqaXQubWFwCisrKyBi L2djYy9qaXQvbGliZ2Njaml0Lm1hcApAQCAtMjI2LDMgKzIyNiw4IEBAIExJQkdDQ0pJVF9BQklf MTYgewogICAgIGdjY19qaXRfdHlwZV9pc19zdHJ1Y3Q7CiAgICAgZ2NjX2ppdF9zdHJ1Y3RfZ2V0 X2ZpZWxkX2NvdW50OwogfSBMSUJHQ0NKSVRfQUJJXzE1OworCitMSUJHQ0NKSVRfQUJJXzE3IHsK KyAgZ2xvYmFsOgorICAgIGdjY19qaXRfbHZhbHVlX3NldF90bHNfbW9kZWw7Cit9IExJQkdDQ0pJ VF9BQklfMTY7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxp bmctdGVzdHMuaCBiL2djYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGluZy10ZXN0cy5o CmluZGV4IGE3ZmRkZjk2ZGI4Li5mNjRlYTkxYjE0ZSAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0 ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5nLXRlc3RzLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQu ZGcvYWxsLW5vbi1mYWlsaW5nLXRlc3RzLmgKQEAgLTE4OCw2ICsxODgsMTMgQEAKICN1bmRlZiBj cmVhdGVfY29kZQogI3VuZGVmIHZlcmlmeV9jb2RlCiAKKy8qIHRlc3QtdGxzLmMgKi8KKyNkZWZp bmUgY3JlYXRlX2NvZGUgY3JlYXRlX2NvZGVfdGxzCisjZGVmaW5lIHZlcmlmeV9jb2RlIHZlcmlm eV9jb2RlX3RscworI2luY2x1ZGUgInRlc3QtdGxzLmMiCisjdW5kZWYgY3JlYXRlX2NvZGUKKyN1 bmRlZiB2ZXJpZnlfY29kZQorCiAvKiB0ZXN0LWhlbGxvLXdvcmxkLmMgKi8KICNkZWZpbmUgY3Jl YXRlX2NvZGUgY3JlYXRlX2NvZGVfaGVsbG9fd29ybGQKICNkZWZpbmUgdmVyaWZ5X2NvZGUgdmVy aWZ5X2NvZGVfaGVsbG9fd29ybGQKQEAgLTQ1Myw2ICs0NjAsOSBAQCBjb25zdCBzdHJ1Y3QgdGVz dGNhc2UgdGVzdGNhc2VzW10gPSB7CiAgIHsic3dpdGNoIiwKICAgIGNyZWF0ZV9jb2RlX3N3aXRj aCwKICAgIHZlcmlmeV9jb2RlX3N3aXRjaH0sCisgIHsidGxzIiwKKyAgIGNyZWF0ZV9jb2RlX3Rs cywKKyAgIHZlcmlmeV9jb2RlX3Rsc30sCiAgIHsidHlwZXMiLAogICAgY3JlYXRlX2NvZGVfdHlw ZXMsCiAgICB2ZXJpZnlfY29kZV90eXBlc30sCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2pp dC5kZy90ZXN0LXRscy5jIGIvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC10bHMuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uM2IyMDE4MmFjMTAKLS0tIC9kZXYvbnVs bAorKysgYi9nY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXRscy5jCkBAIC0wLDAgKzEsNjQgQEAK KyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmlu Zy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImxpYmdjY2ppdC5oIgorCisjaW5j bHVkZSAiaGFybmVzcy5oIgorCit2b2lkCitjcmVhdGVfY29kZSAoZ2NjX2ppdF9jb250ZXh0ICpj dHh0LCB2b2lkICp1c2VyX2RhdGEpCit7CisgIC8qIExldCdzIHRyeSB0byBpbmplY3QgdGhlIGVx dWl2YWxlbnQgb2Y6CisKKyAgICAgX1RocmVhZF9sb2NhbCBpbnQgZm9vOworCisgICAgIGludCB0 ZXN0X3VzaW5nX3RscygpCisgICAgIHsKKyAgICAgIGZvbyA9IDQyOworICAgICAgcmV0dXJuIGZv bzsKKyAgICAgfQorICAqLworICBnY2Nfaml0X3R5cGUgKmludF90eXBlID0KKyAgICBnY2Nfaml0 X2NvbnRleHRfZ2V0X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQRV9JTlQpOworCisgIGdjY19qaXRf bHZhbHVlICpmb28gPQorICAgIGdjY19qaXRfY29udGV4dF9uZXdfZ2xvYmFsICgKKyAgICAgIGN0 eHQsIE5VTEwsIEdDQ19KSVRfR0xPQkFMX0VYUE9SVEVELCBpbnRfdHlwZSwgImZvbyIpOworICBn Y2Nfaml0X2x2YWx1ZV9zZXRfdGxzX21vZGVsIChmb28sIEdDQ19KSVRfVExTX01PREVMX0dMT0JB TF9EWU5BTUlDKTsKKworICAvKiBCdWlsZCB0aGUgdGVzdF9mbi4gICovCisgIGdjY19qaXRfZnVu Y3Rpb24gKnRlc3RfZm4gPQorICAgIGdjY19qaXRfY29udGV4dF9uZXdfZnVuY3Rpb24gKGN0eHQs IE5VTEwsCisJCQkJICBHQ0NfSklUX0ZVTkNUSU9OX0VYUE9SVEVELAorCQkJCSAgaW50X3R5cGUs CisJCQkJICAidGVzdF91c2luZ190bHMiLAorCQkJCSAgMCwgTlVMTCwKKwkJCQkgIDApOworICBn Y2Nfaml0X2Jsb2NrICpibG9jayA9IGdjY19qaXRfZnVuY3Rpb25fbmV3X2Jsb2NrICh0ZXN0X2Zu LCBOVUxMKTsKKyAgZ2NjX2ppdF9ibG9ja19hZGRfYXNzaWdubWVudCAoCisgICAgYmxvY2ssIE5V TEwsCisgICAgZm9vLAorICAgIGdjY19qaXRfY29udGV4dF9uZXdfcnZhbHVlX2Zyb21faW50IChj dHh0LCBpbnRfdHlwZSwgNDIpKTsKKyAgZ2NjX2ppdF9ibG9ja19lbmRfd2l0aF9yZXR1cm4gKGJs b2NrLAorCQkJCSBOVUxMLAorCQkJCSBnY2Nfaml0X2x2YWx1ZV9hc19ydmFsdWUgKGZvbykpOwor fQorCit2b2lkCit2ZXJpZnlfY29kZSAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0LCBnY2Nfaml0X3Jl c3VsdCAqcmVzdWx0KQoreworICB0eXBlZGVmIGludCAoKmZuX3R5cGUpICh2b2lkKTsKKyAgQ0hF Q0tfTk9OX05VTEwgKHJlc3VsdCk7CisKKyAgZm5fdHlwZSB0ZXN0X3VzaW5nX3RscyA9CisgICAg KGZuX3R5cGUpZ2NjX2ppdF9yZXN1bHRfZ2V0X2NvZGUgKHJlc3VsdCwgInRlc3RfdXNpbmdfdGxz Iik7CisgIENIRUNLX05PTl9OVUxMICh0ZXN0X3VzaW5nX3Rscyk7CisgIGludCByZXR1cm5fdmFs dWUgPSB0ZXN0X3VzaW5nX3RscygpOworICBDSEVDS19WQUxVRSAocmV0dXJuX3ZhbHVlLCA0Mik7 CisKKyAgaW50ICpmb28gPSAoaW50ICopZ2NjX2ppdF9yZXN1bHRfZ2V0X2dsb2JhbCAocmVzdWx0 LCAiZm9vIik7CisgIENIRUNLX05PTl9OVUxMIChmb28pOworICBDSEVDS19WQUxVRSAoKmZvbywg NDIpOworfQotLSAKMi4yNi4yLjcuZzE5ZGI5Y2ZiNjguZGlydHkKCg== --=-tQgUHGO3g/SXnJHviU5s--