From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19398 invoked by alias); 9 Jan 2013 11:24:49 -0000 Received: (qmail 19354 invoked by uid 22791); 9 Jan 2013 11:24:44 -0000 X-SWARE-Spam-Status: No, hits=-4.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-pb0-f45.google.com (HELO mail-pb0-f45.google.com) (209.85.160.45) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Jan 2013 11:24:23 +0000 Received: by mail-pb0-f45.google.com with SMTP id mc8so888789pbc.4 for ; Wed, 09 Jan 2013 03:24:23 -0800 (PST) MIME-Version: 1.0 Received: by 10.66.80.68 with SMTP id p4mr188742838pax.35.1357730662866; Wed, 09 Jan 2013 03:24:22 -0800 (PST) Received: by 10.68.229.137 with HTTP; Wed, 9 Jan 2013 03:24:22 -0800 (PST) In-Reply-To: References: <28659BFC-706C-4478-BAFA-142383271369@codesourcery.com> Date: Wed, 09 Jan 2013 11:24:00 -0000 Message-ID: Subject: Re: [RFC PATCH] Implementing ifunc target hook From: Alexander Ivchenko To: Maxim Kuvyrkov Cc: GCC Patches , "Joseph S. Myers" , "H.J. Lu" Content-Type: multipart/mixed; boundary=f46d042ef565dc5f1904d2d94d1e 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: 2013-01/txt/msg00478.txt.bz2 --f46d042ef565dc5f1904d2d94d1e Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Content-length: 20808 Hello Maxim, >> >>>> --- a/gcc/config/i386/i386.c >>>> +++ b/gcc/config/i386/i386.c >>>> @@ -29146,7 +29146,7 @@ make_name (tree decl, const char *suffix, bool= make_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 *d= ecl) >>>> >>>> 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 NUL= L; >>> >>> It seems you can move these variables inside the 'if (TARGET_HAS_IFUNC)= ' clause below and make >the code cleaner, no? >> >> All variable declarations should be at the beginning of the routine. >> Or is it changed right now? > >The variable declarations should be at the beginning of a block. Since yo= u are adding a new block below (under if (TARGET_HAS_IFUNC) { }), a= nd these variables are used only within that block, it would be cleaner to = move them there. Done, thank you. >> diff --git a/gcc/config/host-linux.c b/gcc/config/host-linux.c >> index b535758..c72db79 100644 >> --- a/gcc/config/host-linux.c >> +++ b/gcc/config/host-linux.c >> .... >> >> +/* Android does not support GNU indirect functions. */ >> + >> +bool >> +linux_has_ifunc (void) >> +{ >> + return TARGET_ANDROID ? false : HAVE_GNU_INDIRECT_FUNCTION; >> +} >> + > >OK, so you defined new *target* hook has_ifunc[_p]. Placing one of the ho= ok's implementation is into a host-specific file seems like a strange idea,= but maybe I'm missing something. > >It seems you want to add a new file config/linux-android.c (with implement= ation for symbols used in config/linux-android.h) and add it Android-flavou= red linux targets in config.gcc: > # Add Android userspace support to Linux targets. . case $target in > *linux*) > tm_file=3D"$tm_file linux-android.h" > extra_options=3D"$extra_options linux-android.opt" >+ extra_objs=3D"$extra_objs linux-android.o" > ;; > esac > I agree, that would be much better, I added gcc/config/linux-android.c and also gcc/config/t-linux-android for the rule, thanks. >> diff --git a/gcc/config/linux-protos.h b/gcc/config/linux-protos.h >> new file mode 100644 >> index 0000000..ea3d77d >> --- /dev/null >> +++ b/gcc/config/linux-protos.h >> @@ -0,0 +1,21 @@ >> +/* Prototypes. >> + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010, 2011, = 2012 >> + Free Software Foundation, Inc. >> + >> +This file is part of GCC. >> + >> +GCC is free software; you can redistribute it and/or modify >> +it under the terms of the GNU General Public License as published by >> +the Free Software Foundation; either version 3, or (at your option) >> +any later version. >> + >> +GCC is distributed in the hope that it will be useful, >> +but WITHOUT ANY WARRANTY; without even the implied warranty of >> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +GNU General Public License for more details. >> + >> +You should have received a copy of the GNU General Public License >> +along with GCC; see the file COPYING3. If not see >> +. */ >> + >> +extern bool linux_has_ifunc (void); > >Config/linux-android.h is a better place for this declaration. That wouldn't help, I got the following error: In file included from ../../.././gcc/tm.h:24:0, from [..]/src/gcc/libgcc/generic-morestack-thread.c:29: [..]/src/gcc/libgcc/../gcc/config/linux-android.h:62:1: error: unknown type name =91bool=92 extern bool linux_android_has_ifunc_p (void); ^ Anyway, linux-protos.h looks to me as a good thing to have (e.g. for libc_has_function hook, that is supposed to be commited in a near future) for declaring linux (and Android) specific versions of hooks.. >> +/* True if target supports indirect functions. */ >> +DEFHOOK >> +(has_ifunc, > >The convention is to add "_p" for functions that behave like boolean predi= cates, i.e., "has_ifunc_p". Done. >> + "It returns true if the target supports GNU indirect functions.\n\ >> +The support includes the assembler, linker and dynamic linker.\n\ >> +The default value of this hook is defined as for the host machine.", > >Are your sure the last sentence is correct? It seems the default value fo= r this hook is based on which libc is being used. Maybe it would be more a= ccurate to say "The default value of this hook is based on target's libc."? Well yes, you are right that the default value depends on version of libc, but this version is checked on the configure time for the host machine (HAVE_GNU_INDIRECT_FUNCTION), so may be the correct sentence would be "The default value of this hook is based on host's libc."? thanks, Alexander 2013/1/3 Maxim Kuvyrkov : > On 29/12/2012, at 1:30 AM, Alexander Ivchenko wrote: > >> 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 ord= er >> to declare linux (that works for android) version of this hook - otherwi= se >> I don't know where to declare it.. > > See notes below on this. Once you added a new target hook you can call i= t via targetm.(), so references to TARGET_HAS_IFUNC should be replace= d with calls to targetm.has_ifunc_p(). > > Sorry, but it will take another iteration or two to make this patch just = right. GCC config machinery is tricky, and placing things in the right pla= ces is non-trivial. > >> >>>> --- a/gcc/config/i386/i386.c >>>> +++ b/gcc/config/i386/i386.c >>>> @@ -29146,7 +29146,7 @@ make_name (tree decl, const char *suffix, bool= make_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 *d= ecl) >>>> >>>> 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 NUL= L; >>> >>> It seems you can move these variables inside the 'if (TARGET_HAS_IFUNC)= ' clause below and make >the code cleaner, no? >> >> All variable declarations should be at the beginning of the routine. >> Or is it changed right now? > > The variable declarations should be at the beginning of a block. Since y= ou are adding a new block below (under if (TARGET_HAS_IFUNC) { }), = and these variables are used only within that block, it would be cleaner to= move them there. > >> >>>> @@ -29263,24 +29263,33 @@ ix86_get_function_versions_dispatcher (void = *decl) >>>> >>>> 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.de= cl); >>>> + >>>> + 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= _GNU_INDIRECT_FUNCTION and after the patch it will produce an error. Remov= ing 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.. > > You are right, I read the patch wrong. > >> index db56819..e535218 100644 >> --- a/gcc/config.gcc >> +++ b/gcc/config.gcc >> @@ -637,6 +637,11 @@ case ${target} in >> native_system_header_dir=3D/include >> ;; >> esac >> + case $target in >> + *linux*) >> + tm_p_file=3D"${tm_p_file} linux-protos.h" >> + ;; >> + esac >> # glibc / uclibc / bionic switch. >> # uclibc and bionic aren't usable for GNU/Hurd and neither for GNU/k*= BSD. >> case $target in > > Should not be necessary. Put the hook override into config/linux-android= .h: > #undef TARGET_HAS_IFUNC_P > #define TARGET_HAS_IFUNC_P linux_android_has_ifunc_p > >> diff --git a/gcc/config/host-linux.c b/gcc/config/host-linux.c >> index b535758..c72db79 100644 >> --- a/gcc/config/host-linux.c >> +++ b/gcc/config/host-linux.c >> > ... >> >> +/* Android does not support GNU indirect functions. */ >> + >> +bool >> +linux_has_ifunc (void) >> +{ >> + return TARGET_ANDROID ? false : HAVE_GNU_INDIRECT_FUNCTION; >> +} >> + > > OK, so you defined new *target* hook has_ifunc[_p]. Placing one of the h= ook's implementation is into a host-specific file seems like a strange idea= , but maybe I'm missing something. > > It seems you want to add a new file config/linux-android.c (with implemen= tation for symbols used in config/linux-android.h) and add it Android-flavo= ured linux targets in config.gcc: > # Add Android userspace support to Linux targets. > case $target in > *linux*) > tm_file=3D"$tm_file linux-android.h" > extra_options=3D"$extra_options linux-android.opt" > + extra_objs=3D"$extra_objs linux-android.o" > ;; > esac > > >> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c >> index b466a4f..c422fd9 100644 >> --- 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; >> @@ -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 (targetm.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"); >> } >> #else >> error_at (DECL_SOURCE_LOCATION (default_node->symbol.decl), > > Would you please use same trick for arranging #if-else-#endif as you did = for varasm.c ? > >> diff --git a/gcc/config/linux-protos.h b/gcc/config/linux-protos.h >> new file mode 100644 >> index 0000000..ea3d77d >> --- /dev/null >> +++ b/gcc/config/linux-protos.h >> @@ -0,0 +1,21 @@ >> +/* Prototypes. >> + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010, 2011, = 2012 >> + Free Software Foundation, Inc. >> + >> +This file is part of GCC. >> + >> +GCC is free software; you can redistribute it and/or modify >> +it under the terms of the GNU General Public License as published by >> +the Free Software Foundation; either version 3, or (at your option) >> +any later version. >> + >> +GCC is distributed in the hope that it will be useful, >> +but WITHOUT ANY WARRANTY; without even the implied warranty of >> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +GNU General Public License for more details. >> + >> +You should have received a copy of the GNU General Public License >> +along with GCC; see the file COPYING3. If not see >> +. */ >> + >> +extern bool linux_has_ifunc (void); > > Config/linux-android.h is a better place for this declaration. > >> diff --git a/gcc/config/linux.h b/gcc/config/linux.h >> index fb459e6..bdfbc0d 100644 >> --- a/gcc/config/linux.h >> +++ b/gcc/config/linux.h >> @@ -108,3 +108,6 @@ see the files COPYING3 and COPYING.RUNTIME respectiv= ely. If not, see >> /* Whether we have Bionic libc runtime */ >> #undef TARGET_HAS_BIONIC >> #define TARGET_HAS_BIONIC (OPTION_BIONIC) >> + >> +#undef TARGET_HAS_IFUNC >> +#define TARGET_HAS_IFUNC linux_has_ifunc > > As noted above, please move the hook override to linux-android.h . The o= verride should be effective only for Linux targets that support Android, ot= herwise compilation may fail due to undefined TARGET_ANDROID used in linux_= has_ifunc. > > >> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi >> index 75aa867..2d7121f 100644 >> --- a/gcc/doc/tm.texi >> +++ b/gcc/doc/tm.texi >> @@ -11343,3 +11343,9 @@ memory model bits are allowed. >> @deftypevr {Target Hook} {unsigned char} TARGET_ATOMIC_TEST_AND_SET_TRU= EVAL >> This value should be set if the result written by @code{atomic_test_and= _set} is not exactly 1, i.e. the @code{bool} @code{true}. >> @end deftypevr >> + >> +@deftypefn {Target Hook} bool TARGET_HAS_IFUNC (void) >> +It returns true if the target supports GNU indirect functions. >> +The support includes the assembler, linker and dynamic linker. >> +The default value of this hook is defined as for the host machine. >> +@end deftypefn >> diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in >> index 95fab18..40dba77 100644 >> --- a/gcc/doc/tm.texi.in >> +++ b/gcc/doc/tm.texi.in >> @@ -11179,3 +11179,5 @@ memory model bits are allowed. >> @end deftypefn >> >> @hook TARGET_ATOMIC_TEST_AND_SET_TRUEVAL >> + >> +@hook TARGET_HAS_IFUNC >> diff --git a/gcc/target.def b/gcc/target.def >> index c5bbfae..627ae2d 100644 >> --- a/gcc/target.def >> +++ b/gcc/target.def >> @@ -1520,6 +1520,15 @@ DEFHOOK >> bool, (const_rtx x), >> default_use_anchors_for_symbol_p) >> >> +/* True if target supports indirect functions. */ >> +DEFHOOK >> +(has_ifunc, > > The convention is to add "_p" for functions that behave like boolean pred= icates, i.e., "has_ifunc_p". > >> + "It returns true if the target supports GNU indirect functions.\n\ >> +The support includes the assembler, linker and dynamic linker.\n\ >> +The default value of this hook is defined as for the host machine.", > > Are your sure the last sentence is correct? It seems the default value f= or this hook is based on which libc is being used. Maybe it would be more = accurate to say "The default value of this hook is based on target's libc."? > >> + bool, (void), >> + default_have_ifunc) >> + >> /* True if it is OK to do sibling call optimization for the specified >> call expression EXP. DECL will be the called function, or NULL if >> this is an indirect call. */ >> diff --git a/gcc/targhooks.c b/gcc/targhooks.c >> index 954cdb9..ea0f9e2 100644 >> --- a/gcc/targhooks.c >> +++ b/gcc/targhooks.c >> @@ -451,6 +451,14 @@ default_fixed_point_supported_p (void) >> return ENABLE_FIXED_POINT; >> } >> >> +/* True if the target supports GNU indirect functions. */ >> + >> +bool >> +default_have_ifunc (void) >> +{ >> + return HAVE_GNU_INDIRECT_FUNCTION; >> +} >> + >> /* NULL if INSN insn is valid within a low-overhead loop, otherwise ret= urns >> an error message. >> >> diff --git a/gcc/targhooks.h b/gcc/targhooks.h >> index bd7d4bc..8622d58 100644 >> --- a/gcc/targhooks.h >> +++ b/gcc/targhooks.h >> @@ -73,6 +73,8 @@ extern bool targhook_float_words_big_endian (void); >> extern bool default_decimal_float_supported_p (void); >> extern bool default_fixed_point_supported_p (void); >> >> +extern bool default_have_ifunc (void); >> + >> extern const char * default_invalid_within_doloop (const_rtx); >> >> extern tree default_builtin_vectorized_function (tree, tree, tree); >> diff --git a/gcc/varasm.c b/gcc/varasm.c >> index 7d083fd..dd677a4 100644 >> --- a/gcc/varasm.c >> +++ b/gcc/varasm.c >> @@ -5489,14 +5489,15 @@ 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); >> -#else >> - error_at (DECL_SOURCE_LOCATION (decl), >> - "ifunc is not supported in this configuration"); >> +#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) >> + if (targetm.has_ifunc ()) >> + ASM_OUTPUT_TYPE_DIRECTIVE >> + (asm_out_file, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), >> + IFUNC_ASM_TYPE); >> + else >> #endif >> + error_at (DECL_SOURCE_LOCATION (decl), >> + "ifunc is not supported on this target"); >> } > > I like how you arranged #if-else-#endif to have a single error path. > > Thank you, > > -- > Maxim Kuvyrkov > > > > --f46d042ef565dc5f1904d2d94d1e Content-Type: application/octet-stream; name="disable_ifunc_for_android_05.patch" Content-Disposition: attachment; filename="disable_ifunc_for_android_05.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hbqdpyxr0 Content-length: 17312 ZGlmZiAtLWdpdCBhL2djYy9DaGFuZ2VMb2cgYi9nY2MvQ2hhbmdlTG9nCmlu ZGV4IGQ2MjViYjEuLmFiY2UzNzIgMTAwNjQ0Ci0tLSBhL2djYy9DaGFuZ2VM b2cKKysrIGIvZ2NjL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIxIEBACisyMDEy LTEyLTI4ICBBbGV4YW5kZXIgSXZjaGVua28gIDxhbGV4YW5kZXIuaXZjaGVu a29AaW50ZWwuY29tPgorCisJKiBnY2MvdGFyZ2V0LmRlZiAoVEFSR0VUX0hB U19JRlVOQ19QKTogTmV3IHRhcmdldCBob29rLgorCSogZ2NjL2RvYy90bS50 ZXhpLmluIChUQVJHRVRfSEFTX0lGVU5DX1ApOiBOZXcuCisJKiBnY2MvZG9j L3RtLnRleGk6IFJlZ2VuZXJhdGUuCisJKiBnY2MvdGFyZ2hvb2tzLmggKGRl ZmF1bHRfaGF2ZV9pZnVuY19wKTogTmV3LgorCSogZ2NjL3Rhcmdob29rcy5j IChkZWZhdWx0X2hhdmVfaWZ1bmNfcCk6IERpdHRvLgorCSogZ2NjL2NvbmZp Zy9saW51eC1wcm90b3MuaDogTmV3IGZpbGUuCisJKiBnY2MvY29uZmlnL2xp bnV4LWFuZHJvaWRzLmggKFRBUkdFVF9IQVNfSUZVTkNfUCk6IFVzaW5nIHZl cnNpb24gb2YKKwl0aGlzIGhvb2sgZm9yIGxpbnV4IHdoaWNoIGRpc2FibGVz IHN1cHBvcnQgb2YgaW5kaXJlY3QgZnVuY3Rpb25zIGluCisJYW5kcm9pZC4K KwkqIGdjYy9jb25maWcvbGludXgtYW5kcm9pZC5jOiBOZXcgZmlsZS4KKwkq IGdjYy9jb25maWcvdC1saW51eC1hbmRyb2lkLmM6IERpdHRvLgorCSogZ2Nj L2NvbmZpZy5nY2M6IEFkZGVkIG5ldyBvYmplY3QgZmlsZSBsaW51eC1hbmRy b2lkLm8uCisJKiBnY2MvY29uZmlnL2kzODYvaTM4Ni5jIChpeDg2X2dldF9m dW5jdGlvbl92ZXJzaW9uc19kaXNwYXRjaGVyKToKKwlVc2luZyBUQVJHRVRf SEFTX0lGVU5DIGhvb2sgaW5zdGVhZCBvZiBIQVZFX0dOVV9JTkRJUkVDVF9G VU5DVElPTi4KKwkqIGdjYy92YXJhc20uYyAoZG9fYXNzZW1ibGVfYWxpYXMp OiBMaWtld2lzZS4KKwogMjAxMi0xMi0yMiAgSmFuIEh1Ymlja2EgIDxqaEBz dXNlLmN6PgogCiAJUFIgbHRvLzU0NzI4CmRpZmYgLS1naXQgYS9nY2MvY29u ZmlnLmdjYyBiL2djYy9jb25maWcuZ2NjCmluZGV4IGRiNTY4MTkuLmJiZjY1 YzIgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcuZ2NjCisrKyBiL2djYy9jb25m aWcuZ2NjCkBAIC02MzcsNiArNjM3LDExIEBAIGNhc2UgJHt0YXJnZXR9IGlu CiAgICAgICBuYXRpdmVfc3lzdGVtX2hlYWRlcl9kaXI9L2luY2x1ZGUKICAg ICAgIDs7CiAgIGVzYWMKKyAgY2FzZSAkdGFyZ2V0IGluCisgICAgKmxpbnV4 KikKKyAgICAgIHRtX3BfZmlsZT0iJHt0bV9wX2ZpbGV9IGxpbnV4LXByb3Rv cy5oIgorICAgICAgOzsKKyAgZXNhYwogICAjIGdsaWJjIC8gdWNsaWJjIC8g YmlvbmljIHN3aXRjaC4KICAgIyB1Y2xpYmMgYW5kIGJpb25pYyBhcmVuJ3Qg dXNhYmxlIGZvciBHTlUvSHVyZCBhbmQgbmVpdGhlciBmb3IgR05VL2sqQlNE LgogICBjYXNlICR0YXJnZXQgaW4KQEAgLTY2Miw4ICs2NjcsMTAgQEAgY2Fz ZSAke3RhcmdldH0gaW4KICAgIyBBZGQgQW5kcm9pZCB1c2Vyc3BhY2Ugc3Vw cG9ydCB0byBMaW51eCB0YXJnZXRzLgogICBjYXNlICR0YXJnZXQgaW4KICAg ICAqbGludXgqKQorICAgICAgdG1ha2VfZmlsZT0iJHt0bWFrZV9maWxlfSB0 LWxpbnV4LWFuZHJvaWQiCiAgICAgICB0bV9maWxlPSIkdG1fZmlsZSBsaW51 eC1hbmRyb2lkLmgiCiAgICAgICBleHRyYV9vcHRpb25zPSIkZXh0cmFfb3B0 aW9ucyBsaW51eC1hbmRyb2lkLm9wdCIKKyAgICAgIGV4dHJhX29ianM9IiRl eHRyYV9vYmpzIGxpbnV4LWFuZHJvaWQubyIKICAgICAgIDs7CiAgIGVzYWMK ICAgIyBFbmFibGUgY29tcGlsYXRpb24gZm9yIEFuZHJvaWQgYnkgZGVmYXVs dCBmb3IgKmFuZHJvaWQqIHRhcmdldHMuCmRpZmYgLS1naXQgYS9nY2MvY29u ZmlnL2hvc3QtbGludXguYyBiL2djYy9jb25maWcvaG9zdC1saW51eC5jCmlu ZGV4IGI1MzU3NTguLmFlNWQyMTEgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcv aG9zdC1saW51eC5jCisrKyBiL2djYy9jb25maWcvaG9zdC1saW51eC5jCkBA IC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAiaG9zdGhvb2tzLmgiCiAjaW5j bHVkZSAiaG9zdGhvb2tzLWRlZi5oIgogCi0KIC8qIExpbnV4IGhhcyBhIGZl YXR1cmUgY2FsbGVkIGV4ZWMtc2hpZWxkLXJhbmRvbWl6ZSB0aGF0IHBlcnR1 cmJzIHRoZQogICAgYWRkcmVzcyBvZiBub24tZml4ZWQgbWFwcGVkIHNlZ21l bnRzIGJ5IGEgKHJlbGF0aXZlbHkpIHNtYWxsIGFtb3VudC4KICAgIFRoZSBm ZWF0dXJlIGlzIGludGVuZGVkIHRvIG1ha2UgaXQgaGFyZGVyIHRvIGF0dGFj ayB0aGUgc3lzdGVtIHdpdGgKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4 Ni9pMzg2LmMgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jCmluZGV4IGI0NjZh NGYuLjk4ZTI5OTggMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2 LmMKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYwpAQCAtMjkxNDYsNyAr MjkxNDYsNyBAQCBtYWtlX25hbWUgKHRyZWUgZGVjbCwgY29uc3QgY2hhciAq c3VmZml4LCBib29sIG1ha2VfdW5pcXVlKQogICByZXR1cm4gZ2xvYmFsX3Zh cl9uYW1lOwogfQogCi0jaWYgZGVmaW5lZCAoQVNNX09VVFBVVF9UWVBFX0RJ UkVDVElWRSkgJiYgSEFWRV9HTlVfSU5ESVJFQ1RfRlVOQ1RJT04KKyNpZiBk ZWZpbmVkIChBU01fT1VUUFVUX1RZUEVfRElSRUNUSVZFKQogCiAvKiBNYWtl IGEgZGlzcGF0Y2hlciBkZWNsYXJhdGlvbiBmb3IgdGhlIG11bHRpLXZlcnNp b25lZCBmdW5jdGlvbiBERUNMLgogICAgQ2FsbHMgdG8gREVDTCBmdW5jdGlv biB3aWxsIGJlIHJlcGxhY2VkIHdpdGggY2FsbHMgdG8gdGhlIGRpc3BhdGNo ZXIKQEAgLTI5MjEzLDEyICsyOTIxMyw2IEBAIGl4ODZfZ2V0X2Z1bmN0aW9u X3ZlcnNpb25zX2Rpc3BhdGNoZXIgKHZvaWQgKmRlY2wpCiAKICAgdHJlZSBk aXNwYXRjaF9kZWNsID0gTlVMTDsKIAotI2lmIGRlZmluZWQgKEFTTV9PVVRQ VVRfVFlQRV9ESVJFQ1RJVkUpICYmIEhBVkVfR05VX0lORElSRUNUX0ZVTkNU SU9OCi0gIHN0cnVjdCBjZ3JhcGhfZnVuY3Rpb25fdmVyc2lvbl9pbmZvICpp dF92ID0gTlVMTDsKLSAgc3RydWN0IGNncmFwaF9ub2RlICpkaXNwYXRjaGVy X25vZGUgPSBOVUxMOwotICBzdHJ1Y3QgY2dyYXBoX2Z1bmN0aW9uX3ZlcnNp b25faW5mbyAqZGlzcGF0Y2hlcl92ZXJzaW9uX2luZm8gPSBOVUxMOwotI2Vu ZGlmCi0KICAgc3RydWN0IGNncmFwaF9mdW5jdGlvbl92ZXJzaW9uX2luZm8g KmRlZmF1bHRfdmVyc2lvbl9pbmZvID0gTlVMTDsKICAKICAgZ2NjX2Fzc2Vy dCAoZm4gIT0gTlVMTCAmJiBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoZm4p KTsKQEAgLTI5MjYzLDMwICsyOTI1Nyw0MCBAQCBpeDg2X2dldF9mdW5jdGlv bl92ZXJzaW9uc19kaXNwYXRjaGVyICh2b2lkICpkZWNsKQogCiAgIGRlZmF1 bHRfbm9kZSA9IGRlZmF1bHRfdmVyc2lvbl9pbmZvLT50aGlzX25vZGU7CiAK LSNpZiBkZWZpbmVkIChBU01fT1VUUFVUX1RZUEVfRElSRUNUSVZFKSAmJiBI QVZFX0dOVV9JTkRJUkVDVF9GVU5DVElPTgotICAvKiBSaWdodCBub3csIHRo ZSBkaXNwYXRjaGluZyBpcyBkb25lIHZpYSBpZnVuYy4gICovCi0gIGRpc3Bh dGNoX2RlY2wgPSBtYWtlX2Rpc3BhdGNoZXJfZGVjbCAoZGVmYXVsdF9ub2Rl LT5zeW1ib2wuZGVjbCk7IAotCi0gIGRpc3BhdGNoZXJfbm9kZSA9IGNncmFw aF9nZXRfY3JlYXRlX25vZGUgKGRpc3BhdGNoX2RlY2wpOwotICBnY2NfYXNz ZXJ0IChkaXNwYXRjaGVyX25vZGUgIT0gTlVMTCk7Ci0gIGRpc3BhdGNoZXJf bm9kZS0+ZGlzcGF0Y2hlcl9mdW5jdGlvbiA9IDE7Ci0gIGRpc3BhdGNoZXJf dmVyc2lvbl9pbmZvCi0gICAgPSBpbnNlcnRfbmV3X2NncmFwaF9ub2RlX3Zl cnNpb24gKGRpc3BhdGNoZXJfbm9kZSk7Ci0gIGRpc3BhdGNoZXJfdmVyc2lv bl9pbmZvLT5uZXh0ID0gZGVmYXVsdF92ZXJzaW9uX2luZm87Ci0gIGRpc3Bh dGNoZXJfbm9kZS0+bG9jYWwuZmluYWxpemVkID0gMTsKLSAKLSAgLyogU2V0 IHRoZSBkaXNwYXRjaGVyIGZvciBhbGwgdGhlIHZlcnNpb25zLiAgKi8gCi0g IGl0X3YgPSBkZWZhdWx0X3ZlcnNpb25faW5mbzsKLSAgd2hpbGUgKGl0X3Yt Pm5leHQgIT0gTlVMTCkKKyNpZiBkZWZpbmVkIChBU01fT1VUUFVUX1RZUEVf RElSRUNUSVZFKQorICBpZiAodGFyZ2V0bS5oYXNfaWZ1bmNfcCAoKSkKICAg ICB7Ci0gICAgICBpdF92LT5kaXNwYXRjaGVyX3Jlc29sdmVyID0gZGlzcGF0 Y2hfZGVjbDsKLSAgICAgIGl0X3YgPSBpdF92LT5uZXh0OworICAgICAgc3Ry dWN0IGNncmFwaF9mdW5jdGlvbl92ZXJzaW9uX2luZm8gKml0X3YgPSBOVUxM OworICAgICAgc3RydWN0IGNncmFwaF9ub2RlICpkaXNwYXRjaGVyX25vZGUg PSBOVUxMOworICAgICAgc3RydWN0IGNncmFwaF9mdW5jdGlvbl92ZXJzaW9u X2luZm8gKmRpc3BhdGNoZXJfdmVyc2lvbl9pbmZvID0gTlVMTDsKKworICAg ICAgLyogUmlnaHQgbm93LCB0aGUgZGlzcGF0Y2hpbmcgaXMgZG9uZSB2aWEg aWZ1bmMuICAqLworICAgICAgZGlzcGF0Y2hfZGVjbCA9IG1ha2VfZGlzcGF0 Y2hlcl9kZWNsIChkZWZhdWx0X25vZGUtPnN5bWJvbC5kZWNsKTsKKworICAg ICAgZGlzcGF0Y2hlcl9ub2RlID0gY2dyYXBoX2dldF9jcmVhdGVfbm9kZSAo ZGlzcGF0Y2hfZGVjbCk7CisgICAgICBnY2NfYXNzZXJ0IChkaXNwYXRjaGVy X25vZGUgIT0gTlVMTCk7CisgICAgICBkaXNwYXRjaGVyX25vZGUtPmRpc3Bh dGNoZXJfZnVuY3Rpb24gPSAxOworICAgICAgZGlzcGF0Y2hlcl92ZXJzaW9u X2luZm8KKwk9IGluc2VydF9uZXdfY2dyYXBoX25vZGVfdmVyc2lvbiAoZGlz cGF0Y2hlcl9ub2RlKTsKKyAgICAgIGRpc3BhdGNoZXJfdmVyc2lvbl9pbmZv LT5uZXh0ID0gZGVmYXVsdF92ZXJzaW9uX2luZm87CisgICAgICBkaXNwYXRj aGVyX25vZGUtPmxvY2FsLmZpbmFsaXplZCA9IDE7CisKKyAgICAgIC8qIFNl dCB0aGUgZGlzcGF0Y2hlciBmb3IgYWxsIHRoZSB2ZXJzaW9ucy4gICovCisg ICAgICBpdF92ID0gZGVmYXVsdF92ZXJzaW9uX2luZm87CisgICAgICB3aGls ZSAoaXRfdi0+bmV4dCAhPSBOVUxMKQorCXsKKwkgIGl0X3YtPmRpc3BhdGNo ZXJfcmVzb2x2ZXIgPSBkaXNwYXRjaF9kZWNsOworCSAgaXRfdiA9IGl0X3Yt Pm5leHQ7CisJfQogICAgIH0KLSNlbHNlCi0gIGVycm9yX2F0IChERUNMX1NP VVJDRV9MT0NBVElPTiAoZGVmYXVsdF9ub2RlLT5zeW1ib2wuZGVjbCksCi0J ICAgICJtdWx0aXZlcnNpb25pbmcgbmVlZHMgaWZ1bmMgd2hpY2ggaXMgbm90 IHN1cHBvcnRlZCAiCi0JICAgICJpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsK KyAgZWxzZQogI2VuZGlmCisgICAgeworICAgICAgZXJyb3JfYXQgKERFQ0xf U09VUkNFX0xPQ0FUSU9OIChkZWZhdWx0X25vZGUtPnN5bWJvbC5kZWNsKSwK KwkJIm11bHRpdmVyc2lvbmluZyBuZWVkcyBpZnVuYyB3aGljaCBpcyBub3Qg c3VwcG9ydGVkICIKKwkJIm9uIHRoaXMgdGFyZ2V0Iik7CisgICAgfQorCiAg IHJldHVybiBkaXNwYXRjaF9kZWNsOwogfQogCmRpZmYgLS1naXQgYS9nY2Mv Y29uZmlnL2xpbnV4LWFuZHJvaWQuYyBiL2djYy9jb25maWcvbGludXgtYW5k cm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3 Y2M1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2xpbnV4LWFu ZHJvaWQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBGdW5jdGlvbnMgZm9yIExp bnV4IEFuZHJvaWQgYXMgdGFyZ2V0IG1hY2hpbmUgZm9yIEdOVSBDIGNvbXBp bGVyLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0 LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDEwLCAyMDExLAorICAgMjAxMiwgMjAx My4KKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlz IGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQor YW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCithbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAg Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN5c3RlbS5o IgorI2luY2x1ZGUgImNvcmV0eXBlcy5oIgorI2luY2x1ZGUgInRtLmgiCisK Ky8qIEFuZHJvaWQgZG9lcyBub3Qgc3VwcG9ydCBHTlUgaW5kaXJlY3QgZnVu Y3Rpb25zLiAgKi8KKworYm9vbAorbGludXhfYW5kcm9pZF9oYXNfaWZ1bmNf cCAodm9pZCkKK3sKKyAgcmV0dXJuIFRBUkdFVF9BTkRST0lEID8gZmFsc2Ug OiBIQVZFX0dOVV9JTkRJUkVDVF9GVU5DVElPTjsKK30KZGlmZiAtLWdpdCBh L2djYy9jb25maWcvbGludXgtYW5kcm9pZC5oIGIvZ2NjL2NvbmZpZy9saW51 eC1hbmRyb2lkLmgKaW5kZXggZTc0ZTI2MS4uZDZhMmJiOCAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9saW51eC1hbmRyb2lkLmgKKysrIGIvZ2NjL2NvbmZp Zy9saW51eC1hbmRyb2lkLmgKQEAgLTU4LDMgKzU4LDYgQEAKIAogI2RlZmlu ZSBBTkRST0lEX0VOREZJTEVfU1BFQyBcCiAgICIle3NoYXJlZDogY3J0ZW5k X3NvJU8lczs6IGNydGVuZF9hbmRyb2lkJU8lc30iCisKKyN1bmRlZiBUQVJH RVRfSEFTX0lGVU5DX1AKKyNkZWZpbmUgVEFSR0VUX0hBU19JRlVOQ19QIGxp bnV4X2FuZHJvaWRfaGFzX2lmdW5jX3AKZGlmZiAtLWdpdCBhL2djYy9jb25m aWcvbGludXgtcHJvdG9zLmggYi9nY2MvY29uZmlnL2xpbnV4LXByb3Rvcy5o Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTFkMjgK LS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2xpbnV4LXByb3Rvcy5o CkBAIC0wLDAgKzEsMjIgQEAKKy8qIFByb3RvdHlwZXMuCisgICBDb3B5cmln aHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcsIDIw MDgsIDIwMTAsIDIwMTEsCisgICAyMDEyLCAyMDEzCisgICBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2Yg R0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9u LgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKzxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKK2V4dGVybiBib29s IGxpbnV4X2FuZHJvaWRfaGFzX2lmdW5jX3AgKHZvaWQpOwpkaWZmIC0tZ2l0 IGEvZ2NjL2NvbmZpZy90LWxpbnV4LWFuZHJvaWQgYi9nY2MvY29uZmlnL3Qt bGludXgtYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi42ZjliMDMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy90 LWxpbnV4LWFuZHJvaWQKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQg KEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgs IDIwMDksIDIwMTAsIDIwMTEsIDIwMTMKKyMgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4K KyMKKyMgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVy c2lvbi4KKyMKKyMgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisj IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKKyMgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4g IElmIG5vdCBzZWUKKyMgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgorCitsaW51eC1hbmRyb2lkLm86ICQoc3JjZGlyKS9jb25maWcvbGludXgt YW5kcm9pZC5jICQoQ09ORklHX0gpICQoU1lTVEVNX0gpIFwKKyAgY29yZXR5 cGVzLmggJChUTV9IKSAkKFRNX1BfSCkKKwkkKENPTVBJTEVSKSAtYyAkKEFM TF9DT01QSUxFUkZMQUdTKSAkKEFMTF9DUFBGTEFHUykgJChJTkNMVURFUykg XAorCQkkKHNyY2RpcikvY29uZmlnL2xpbnV4LWFuZHJvaWQuYwpkaWZmIC0t Z2l0IGEvZ2NjL2RvYy90bS50ZXhpIGIvZ2NjL2RvYy90bS50ZXhpCmluZGV4 IDc1YWE4NjcuLjQ4Y2M1MDcgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvdG0udGV4 aQorKysgYi9nY2MvZG9jL3RtLnRleGkKQEAgLTExMzQzLDMgKzExMzQzLDkg QEAgbWVtb3J5IG1vZGVsIGJpdHMgYXJlIGFsbG93ZWQuCiBAZGVmdHlwZXZy IHtUYXJnZXQgSG9va30ge3Vuc2lnbmVkIGNoYXJ9IFRBUkdFVF9BVE9NSUNf VEVTVF9BTkRfU0VUX1RSVUVWQUwKIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNl dCBpZiB0aGUgcmVzdWx0IHdyaXR0ZW4gYnkgQGNvZGV7YXRvbWljX3Rlc3Rf YW5kX3NldH0gaXMgbm90IGV4YWN0bHkgMSwgaS5lLiB0aGUgQGNvZGV7Ym9v bH0gQGNvZGV7dHJ1ZX0uCiBAZW5kIGRlZnR5cGV2cgorCitAZGVmdHlwZWZu IHtUYXJnZXQgSG9va30gYm9vbCBUQVJHRVRfSEFTX0lGVU5DX1AgKHZvaWQp CitJdCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBHTlUg aW5kaXJlY3QgZnVuY3Rpb25zLgorVGhlIHN1cHBvcnQgaW5jbHVkZXMgdGhl IGFzc2VtYmxlciwgbGlua2VyIGFuZCBkeW5hbWljIGxpbmtlci4KK1RoZSBk ZWZhdWx0IHZhbHVlIG9mIHRoaXMgaG9vayBpcyBiYXNlZCBvbiBob3N0J3Mg bGliYy4KK0BlbmQgZGVmdHlwZWZuCmRpZmYgLS1naXQgYS9nY2MvZG9jL3Rt LnRleGkuaW4gYi9nY2MvZG9jL3RtLnRleGkuaW4KaW5kZXggOTVmYWIxOC4u NDMyY2RjZiAxMDA2NDQKLS0tIGEvZ2NjL2RvYy90bS50ZXhpLmluCisrKyBi L2djYy9kb2MvdG0udGV4aS5pbgpAQCAtMTExNzksMyArMTExNzksNSBAQCBt ZW1vcnkgbW9kZWwgYml0cyBhcmUgYWxsb3dlZC4KIEBlbmQgZGVmdHlwZWZu CiAKIEBob29rIFRBUkdFVF9BVE9NSUNfVEVTVF9BTkRfU0VUX1RSVUVWQUwK KworQGhvb2sgVEFSR0VUX0hBU19JRlVOQ19QCmRpZmYgLS1naXQgYS9nY2Mv dGFyZ2V0LmRlZiBiL2djYy90YXJnZXQuZGVmCmluZGV4IGM1YmJmYWUuLmY4 ZGY2NzEgMTAwNjQ0Ci0tLSBhL2djYy90YXJnZXQuZGVmCisrKyBiL2djYy90 YXJnZXQuZGVmCkBAIC0xNTIwLDYgKzE1MjAsMTUgQEAgREVGSE9PSwogIGJv b2wsIChjb25zdF9ydHggeCksCiAgZGVmYXVsdF91c2VfYW5jaG9yc19mb3Jf c3ltYm9sX3ApCiAKKy8qIFRydWUgaWYgdGFyZ2V0IHN1cHBvcnRzIGluZGly ZWN0IGZ1bmN0aW9ucy4gICovCitERUZIT09LCisoaGFzX2lmdW5jX3AsCisg Ikl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIEdOVSBp bmRpcmVjdCBmdW5jdGlvbnMuXG5cCitUaGUgc3VwcG9ydCBpbmNsdWRlcyB0 aGUgYXNzZW1ibGVyLCBsaW5rZXIgYW5kIGR5bmFtaWMgbGlua2VyLlxuXAor VGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBob29rIGlzIGJhc2VkIG9uIGhv c3QncyBsaWJjLiIsCisgYm9vbCwgKHZvaWQpLAorIGRlZmF1bHRfaGF2ZV9p ZnVuY19wKQorCiAvKiBUcnVlIGlmIGl0IGlzIE9LIHRvIGRvIHNpYmxpbmcg Y2FsbCBvcHRpbWl6YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKICAgIGNhbGwg ZXhwcmVzc2lvbiBFWFAuICBERUNMIHdpbGwgYmUgdGhlIGNhbGxlZCBmdW5j dGlvbiwgb3IgTlVMTCBpZgogICAgdGhpcyBpcyBhbiBpbmRpcmVjdCBjYWxs LiAgKi8KZGlmZiAtLWdpdCBhL2djYy90YXJnaG9va3MuYyBiL2djYy90YXJn aG9va3MuYwppbmRleCA5NTRjZGI5Li4yYThjYWVjIDEwMDY0NAotLS0gYS9n Y2MvdGFyZ2hvb2tzLmMKKysrIGIvZ2NjL3Rhcmdob29rcy5jCkBAIC00NTEs NiArNDUxLDE0IEBAIGRlZmF1bHRfZml4ZWRfcG9pbnRfc3VwcG9ydGVkX3Ag KHZvaWQpCiAgIHJldHVybiBFTkFCTEVfRklYRURfUE9JTlQ7CiB9CiAKKy8q IFRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBHTlUgaW5kaXJlY3QgZnVu Y3Rpb25zLiAgKi8KKworYm9vbAorZGVmYXVsdF9oYXZlX2lmdW5jX3AgKHZv aWQpCit7CisgIHJldHVybiBIQVZFX0dOVV9JTkRJUkVDVF9GVU5DVElPTjsK K30KKwogLyogTlVMTCBpZiBJTlNOIGluc24gaXMgdmFsaWQgd2l0aGluIGEg bG93LW92ZXJoZWFkIGxvb3AsIG90aGVyd2lzZSByZXR1cm5zCiAgICBhbiBl cnJvciBtZXNzYWdlLgogCmRpZmYgLS1naXQgYS9nY2MvdGFyZ2hvb2tzLmgg Yi9nY2MvdGFyZ2hvb2tzLmgKaW5kZXggYmQ3ZDRiYy4uNmNiOTliYSAxMDA2 NDQKLS0tIGEvZ2NjL3Rhcmdob29rcy5oCisrKyBiL2djYy90YXJnaG9va3Mu aApAQCAtNzMsNiArNzMsOCBAQCBleHRlcm4gYm9vbCB0YXJnaG9va19mbG9h dF93b3Jkc19iaWdfZW5kaWFuICh2b2lkKTsKIGV4dGVybiBib29sIGRlZmF1 bHRfZGVjaW1hbF9mbG9hdF9zdXBwb3J0ZWRfcCAodm9pZCk7CiBleHRlcm4g Ym9vbCBkZWZhdWx0X2ZpeGVkX3BvaW50X3N1cHBvcnRlZF9wICh2b2lkKTsK IAorZXh0ZXJuIGJvb2wgZGVmYXVsdF9oYXZlX2lmdW5jX3AgKHZvaWQpOwor CiBleHRlcm4gY29uc3QgY2hhciAqIGRlZmF1bHRfaW52YWxpZF93aXRoaW5f ZG9sb29wIChjb25zdF9ydHgpOwogCiBleHRlcm4gdHJlZSBkZWZhdWx0X2J1 aWx0aW5fdmVjdG9yaXplZF9mdW5jdGlvbiAodHJlZSwgdHJlZSwgdHJlZSk7 CmRpZmYgLS1naXQgYS9nY2MvdmFyYXNtLmMgYi9nY2MvdmFyYXNtLmMKaW5k ZXggN2QwODNmZC4uZDliN2JiNyAxMDA2NDQKLS0tIGEvZ2NjL3ZhcmFzbS5j CisrKyBiL2djYy92YXJhc20uYwpAQCAtNTQ4OSwxNCArNTQ4OSwxNSBAQCBk b19hc3NlbWJsZV9hbGlhcyAodHJlZSBkZWNsLCB0cmVlIHRhcmdldCkKICAg ICB9CiAgIGlmIChsb29rdXBfYXR0cmlidXRlICgiaWZ1bmMiLCBERUNMX0FU VFJJQlVURVMgKGRlY2wpKSkKICAgICB7Ci0jaWYgZGVmaW5lZCAoQVNNX09V VFBVVF9UWVBFX0RJUkVDVElWRSkgJiYgSEFWRV9HTlVfSU5ESVJFQ1RfRlVO Q1RJT04KLSAgICAgIEFTTV9PVVRQVVRfVFlQRV9ESVJFQ1RJVkUKLQkoYXNt X291dF9maWxlLCBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfQVNTRU1CTEVS X05BTUUgKGRlY2wpKSwKLQkgSUZVTkNfQVNNX1RZUEUpOwotI2Vsc2UKLSAg ICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAoZGVjbCksCi0J CSJpZnVuYyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlndXJhdGlv biIpOworI2lmIGRlZmluZWQgKEFTTV9PVVRQVVRfVFlQRV9ESVJFQ1RJVkUp CisgICAgICBpZiAodGFyZ2V0bS5oYXNfaWZ1bmNfcCAoKSkKKwlBU01fT1VU UFVUX1RZUEVfRElSRUNUSVZFCisJICAoYXNtX291dF9maWxlLCBJREVOVElG SUVSX1BPSU5URVIgKERFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wpKSwKKwkg ICBJRlVOQ19BU01fVFlQRSk7CisgICAgICBlbHNlCiAjZW5kaWYKKwllcnJv cl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGRlY2wpLAorCQkgICJpZnVu YyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0Iik7CiAgICAgfQog CiAjIGlmZGVmIEFTTV9PVVRQVVRfREVGX0ZST01fREVDTFMK --f46d042ef565dc5f1904d2d94d1e--