From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20417 invoked by alias); 28 Dec 2012 12:30:50 -0000 Received: (qmail 20392 invoked by uid 22791); 28 Dec 2012 12:30:47 -0000 X-SWARE-Spam-Status: No, hits=-2.7 required=5.0 tests=AWL,BAYES_50,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KAM_STOCKGEN,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-pb0-f42.google.com (HELO mail-pb0-f42.google.com) (209.85.160.42) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 28 Dec 2012 12:30:34 +0000 Received: by mail-pb0-f42.google.com with SMTP id rp2so5908779pbb.15 for ; Fri, 28 Dec 2012 04:30:34 -0800 (PST) MIME-Version: 1.0 Received: by 10.66.85.70 with SMTP id f6mr89789956paz.76.1356697832993; Fri, 28 Dec 2012 04:30:32 -0800 (PST) Received: by 10.68.229.137 with HTTP; Fri, 28 Dec 2012 04:30:32 -0800 (PST) In-Reply-To: <28659BFC-706C-4478-BAFA-142383271369@codesourcery.com> References: <28659BFC-706C-4478-BAFA-142383271369@codesourcery.com> Date: Fri, 28 Dec 2012 12:30:00 -0000 Message-ID: Subject: Re: [RFC PATCH] Implementing ifunc target hook From: Alexander Ivchenko To: Maxim Kuvyrkov Cc: gcc-patches@gcc.gnu.org, "Joseph S. Myers" , "H.J. Lu" , pavel.v.chupin@gmail.com, Sergey Ostanevich Content-Type: multipart/mixed; boundary=f46d042fd93a67325004d1e8d465 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-12/txt/msg01446.txt.bz2 --f46d042fd93a67325004d1e8d465 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 12110 Joseph, Maxim, thank you for your input. I converted this macro into a target hook as you said. I had to add gcc/config/linux-protos.h in order to declare linux (that works for android) version of this hook - otherwise I don't know where to declare it.. >> --- a/gcc/config/i386/i386.c >> +++ b/gcc/config/i386/i386.c >> @@ -29146,7 +29146,7 @@ make_name (tree decl, const char *suffix, bool m= ake_unique) >> return global_var_name; >> } >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> >> /* Make a dispatcher declaration for the multi-versioned function DECL. >> Calls to DECL function will be replaced with calls to the dispatcher >> @@ -29213,7 +29213,7 @@ ix86_get_function_versions_dispatcher (void *dec= l) >> >> tree dispatch_decl =3D NULL; >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> struct cgraph_function_version_info *it_v =3D NULL; >> struct cgraph_node *dispatcher_node =3D NULL; >> struct cgraph_function_version_info *dispatcher_version_info =3D NULL; > >It seems you can move these variables inside the 'if (TARGET_HAS_IFUNC)' c= lause below and make >the code cleaner, no? All variable declarations should be at the beginning of the routine. Or is it changed right now? >> @@ -29263,24 +29263,33 @@ ix86_get_function_versions_dispatcher (void *d= ecl) >> >> default_node =3D default_version_info->this_node; >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> - /* Right now, the dispatching is done via ifunc. */ >> - dispatch_decl =3D make_dispatcher_decl (default_node->symbol.decl); >> - >> - dispatcher_node =3D cgraph_get_create_node (dispatch_decl); >> - gcc_assert (dispatcher_node !=3D NULL); >> - dispatcher_node->dispatcher_function =3D 1; >> - dispatcher_version_info >> - =3D insert_new_cgraph_node_version (dispatcher_node); >> - dispatcher_version_info->next =3D default_version_info; >> - dispatcher_node->local.finalized =3D 1; >> - >> - /* Set the dispatcher for all the versions. */ >> - it_v =3D default_version_info; >> - while (it_v->next !=3D NULL) >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> + if (TARGET_HAS_IFUNC) >> + { >> + /* Right now, the dispatching is done via ifunc. */ >> + dispatch_decl =3D make_dispatcher_decl (default_node->symbol.decl= ); >> + >> + dispatcher_node =3D cgraph_get_create_node (dispatch_decl); >> + gcc_assert (dispatcher_node !=3D NULL); >> + dispatcher_node->dispatcher_function =3D 1; >> + dispatcher_version_info >> + =3D insert_new_cgraph_node_version (dispatcher_node); >> + dispatcher_version_info->next =3D default_version_info; >> + dispatcher_node->local.finalized =3D 1; >> + >> + /* Set the dispatcher for all the versions. */ >> + it_v =3D default_version_info; >> + while (it_v->next !=3D NULL) >> + { >> + it_v->dispatcher_resolver =3D dispatch_decl; >> + it_v =3D it_v->next; >> + } >> + } >> + else >> { >> - it_v->dispatcher_resolver =3D dispatch_decl; >> - it_v =3D it_v->next; >> + error_at (DECL_SOURCE_LOCATION (default_node->symbol.decl), >> + "multiversioning needs ifunc which is not supported " >> + "on this target"); >> } > >This looks wrong. Before the patch this code would be ignored if !HAVE_GN= U_INDIRECT_FUNCTION and after the patch it will produce an error. Removing= the else-clause should fix this. Mmm, I believe that we want this code not to be ignored, because we want it to produces an error if the target does not support ifuncs and we are compiling something that uses ifuncs.. May be I missed something.. >Please use same error message in both error cases. It seems you can just = convert '#else' >preprocessor clause into 'else' code clause without touchi= ng the error_at() statement beyond >indentation updates. Done. thank you, Alexander 2012/12/28 Maxim Kuvyrkov : > On 27/12/2012, at 1:15 AM, Alexander Ivchenko wrote: > >> Hi, >> >> Currently Android dynamic loader does not support indirect functions >> (And I don't think that >> it will someday). But there is no way for us to specify that for gcc, >> and for example, tests like >> gcc.dg/attr-ifunc-* are failing on android right now. >> The attached patch is indended to add the target hook for indicating >> the support of ifunc on target. > > The idea behind the patch looks OK, but implementation needs a bit of twe= aking. > > As Joseph mentioned, you need to convert this macro into a target hook. = GCC is making a gradual transition away from target macros to target hook f= unctions, and all new hooks should be added as functions, unless there is a= compelling argument to make it a macro. For an example of adding a target= hook function see rev 194608 (among many others). > >> --- a/gcc/config/i386/i386.c >> +++ b/gcc/config/i386/i386.c >> @@ -29146,7 +29146,7 @@ make_name (tree decl, const char *suffix, bool m= ake_unique) >> return global_var_name; >> } >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> >> /* Make a dispatcher declaration for the multi-versioned function DECL. >> Calls to DECL function will be replaced with calls to the dispatcher >> @@ -29213,7 +29213,7 @@ ix86_get_function_versions_dispatcher (void *dec= l) >> >> tree dispatch_decl =3D NULL; >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> struct cgraph_function_version_info *it_v =3D NULL; >> struct cgraph_node *dispatcher_node =3D NULL; >> struct cgraph_function_version_info *dispatcher_version_info =3D NULL; > > It seems you can move these variables inside the 'if (TARGET_HAS_IFUNC)' = clause below and make the code cleaner, no? > >> @@ -29263,24 +29263,33 @@ ix86_get_function_versions_dispatcher (void *d= ecl) >> >> default_node =3D default_version_info->this_node; >> >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> - /* Right now, the dispatching is done via ifunc. */ >> - dispatch_decl =3D make_dispatcher_decl (default_node->symbol.decl); >> - >> - dispatcher_node =3D cgraph_get_create_node (dispatch_decl); >> - gcc_assert (dispatcher_node !=3D NULL); >> - dispatcher_node->dispatcher_function =3D 1; >> - dispatcher_version_info >> - =3D insert_new_cgraph_node_version (dispatcher_node); >> - dispatcher_version_info->next =3D default_version_info; >> - dispatcher_node->local.finalized =3D 1; >> - >> - /* Set the dispatcher for all the versions. */ >> - it_v =3D default_version_info; >> - while (it_v->next !=3D NULL) >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> + if (TARGET_HAS_IFUNC) >> + { >> + /* Right now, the dispatching is done via ifunc. */ >> + dispatch_decl =3D make_dispatcher_decl (default_node->symbol.decl= ); >> + >> + dispatcher_node =3D cgraph_get_create_node (dispatch_decl); >> + gcc_assert (dispatcher_node !=3D NULL); >> + dispatcher_node->dispatcher_function =3D 1; >> + dispatcher_version_info >> + =3D insert_new_cgraph_node_version (dispatcher_node); >> + dispatcher_version_info->next =3D default_version_info; >> + dispatcher_node->local.finalized =3D 1; >> + >> + /* Set the dispatcher for all the versions. */ >> + it_v =3D default_version_info; >> + while (it_v->next !=3D NULL) >> + { >> + it_v->dispatcher_resolver =3D dispatch_decl; >> + it_v =3D it_v->next; >> + } >> + } >> + else >> { >> - it_v->dispatcher_resolver =3D dispatch_decl; >> - it_v =3D it_v->next; >> + error_at (DECL_SOURCE_LOCATION (default_node->symbol.decl), >> + "multiversioning needs ifunc which is not supported " >> + "on this target"); >> } > > This looks wrong. Before the patch this code would be ignored if !HAVE_G= NU_INDIRECT_FUNCTION and after the patch it will produce an error. Removin= g the else-clause should fix this. > >> #else >> error_at (DECL_SOURCE_LOCATION (default_node->symbol.decl), >> diff --git a/gcc/config/linux-android.h b/gcc/config/linux-android.h >> index e74e261..f6f44f1 100644 >> --- a/gcc/config/linux-android.h >> +++ b/gcc/config/linux-android.h >> @@ -58,3 +58,6 @@ >> >> #define ANDROID_ENDFILE_SPEC \ >> "%{shared: crtend_so%O%s;: crtend_android%O%s}" >> + >> +#undef TARGET_HAS_IFUNC >> +#define TARGET_HAS_IFUNC (!TARGET_ANDROID) > > This initialization should be moved to targethooks.c ... > >> diff --git a/gcc/defaults.h b/gcc/defaults.h >> index 76909ab..2180a47 100644 >> --- a/gcc/defaults.h >> +++ b/gcc/defaults.h >> @@ -111,6 +111,10 @@ see the files COPYING3 and COPYING.RUNTIME respecti= vely. If not, see >> #endif >> #endif >> >> +#ifndef TARGET_HAS_IFUNC >> +#define TARGET_HAS_IFUNC HAVE_GNU_INDIRECT_FUNCTION >> +#endif > > ... and this one too. > >> + >> #ifndef IFUNC_ASM_TYPE >> #define IFUNC_ASM_TYPE "gnu_indirect_function" >> #endif >> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi >> index 75aa867..1c8bc51 100644 >> --- a/gcc/doc/tm.texi >> +++ b/gcc/doc/tm.texi >> @@ -5847,6 +5847,12 @@ If @code{ASM_OUTPUT_DEF} is not available, the ho= ok's default definition >> is @code{NULL}, which disables the use of section anchors altogether. >> @end deftypefn >> >> +@defmac TARGET_HAS_IFUNC >> +When this macro is nonzero, GCC will assume that target supports GNU in= direct >> +functions. The support includes the assembler, linker and dynamic link= er. The >> +default value of this hook is defined as for the host machine. >> +@end defmac >> + >> @deftypefn {Target Hook} bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rt= x @var{x}) >> Return true if GCC should attempt to use anchors to access @code{SYMBOL= _REF} >> @var{x}. You can assume @samp{SYMBOL_REF_HAS_BLOCK_INFO_P (@var{x})} a= nd >> diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in >> index 95fab18..e1646b8 100644 >> --- a/gcc/doc/tm.texi.in >> +++ b/gcc/doc/tm.texi.in >> @@ -5751,6 +5751,12 @@ If @code{ASM_OUTPUT_DEF} is not available, the ho= ok's default definition >> is @code{NULL}, which disables the use of section anchors altogether. >> @end deftypefn >> >> +@defmac TARGET_HAS_IFUNC >> +When this macro is nonzero, GCC will assume that target supports GNU in= direct >> +functions. The support includes the assembler, linker and dynamic link= er. The >> +default value of this hook is defined as for the host machine. >> +@end defmac >> + >> @hook TARGET_USE_ANCHORS_FOR_SYMBOL_P >> Return true if GCC should attempt to use anchors to access @code{SYMBOL= _REF} >> @var{x}. You can assume @samp{SYMBOL_REF_HAS_BLOCK_INFO_P (@var{x})} a= nd >> diff --git a/gcc/varasm.c b/gcc/varasm.c >> index 7d083fd..14be8fb 100644 >> --- a/gcc/varasm.c >> +++ b/gcc/varasm.c >> @@ -5489,10 +5489,14 @@ do_assemble_alias (tree decl, tree target) >> } >> if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))) >> { >> -#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION >> - ASM_OUTPUT_TYPE_DIRECTIVE >> - (asm_out_file, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), >> - IFUNC_ASM_TYPE); >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> + if (TARGET_HAS_IFUNC) >> + ASM_OUTPUT_TYPE_DIRECTIVE >> + (asm_out_file, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), >> + IFUNC_ASM_TYPE); >> + else >> + error_at (DECL_SOURCE_LOCATION (decl), >> + "ifunc is not supported on this target"); >> #else >> error_at (DECL_SOURCE_LOCATION (decl), >> "ifunc is not supported in this configuration"); > > Please use same error message in both error cases. It seems you can just= convert '#else' preprocessor clause into 'else' code clause without touchi= ng the error_at() statement beyond indentation updates. > > Thanks, > > -- > Maxim Kuvyrkov > CodeSourcery / Mentor Graphics > --f46d042fd93a67325004d1e8d465 Content-Type: application/octet-stream; name="disable_ifunc_for_android_03.patch" Content-Disposition: attachment; filename="disable_ifunc_for_android_03.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hb9at8p90 Content-length: 13323 ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBmYzhm NjBiLi4yM2MwNDg0IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hh bmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTItMTItMjggIEFsZXhhbmRl ciBJdmNoZW5rbyAgPGFsZXhhbmRlci5pdmNoZW5rb0BpbnRlbC5jb20+CisK KwkqIGdjYy90YXJnZXQuZGVmIChUQVJHRVRfSEFTX0lGVU5DKTogTmV3IHRh cmdldCBob29rLgorCSogZ2NjL2RvYy90bS50ZXhpLmluIChUQVJHRVRfSEFT X0lGVU5DKTogTmV3LgorCSogZ2NjL2RvYy90bS50ZXhpOiBSZWdlbmVyYXRl LgorCSogZ2NjL3Rhcmdob29rcy5oIChkZWZhdWx0X2hhdmVfaWZ1bmMpOiBO ZXcuCisJKiBnY2MvdGFyZ2hvb2tzLmMgKGRlZmF1bHRfaGF2ZV9pZnVuYyk6 IERpdHRvLgorCSogZ2NjL2NvbmZpZy9saW51eC1wcm90b3MuaDogTmV3IGZp bGUuCisJKiBnY2MvY29uZmlnLmdjYzogQWRkZWQgaW5jbHVkZSBvZiBsaW51 eC1wcm90b3MuaC4KKwkqIGdjYy9jb25maWcvbGludXguaCAoVEFSR0VUX0hB U19JRlVOQyk6IFVzaW5nIHZlcnNpb24gb2YgdGhpcworCWhvb2sgZm9yIGxp bnV4IHdoaWNoIGRpc2FibGVzIHN1cHBvcnQgb2YgaW5kaXJlY3QgZnVuY3Rp b25zIGluCisJYW5kcm9pZC4KKwkqIGdjYy9jb25maWcvaG9zdC1saW51eC5j IChsaW51eF9oYXNfaWZ1bmMpOiBOZXcuCisJKiBnY2MvY29uZmlnL2kzODYv aTM4Ni5jIChpeDg2X2dldF9mdW5jdGlvbl92ZXJzaW9uc19kaXNwYXRjaGVy KToKKwlVc2luZyBUQVJHRVRfSEFTX0lGVU5DIGhvb2sgaW5zdGVhZCBvZiBI QVZFX0dOVV9JTkRJUkVDVF9GVU5DVElPTi4KKwkqIGdjYy92YXJhc20uYyAo ZG9fYXNzZW1ibGVfYWxpYXMpOiBMaWtld2lzZS4KKwogMjAxMi0xMi0yMCAg TWF0dGhpYXMgS2xvc2UgIDxkb2tvQHVidW50dS5jb20+CiAKIAkqIE1ha2Vm aWxlLmRlZiAoaW5zdGFsbC10YXJnZXQtbGliZ2ZvcnRyYW4pOiBEZXBlbmQg b24KZGlmZiAtLWdpdCBhL2djYy9jb25maWcuZ2NjIGIvZ2NjL2NvbmZpZy5n Y2MKaW5kZXggZGI1NjgxOS4uZTUzNTIxOCAxMDA2NDQKLS0tIGEvZ2NjL2Nv bmZpZy5nY2MKKysrIGIvZ2NjL2NvbmZpZy5nY2MKQEAgLTYzNyw2ICs2Mzcs MTEgQEAgY2FzZSAke3RhcmdldH0gaW4KICAgICAgIG5hdGl2ZV9zeXN0ZW1f aGVhZGVyX2Rpcj0vaW5jbHVkZQogICAgICAgOzsKICAgZXNhYworICBjYXNl ICR0YXJnZXQgaW4KKyAgICAqbGludXgqKQorICAgICAgdG1fcF9maWxlPSIk e3RtX3BfZmlsZX0gbGludXgtcHJvdG9zLmgiCisgICAgICA7OworICBlc2Fj CiAgICMgZ2xpYmMgLyB1Y2xpYmMgLyBiaW9uaWMgc3dpdGNoLgogICAjIHVj bGliYyBhbmQgYmlvbmljIGFyZW4ndCB1c2FibGUgZm9yIEdOVS9IdXJkIGFu ZCBuZWl0aGVyIGZvciBHTlUvaypCU0QuCiAgIGNhc2UgJHRhcmdldCBpbgpk aWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9ob3N0LWxpbnV4LmMgYi9nY2MvY29u ZmlnL2hvc3QtbGludXguYwppbmRleCBiNTM1NzU4Li5jNzJkYjc5IDEwMDY0 NAotLS0gYS9nY2MvY29uZmlnL2hvc3QtbGludXguYworKysgYi9nY2MvY29u ZmlnL2hvc3QtbGludXguYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUg ImNvcmV0eXBlcy5oIgogI2luY2x1ZGUgImhvc3Rob29rcy5oIgogI2luY2x1 ZGUgImhvc3Rob29rcy1kZWYuaCIKLQorI2luY2x1ZGUgInRtLmgiCiAKIC8q IExpbnV4IGhhcyBhIGZlYXR1cmUgY2FsbGVkIGV4ZWMtc2hpZWxkLXJhbmRv bWl6ZSB0aGF0IHBlcnR1cmJzIHRoZQogICAgYWRkcmVzcyBvZiBub24tZml4 ZWQgbWFwcGVkIHNlZ21lbnRzIGJ5IGEgKHJlbGF0aXZlbHkpIHNtYWxsIGFt b3VudC4KQEAgLTIyMiw1ICsyMjIsMTMgQEAgbGludXhfZ3RfcGNoX3VzZV9h ZGRyZXNzICh2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgaW50IGZkLCBzaXpl X3Qgb2Zmc2V0KQogICByZXR1cm4gMTsKIH0KIAorLyogQW5kcm9pZCBkb2Vz IG5vdCBzdXBwb3J0IEdOVSBpbmRpcmVjdCBmdW5jdGlvbnMuICAqLworCiti b29sCitsaW51eF9oYXNfaWZ1bmMgKHZvaWQpCit7CisgIHJldHVybiBUQVJH RVRfQU5EUk9JRCA/IGZhbHNlIDogSEFWRV9HTlVfSU5ESVJFQ1RfRlVOQ1RJ T047Cit9CisKIAwKIGNvbnN0IHN0cnVjdCBob3N0X2hvb2tzIGhvc3RfaG9v a3MgPSBIT1NUX0hPT0tTX0lOSVRJQUxJWkVSOwpkaWZmIC0tZ2l0IGEvZ2Nj L2NvbmZpZy9pMzg2L2kzODYuYyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmMK aW5kZXggYjQ2NmE0Zi4uYzQyMmZkOSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZp Zy9pMzg2L2kzODYuYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jCkBA IC0yOTE0Niw3ICsyOTE0Niw3IEBAIG1ha2VfbmFtZSAodHJlZSBkZWNsLCBj b25zdCBjaGFyICpzdWZmaXgsIGJvb2wgbWFrZV91bmlxdWUpCiAgIHJldHVy biBnbG9iYWxfdmFyX25hbWU7CiB9CiAKLSNpZiBkZWZpbmVkIChBU01fT1VU UFVUX1RZUEVfRElSRUNUSVZFKSAmJiBIQVZFX0dOVV9JTkRJUkVDVF9GVU5D VElPTgorI2lmIGRlZmluZWQgKEFTTV9PVVRQVVRfVFlQRV9ESVJFQ1RJVkUp CiAKIC8qIE1ha2UgYSBkaXNwYXRjaGVyIGRlY2xhcmF0aW9uIGZvciB0aGUg bXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9uIERFQ0wuCiAgICBDYWxscyB0byBE RUNMIGZ1bmN0aW9uIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBjYWxscyB0byB0 aGUgZGlzcGF0Y2hlcgpAQCAtMjkyMTMsNyArMjkyMTMsNyBAQCBpeDg2X2dl dF9mdW5jdGlvbl92ZXJzaW9uc19kaXNwYXRjaGVyICh2b2lkICpkZWNsKQog CiAgIHRyZWUgZGlzcGF0Y2hfZGVjbCA9IE5VTEw7CiAKLSNpZiBkZWZpbmVk IChBU01fT1VUUFVUX1RZUEVfRElSRUNUSVZFKSAmJiBIQVZFX0dOVV9JTkRJ UkVDVF9GVU5DVElPTgorI2lmIGRlZmluZWQgKEFTTV9PVVRQVVRfVFlQRV9E SVJFQ1RJVkUpCiAgIHN0cnVjdCBjZ3JhcGhfZnVuY3Rpb25fdmVyc2lvbl9p bmZvICppdF92ID0gTlVMTDsKICAgc3RydWN0IGNncmFwaF9ub2RlICpkaXNw YXRjaGVyX25vZGUgPSBOVUxMOwogICBzdHJ1Y3QgY2dyYXBoX2Z1bmN0aW9u X3ZlcnNpb25faW5mbyAqZGlzcGF0Y2hlcl92ZXJzaW9uX2luZm8gPSBOVUxM OwpAQCAtMjkyNjMsMjQgKzI5MjYzLDMzIEBAIGl4ODZfZ2V0X2Z1bmN0aW9u X3ZlcnNpb25zX2Rpc3BhdGNoZXIgKHZvaWQgKmRlY2wpCiAKICAgZGVmYXVs dF9ub2RlID0gZGVmYXVsdF92ZXJzaW9uX2luZm8tPnRoaXNfbm9kZTsKIAot I2lmIGRlZmluZWQgKEFTTV9PVVRQVVRfVFlQRV9ESVJFQ1RJVkUpICYmIEhB VkVfR05VX0lORElSRUNUX0ZVTkNUSU9OCi0gIC8qIFJpZ2h0IG5vdywgdGhl IGRpc3BhdGNoaW5nIGlzIGRvbmUgdmlhIGlmdW5jLiAgKi8KLSAgZGlzcGF0 Y2hfZGVjbCA9IG1ha2VfZGlzcGF0Y2hlcl9kZWNsIChkZWZhdWx0X25vZGUt PnN5bWJvbC5kZWNsKTsgCi0KLSAgZGlzcGF0Y2hlcl9ub2RlID0gY2dyYXBo X2dldF9jcmVhdGVfbm9kZSAoZGlzcGF0Y2hfZGVjbCk7Ci0gIGdjY19hc3Nl cnQgKGRpc3BhdGNoZXJfbm9kZSAhPSBOVUxMKTsKLSAgZGlzcGF0Y2hlcl9u b2RlLT5kaXNwYXRjaGVyX2Z1bmN0aW9uID0gMTsKLSAgZGlzcGF0Y2hlcl92 ZXJzaW9uX2luZm8KLSAgICA9IGluc2VydF9uZXdfY2dyYXBoX25vZGVfdmVy c2lvbiAoZGlzcGF0Y2hlcl9ub2RlKTsKLSAgZGlzcGF0Y2hlcl92ZXJzaW9u X2luZm8tPm5leHQgPSBkZWZhdWx0X3ZlcnNpb25faW5mbzsKLSAgZGlzcGF0 Y2hlcl9ub2RlLT5sb2NhbC5maW5hbGl6ZWQgPSAxOwotIAotICAvKiBTZXQg dGhlIGRpc3BhdGNoZXIgZm9yIGFsbCB0aGUgdmVyc2lvbnMuICAqLyAKLSAg aXRfdiA9IGRlZmF1bHRfdmVyc2lvbl9pbmZvOwotICB3aGlsZSAoaXRfdi0+ bmV4dCAhPSBOVUxMKQorI2lmIGRlZmluZWQgKEFTTV9PVVRQVVRfVFlQRV9E SVJFQ1RJVkUpCisgIGlmICh0YXJnZXRtLmhhc19pZnVuYyAoKSkKKyAgICB7 CisgICAgICAvKiBSaWdodCBub3csIHRoZSBkaXNwYXRjaGluZyBpcyBkb25l IHZpYSBpZnVuYy4gICovCisgICAgICBkaXNwYXRjaF9kZWNsID0gbWFrZV9k aXNwYXRjaGVyX2RlY2wgKGRlZmF1bHRfbm9kZS0+c3ltYm9sLmRlY2wpOwor CisgICAgICBkaXNwYXRjaGVyX25vZGUgPSBjZ3JhcGhfZ2V0X2NyZWF0ZV9u b2RlIChkaXNwYXRjaF9kZWNsKTsKKyAgICAgIGdjY19hc3NlcnQgKGRpc3Bh dGNoZXJfbm9kZSAhPSBOVUxMKTsKKyAgICAgIGRpc3BhdGNoZXJfbm9kZS0+ ZGlzcGF0Y2hlcl9mdW5jdGlvbiA9IDE7CisgICAgICBkaXNwYXRjaGVyX3Zl cnNpb25faW5mbworCT0gaW5zZXJ0X25ld19jZ3JhcGhfbm9kZV92ZXJzaW9u IChkaXNwYXRjaGVyX25vZGUpOworICAgICAgZGlzcGF0Y2hlcl92ZXJzaW9u X2luZm8tPm5leHQgPSBkZWZhdWx0X3ZlcnNpb25faW5mbzsKKyAgICAgIGRp c3BhdGNoZXJfbm9kZS0+bG9jYWwuZmluYWxpemVkID0gMTsKKworICAgICAg LyogU2V0IHRoZSBkaXNwYXRjaGVyIGZvciBhbGwgdGhlIHZlcnNpb25zLiAg Ki8KKyAgICAgIGl0X3YgPSBkZWZhdWx0X3ZlcnNpb25faW5mbzsKKyAgICAg IHdoaWxlIChpdF92LT5uZXh0ICE9IE5VTEwpCisJeworCSAgaXRfdi0+ZGlz cGF0Y2hlcl9yZXNvbHZlciA9IGRpc3BhdGNoX2RlY2w7CisJICBpdF92ID0g aXRfdi0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCiAgICAgewotICAgICAg aXRfdi0+ZGlzcGF0Y2hlcl9yZXNvbHZlciA9IGRpc3BhdGNoX2RlY2w7Ci0g ICAgICBpdF92ID0gaXRfdi0+bmV4dDsKKyAgICAgIGVycm9yX2F0IChERUNM X1NPVVJDRV9MT0NBVElPTiAoZGVmYXVsdF9ub2RlLT5zeW1ib2wuZGVjbCks CisJCSJtdWx0aXZlcnNpb25pbmcgbmVlZHMgaWZ1bmMgd2hpY2ggaXMgbm90 IHN1cHBvcnRlZCAiCisJCSJvbiB0aGlzIHRhcmdldCIpOwogICAgIH0KICNl bHNlCiAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAoZGVmYXVs dF9ub2RlLT5zeW1ib2wuZGVjbCksCmRpZmYgLS1naXQgYS9nY2MvY29uZmln L2xpbnV4LXByb3Rvcy5oIGIvZ2NjL2NvbmZpZy9saW51eC1wcm90b3MuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNkNzdkCi0t LSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9saW51eC1wcm90b3MuaApA QCAtMCwwICsxLDIxIEBACisvKiBQcm90b3R5cGVzLgorICAgQ29weXJpZ2h0 IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4 LCAyMDEwLCAyMDExLCAyMDEyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0Mg aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChh dCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUg ZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKzxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4gICovCisKK2V4dGVybiBib29sIGxpbnV4X2hhc19p ZnVuYyAodm9pZCk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2xpbnV4Lmgg Yi9nY2MvY29uZmlnL2xpbnV4LmgKaW5kZXggZmI0NTllNi4uYmRmYmMwZCAx MDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9saW51eC5oCisrKyBiL2djYy9jb25m aWcvbGludXguaApAQCAtMTA4LDMgKzEwOCw2IEBAIHNlZSB0aGUgZmlsZXMg Q09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJ ZiBub3QsIHNlZQogLyogV2hldGhlciB3ZSBoYXZlIEJpb25pYyBsaWJjIHJ1 bnRpbWUgKi8KICN1bmRlZiBUQVJHRVRfSEFTX0JJT05JQwogI2RlZmluZSBU QVJHRVRfSEFTX0JJT05JQyAoT1BUSU9OX0JJT05JQykKKworI3VuZGVmIFRB UkdFVF9IQVNfSUZVTkMKKyNkZWZpbmUgVEFSR0VUX0hBU19JRlVOQyBsaW51 eF9oYXNfaWZ1bmMKZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2dj Yy9kb2MvdG0udGV4aQppbmRleCA3NWFhODY3Li4yZDcxMjFmIDEwMDY0NAot LS0gYS9nY2MvZG9jL3RtLnRleGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBA IC0xMTM0MywzICsxMTM0Myw5IEBAIG1lbW9yeSBtb2RlbCBiaXRzIGFyZSBh bGxvd2VkLgogQGRlZnR5cGV2ciB7VGFyZ2V0IEhvb2t9IHt1bnNpZ25lZCBj aGFyfSBUQVJHRVRfQVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMCiBUaGlz IHZhbHVlIHNob3VsZCBiZSBzZXQgaWYgdGhlIHJlc3VsdCB3cml0dGVuIGJ5 IEBjb2Rle2F0b21pY190ZXN0X2FuZF9zZXR9IGlzIG5vdCBleGFjdGx5IDEs IGkuZS4gdGhlIEBjb2Rle2Jvb2x9IEBjb2Rle3RydWV9LgogQGVuZCBkZWZ0 eXBldnIKKworQGRlZnR5cGVmbiB7VGFyZ2V0IEhvb2t9IGJvb2wgVEFSR0VU X0hBU19JRlVOQyAodm9pZCkKK0l0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFy Z2V0IHN1cHBvcnRzIEdOVSBpbmRpcmVjdCBmdW5jdGlvbnMuCitUaGUgc3Vw cG9ydCBpbmNsdWRlcyB0aGUgYXNzZW1ibGVyLCBsaW5rZXIgYW5kIGR5bmFt aWMgbGlua2VyLgorVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBob29rIGlz IGRlZmluZWQgYXMgZm9yIHRoZSBob3N0IG1hY2hpbmUuCitAZW5kIGRlZnR5 cGVmbgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy90bS50ZXhpLmluIGIvZ2NjL2Rv Yy90bS50ZXhpLmluCmluZGV4IDk1ZmFiMTguLjQwZGJhNzcgMTAwNjQ0Ci0t LSBhL2djYy9kb2MvdG0udGV4aS5pbgorKysgYi9nY2MvZG9jL3RtLnRleGku aW4KQEAgLTExMTc5LDMgKzExMTc5LDUgQEAgbWVtb3J5IG1vZGVsIGJpdHMg YXJlIGFsbG93ZWQuCiBAZW5kIGRlZnR5cGVmbgogCiBAaG9vayBUQVJHRVRf QVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMCisKK0Bob29rIFRBUkdFVF9I QVNfSUZVTkMKZGlmZiAtLWdpdCBhL2djYy90YXJnZXQuZGVmIGIvZ2NjL3Rh cmdldC5kZWYKaW5kZXggYzViYmZhZS4uNjI3YWUyZCAxMDA2NDQKLS0tIGEv Z2NjL3RhcmdldC5kZWYKKysrIGIvZ2NjL3RhcmdldC5kZWYKQEAgLTE1MjAs NiArMTUyMCwxNSBAQCBERUZIT09LCiAgYm9vbCwgKGNvbnN0X3J0eCB4KSwK ICBkZWZhdWx0X3VzZV9hbmNob3JzX2Zvcl9zeW1ib2xfcCkKIAorLyogVHJ1 ZSBpZiB0YXJnZXQgc3VwcG9ydHMgaW5kaXJlY3QgZnVuY3Rpb25zLiAgKi8K K0RFRkhPT0sKKyhoYXNfaWZ1bmMsCisgIkl0IHJldHVybnMgdHJ1ZSBpZiB0 aGUgdGFyZ2V0IHN1cHBvcnRzIEdOVSBpbmRpcmVjdCBmdW5jdGlvbnMuXG5c CitUaGUgc3VwcG9ydCBpbmNsdWRlcyB0aGUgYXNzZW1ibGVyLCBsaW5rZXIg YW5kIGR5bmFtaWMgbGlua2VyLlxuXAorVGhlIGRlZmF1bHQgdmFsdWUgb2Yg dGhpcyBob29rIGlzIGRlZmluZWQgYXMgZm9yIHRoZSBob3N0IG1hY2hpbmUu IiwKKyBib29sLCAodm9pZCksCisgZGVmYXVsdF9oYXZlX2lmdW5jKQorCiAv KiBUcnVlIGlmIGl0IGlzIE9LIHRvIGRvIHNpYmxpbmcgY2FsbCBvcHRpbWl6 YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKICAgIGNhbGwgZXhwcmVzc2lvbiBF WFAuICBERUNMIHdpbGwgYmUgdGhlIGNhbGxlZCBmdW5jdGlvbiwgb3IgTlVM TCBpZgogICAgdGhpcyBpcyBhbiBpbmRpcmVjdCBjYWxsLiAgKi8KZGlmZiAt LWdpdCBhL2djYy90YXJnaG9va3MuYyBiL2djYy90YXJnaG9va3MuYwppbmRl eCA5NTRjZGI5Li5lYTBmOWUyIDEwMDY0NAotLS0gYS9nY2MvdGFyZ2hvb2tz LmMKKysrIGIvZ2NjL3Rhcmdob29rcy5jCkBAIC00NTEsNiArNDUxLDE0IEBA IGRlZmF1bHRfZml4ZWRfcG9pbnRfc3VwcG9ydGVkX3AgKHZvaWQpCiAgIHJl dHVybiBFTkFCTEVfRklYRURfUE9JTlQ7CiB9CiAKKy8qIFRydWUgaWYgdGhl IHRhcmdldCBzdXBwb3J0cyBHTlUgaW5kaXJlY3QgZnVuY3Rpb25zLiAgKi8K KworYm9vbAorZGVmYXVsdF9oYXZlX2lmdW5jICh2b2lkKQoreworICByZXR1 cm4gSEFWRV9HTlVfSU5ESVJFQ1RfRlVOQ1RJT047Cit9CisKIC8qIE5VTEwg aWYgSU5TTiBpbnNuIGlzIHZhbGlkIHdpdGhpbiBhIGxvdy1vdmVyaGVhZCBs b29wLCBvdGhlcndpc2UgcmV0dXJucwogICAgYW4gZXJyb3IgbWVzc2FnZS4K IApkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29rcy5oIGIvZ2NjL3Rhcmdob29r cy5oCmluZGV4IGJkN2Q0YmMuLjg2MjJkNTggMTAwNjQ0Ci0tLSBhL2djYy90 YXJnaG9va3MuaAorKysgYi9nY2MvdGFyZ2hvb2tzLmgKQEAgLTczLDYgKzcz LDggQEAgZXh0ZXJuIGJvb2wgdGFyZ2hvb2tfZmxvYXRfd29yZHNfYmlnX2Vu ZGlhbiAodm9pZCk7CiBleHRlcm4gYm9vbCBkZWZhdWx0X2RlY2ltYWxfZmxv YXRfc3VwcG9ydGVkX3AgKHZvaWQpOwogZXh0ZXJuIGJvb2wgZGVmYXVsdF9m aXhlZF9wb2ludF9zdXBwb3J0ZWRfcCAodm9pZCk7CiAKK2V4dGVybiBib29s IGRlZmF1bHRfaGF2ZV9pZnVuYyAodm9pZCk7CisKIGV4dGVybiBjb25zdCBj aGFyICogZGVmYXVsdF9pbnZhbGlkX3dpdGhpbl9kb2xvb3AgKGNvbnN0X3J0 eCk7CiAKIGV4dGVybiB0cmVlIGRlZmF1bHRfYnVpbHRpbl92ZWN0b3JpemVk X2Z1bmN0aW9uICh0cmVlLCB0cmVlLCB0cmVlKTsKZGlmZiAtLWdpdCBhL2dj Yy92YXJhc20uYyBiL2djYy92YXJhc20uYwppbmRleCA3ZDA4M2ZkLi5kZDY3 N2E0IDEwMDY0NAotLS0gYS9nY2MvdmFyYXNtLmMKKysrIGIvZ2NjL3ZhcmFz bS5jCkBAIC01NDg5LDE0ICs1NDg5LDE1IEBAIGRvX2Fzc2VtYmxlX2FsaWFz ICh0cmVlIGRlY2wsIHRyZWUgdGFyZ2V0KQogICAgIH0KICAgaWYgKGxvb2t1 cF9hdHRyaWJ1dGUgKCJpZnVuYyIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkp KQogICAgIHsKLSNpZiBkZWZpbmVkIChBU01fT1VUUFVUX1RZUEVfRElSRUNU SVZFKSAmJiBIQVZFX0dOVV9JTkRJUkVDVF9GVU5DVElPTgotICAgICAgQVNN X09VVFBVVF9UWVBFX0RJUkVDVElWRQotCShhc21fb3V0X2ZpbGUsIElERU5U SUZJRVJfUE9JTlRFUiAoREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCkpLAot CSBJRlVOQ19BU01fVFlQRSk7Ci0jZWxzZQotICAgICAgZXJyb3JfYXQgKERF Q0xfU09VUkNFX0xPQ0FUSU9OIChkZWNsKSwKLQkJImlmdW5jIGlzIG5vdCBz dXBwb3J0ZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIik7CisjaWYgZGVmaW5l ZCAoQVNNX09VVFBVVF9UWVBFX0RJUkVDVElWRSkKKyAgICAgIGlmICh0YXJn ZXRtLmhhc19pZnVuYyAoKSkKKwlBU01fT1VUUFVUX1RZUEVfRElSRUNUSVZF CisJICAoYXNtX291dF9maWxlLCBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xf QVNTRU1CTEVSX05BTUUgKGRlY2wpKSwKKwkgICBJRlVOQ19BU01fVFlQRSk7 CisgICAgICBlbHNlCiAjZW5kaWYKKwllcnJvcl9hdCAoREVDTF9TT1VSQ0Vf TE9DQVRJT04gKGRlY2wpLAorCQkgICJpZnVuYyBpcyBub3Qgc3VwcG9ydGVk IG9uIHRoaXMgdGFyZ2V0Iik7CiAgICAgfQogCiAjIGlmZGVmIEFTTV9PVVRQ VVRfREVGX0ZST01fREVDTFMK --f46d042fd93a67325004d1e8d465--