From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by sourceware.org (Postfix) with ESMTPS id D1CD5385697F for ; Wed, 10 Aug 2022 17:25:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D1CD5385697F Received: by mail-qt1-x832.google.com with SMTP id h22so11733614qta.3 for ; Wed, 10 Aug 2022 10:25:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=beWUxYku/z/TmPfNdQWXud+YbZOMxevFuxykpjISWao=; b=cVHqWUh83Ton5ZAgz+x1/1dNxyUDTbKPxL462fyxIUOzIwGFSWhmZynOCyY1j0n/oo Obq9jA+7mLC5S72c1uTQL0YaeBfzuOt1tBDqLotuQl+I7zhsDEHq522Ua/Fryf3A83cg NsWf1UEOmky3Vyi6ir9n1Y/QxP1JWH8G0k4vELdFvyqtnLHt4Bo2Sv8C4GkiBf36+wIa 6eMLIIv+u8tesw7CBdp2vx//bQqU6pDiBIg46DjQrNrMs+KIBeNeYOPup+F3qFCAudOc YMU6I1ILRD+IN9okzjdXl9lMQgp3uaWThgir72h4YFF8KHyLuXGeKiBxgUzEXeelv/Y2 voTg== X-Gm-Message-State: ACgBeo3+l9XRE9akxws8b6YCUEeSS0OCgCj9zRw5WWseTguU8bKiOxmr eUKhp9EvEvic0Jt68ds7baZOe/GJ7U4YuEwlRyDuWTJwyPU= X-Google-Smtp-Source: AA6agR5eJI6v/AJmAAkGGX4LYxof2GNaSlol0L6JEk/LDNfV9O7KF1ZjymWvyjCZ531mdHiLMvNgpDaF7CiFj++jdpg= X-Received: by 2002:ac8:7f02:0:b0:342:fdf7:b667 with SMTP id f2-20020ac87f02000000b00342fdf7b667mr11255486qtk.437.1660152311984; Wed, 10 Aug 2022 10:25:11 -0700 (PDT) MIME-Version: 1.0 References: <20220810154028.662395-1-adhemerval.zanella@linaro.org> In-Reply-To: <20220810154028.662395-1-adhemerval.zanella@linaro.org> From: "H.J. Lu" Date: Wed, 10 Aug 2022 10:24:36 -0700 Message-ID: Subject: Re: [PATCH v2] elf: Remove -fno-tree-loop-distribute-patterns usage on dl-support To: Adhemerval Zanella Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3023.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Aug 2022 17:25:15 -0000 On Wed, Aug 10, 2022 at 8:40 AM Adhemerval Zanella wrote: > > Besides the option being gcc specific, this approach is still fragile > and not future proof since we do not if this will be the only > optimization option gcc will add that transform loops to memset > (or any libcall). > > This patch add a new header dl-symbol-hacks.h that can be used to > redirect the compiler generated libcalls to port specific string > implementatation if required (defined by dl-ifunc-generic.h). > > Checked on x86_64-linux-gnu and aarch64-linux-gnu. > --- > elf/Makefile | 5 --- > elf/dl-support.c | 1 + > elf/dl-symbol-hacks.h | 31 ++++++++++++++++ > elf/dl-tunables.c | 1 + > sysdeps/generic/dl-ifunc-generic.h | 37 +++++++++++++++++++ > .../sysv/linux/aarch64/dl-ifunc-generic.h | 24 ++++++++++++ > .../unix/sysv/linux/i386/dl-ifunc-generic.h | 26 +++++++++++++ > .../sysv/linux/powerpc/dl-ifunc-generic.h | 28 ++++++++++++++ > .../unix/sysv/linux/s390/dl-ifunc-generic.h | 31 ++++++++++++++++ > .../unix/sysv/linux/sparc/dl-ifunc-generic.h | 26 +++++++++++++ > .../unix/sysv/linux/x86_64/dl-ifunc-generic.h | 32 ++++++++++++++++ > 11 files changed, 237 insertions(+), 5 deletions(-) > create mode 100644 elf/dl-symbol-hacks.h > create mode 100644 sysdeps/generic/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/aarch64/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/i386/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/powerpc/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/s390/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/sparc/dl-ifunc-generic.h > create mode 100644 sysdeps/unix/sysv/linux/x86_64/dl-ifunc-generic.h > > diff --git a/elf/Makefile b/elf/Makefile > index 3386f0ce77..4b992bd348 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -162,11 +162,6 @@ ifeq (yes,$(have-loop-to-function)) > CFLAGS-rtld.c += -fno-tree-loop-distribute-patterns > endif > > -ifeq (yes,$(have-loop-to-function)) > -# Likewise, during static library startup, memset is not yet available. > -CFLAGS-dl-support.c = -fno-tree-loop-distribute-patterns > -endif > - > # Compile rtld itself without stack protection. > # Also compile all routines in the static library that are elided from > # the shared libc because they are in libc.a in the same way. > diff --git a/elf/dl-support.c b/elf/dl-support.c > index 4af0b5b2ce..6d1996ae6e 100644 > --- a/elf/dl-support.c > +++ b/elf/dl-support.c > @@ -44,6 +44,7 @@ > #include > #include > #include > +#include > > extern char *__progname; > char **_dl_argv = &__progname; /* This is checked for some error messages. */ > diff --git a/elf/dl-symbol-hacks.h b/elf/dl-symbol-hacks.h > new file mode 100644 > index 0000000000..6b9d24ed03 > --- /dev/null > +++ b/elf/dl-symbol-hacks.h > @@ -0,0 +1,31 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_SYMBOL_HACKS_H > +#define _DL_SYMBOL_HACKS_H > + > +#include > + > +/* Some compiler optimizations may transform loops into memset/memmove > + calls and without proper redirection it might call PLT throught > + ifunc without relocations being processed. */ > +#if !IS_IN(rtld) && defined HAVE_MEMSET_IFUNC_GENERIC > +asm ("memset = " HAVE_MEMSET_IFUNC_GENERIC); > +#endif > + > +#endif > diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c > index 8e7ee9df10..c797484522 100644 > --- a/elf/dl-tunables.c > +++ b/elf/dl-tunables.c > @@ -32,6 +32,7 @@ > #include > #include > #include > +#include > > #define TUNABLES_INTERNAL 1 > #include "dl-tunables.h" > diff --git a/sysdeps/generic/dl-ifunc-generic.h b/sysdeps/generic/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..5e1d5c1fd8 > --- /dev/null > +++ b/sysdeps/generic/dl-ifunc-generic.h > @@ -0,0 +1,37 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +/* The compiler might optimize loops or other constructs to library calls even > + in freestanding mode. Although it is safe in most scenarios, on program > + loading and static startup, iFUNC resolution might require other dynamic > + relocation that are not yet done. > + > + Instead of adding per-file compiler flags to avoid the libcall generation, > + this header defines generic symbols that will be routed instead of the > + default symbols name. > + > + Each port can then define the following macro to the expected generic > + implementation if the symbol is provided as iFUNC: > + > + HAVE_MEMSET_IFUNC_GENERIC - the generic memset call. > + */ > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/aarch64/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..1278a06ff0 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/aarch64/dl-ifunc-generic.h > @@ -0,0 +1,24 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +#define HAVE_MEMSET_IFUNC_GENERIC "__memset_generic" > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/i386/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/i386/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..c8e294b3c9 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/i386/dl-ifunc-generic.h > @@ -0,0 +1,26 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +#ifdef USE_MULTIARCH > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_ia32" > +#endif > + > +#endif This file should be in sysdeps/i386/i686/multiarch. > diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/powerpc/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..b0f9401670 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/powerpc/dl-ifunc-generic.h > @@ -0,0 +1,28 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +/* powerpc and powerpc64 provides the default memset as 'memset', so > + no need to redirect it. */ > +#if defined USE_MULTIARCH && defined __powerpc64__ && _CALL_ELF != 2 > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_power8" > +#endif > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/s390/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/s390/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..f664ac07a7 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/s390/dl-ifunc-generic.h > @@ -0,0 +1,31 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +#ifdef USE_MULTIARCH > +# include > + > +# define IFUNC_SYMBOL_STR1(s) #s > +# define IFUNC_SYMBOL_STR(s) IFUNC_SYMBOL_STR1(s) > + > +# define HAVE_MEMSET_IFUNC_GENERIC IFUNC_SYMBOL_STR(MEMSET_DEFAULT) > +#endif > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/sparc/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/sparc/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..86815317a9 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/sparc/dl-ifunc-generic.h > @@ -0,0 +1,26 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +#ifdef USE_MULTIARCH > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_ultra1" > +#endif > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/x86_64/dl-ifunc-generic.h b/sysdeps/unix/sysv/linux/x86_64/dl-ifunc-generic.h > new file mode 100644 > index 0000000000..7b7cf1c3d6 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86_64/dl-ifunc-generic.h > @@ -0,0 +1,32 @@ > +/* Symbol rediretion for loader/static initialization code. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#ifndef _DL_IFUNC_GENERIC_H > +#define _DL_IFUNC_GENERIC_H > + > +#include > + > +#if MINIMUM_X86_ISA_LEVEL >= 4 > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_evex_unaligned" > +#elif MINIMUM_X86_ISA_LEVEL == 3 > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_avx2_unaligned" > +#else > +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_sse2_unaligned" > +#endif > + > +#endif > -- > 2.34.1 > This file should be in sysdeps/x86_64/multiarch and the generic memset should follow sysdeps/x86_64/memset.S: #define DEFAULT_IMPL_V1 "multiarch/memset-sse2-unaligned-erms.S" #define DEFAULT_IMPL_V3 "multiarch/memset-avx2-unaligned-erms.S" #define DEFAULT_IMPL_V4 "multiarch/memset-evex-unaligned-erms.S" -- H.J.