From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1791) id 386E83888C45; Thu, 31 Mar 2022 19:11:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 386E83888C45 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Adhemerval Zanella To: glibc-cvs@sourceware.org Subject: [glibc/azanella/clang] elf: Remove -fno-tree-loop-distribute-patterns usage on dl-support X-Act-Checkin: glibc X-Git-Author: Adhemerval Zanella X-Git-Refname: refs/heads/azanella/clang X-Git-Oldrev: 1230f63d29c58cd1f62dd5869ec3bfaa30c5e632 X-Git-Newrev: 4e0afb0249236fd8c7339ab45778d7373abd5268 Message-Id: <20220331191120.386E83888C45@sourceware.org> Date: Thu, 31 Mar 2022 19:11:20 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Mar 2022 19:11:20 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4e0afb0249236fd8c7339ab45778d7373abd5268 commit 4e0afb0249236fd8c7339ab45778d7373abd5268 Author: Adhemerval Zanella Date: Wed Mar 30 09:23:35 2022 -0300 elf: Remove -fno-tree-loop-distribute-patterns usage on dl-support Besides the option being gcc specific, his approach is still fragile since we don't how if this will be the only optimization option gcc will make loops to memset. Instead, it adds a __memset_generic internal symbol on all ports to avoid the iFUNC plt and a symbol redirection to header to include on TU that required it. Diff: --- elf/Makefile | 5 ---- elf/dl-support.c | 1 + elf/dl-symbol-hacks.h | 29 ++++++++++++++++++++++ include/math.h | 6 ----- intl/l10nflist.c | 2 +- string/memset.c | 1 + sysdeps/alpha/memset.S | 1 + sysdeps/arm/memset.S | 1 + sysdeps/csky/abiv2/memset.S | 1 + sysdeps/ia64/memset.S | 1 + sysdeps/mips/memset.S | 1 + sysdeps/powerpc/powerpc32/memset.S | 1 + sysdeps/powerpc/powerpc32/power4/memset.S | 1 + .../powerpc32/power4/multiarch/memset-ppc32.S | 1 + sysdeps/powerpc/powerpc32/power6/memset.S | 1 + sysdeps/powerpc/powerpc32/power7/memset.S | 1 + sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S | 1 + sysdeps/powerpc/powerpc64/power4/memset.S | 1 + sysdeps/powerpc/powerpc64/power6/memset.S | 1 + sysdeps/powerpc/powerpc64/power7/memset.S | 1 + sysdeps/powerpc/powerpc64/power8/memset.S | 1 + sysdeps/sh/memset.S | 1 + .../sparc32/sparcv9/multiarch/memset-ultra1.S | 1 + sysdeps/sparc/sparc64/multiarch/memset-ultra1.S | 1 + .../x86_64/multiarch/memmove-sse2-unaligned-erms.S | 5 ++++ .../x86_64/multiarch/memset-sse2-unaligned-erms.S | 1 + 26 files changed, 56 insertions(+), 12 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 724e35f0c4..5a2c921829 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -160,11 +160,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 153dd57ad2..7066c4e3d5 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -45,6 +45,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..b8caccb570 --- /dev/null +++ b/elf/dl-symbol-hacks.h @@ -0,0 +1,29 @@ +/* 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 + +/* Some compiler optimizations may transform loops into memset/memmove + calls and without proper redirection it might call PLT throught + ifunc without relocations being processed. */ +#ifndef SHARED +asm ("memset = __memset_generic"); +#endif + +#endif diff --git a/include/math.h b/include/math.h index fa11a710a6..03cc614d51 100644 --- a/include/math.h +++ b/include/math.h @@ -122,12 +122,6 @@ __isinff128 (_Float128 x) return ~(lx >> 63) & (hx >> 62); } # endif - -extern inline _Float128 -fabsf128 (_Float128 x) -{ - return __builtin_fabsf128 (x); -} # endif # if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0) diff --git a/intl/l10nflist.c b/intl/l10nflist.c index 078a450dfe..1945d3f873 100644 --- a/intl/l10nflist.c +++ b/intl/l10nflist.c @@ -210,7 +210,7 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, } *cp++ = '/'; - stpcpy (cp, filename); + strcpy (cp, filename); /* Look in list of already loaded domains whether it is already available. */ diff --git a/string/memset.c b/string/memset.c index 1303dd7ad3..b98bad7095 100644 --- a/string/memset.c +++ b/string/memset.c @@ -88,3 +88,4 @@ MEMSET (void *dstpp, int c, size_t len) return dstpp; } libc_hidden_builtin_def (MEMSET) +strong_alias (MEMSET, __memset_generic) diff --git a/sysdeps/alpha/memset.S b/sysdeps/alpha/memset.S index 9249663d37..c5adae754b 100644 --- a/sysdeps/alpha/memset.S +++ b/sysdeps/alpha/memset.S @@ -124,3 +124,4 @@ $done: ret cfi_endproc libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/arm/memset.S b/sysdeps/arm/memset.S index 9c05669864..9b9a3cb264 100644 --- a/sysdeps/arm/memset.S +++ b/sysdeps/arm/memset.S @@ -66,3 +66,4 @@ ENTRY(memset) DO_RET(lr) END(memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/csky/abiv2/memset.S b/sysdeps/csky/abiv2/memset.S index 41df8e2bb8..7e23edc787 100644 --- a/sysdeps/csky/abiv2/memset.S +++ b/sysdeps/csky/abiv2/memset.S @@ -96,3 +96,4 @@ END (memset) libc_hidden_builtin_def (memset) .weak memset +strong_alias (memset, __memset_generic) diff --git a/sysdeps/ia64/memset.S b/sysdeps/ia64/memset.S index d52f23dd93..70ad1140b8 100644 --- a/sysdeps/ia64/memset.S +++ b/sysdeps/ia64/memset.S @@ -395,3 +395,4 @@ store_words: ;; } END(memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/mips/memset.S b/sysdeps/mips/memset.S index c5ffab1d8c..cb5c9a140f 100644 --- a/sysdeps/mips/memset.S +++ b/sysdeps/mips/memset.S @@ -424,3 +424,4 @@ END(MEMSET_NAME) libc_hidden_builtin_def (MEMSET_NAME) # endif #endif +strong_alias(MEMSET_NAME, __memset_generic) diff --git a/sysdeps/powerpc/powerpc32/memset.S b/sysdeps/powerpc/powerpc32/memset.S index c125934f55..63ad3d2d2b 100644 --- a/sysdeps/powerpc/powerpc32/memset.S +++ b/sysdeps/powerpc/powerpc32/memset.S @@ -302,3 +302,4 @@ L(handletail32): END (memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc32/power4/memset.S b/sysdeps/powerpc/powerpc32/power4/memset.S index 40b140c841..98811c1a66 100644 --- a/sysdeps/powerpc/powerpc32/power4/memset.S +++ b/sysdeps/powerpc/powerpc32/power4/memset.S @@ -224,3 +224,4 @@ L(medium_28t): blr END (memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/memset-ppc32.S b/sysdeps/powerpc/powerpc32/power4/multiarch/memset-ppc32.S index 0937ba2215..4c5724bc60 100644 --- a/sysdeps/powerpc/powerpc32/power4/multiarch/memset-ppc32.S +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/memset-ppc32.S @@ -39,3 +39,4 @@ #endif #include +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc32/power6/memset.S b/sysdeps/powerpc/powerpc32/power6/memset.S index d86701ff7c..5f4c8518bd 100644 --- a/sysdeps/powerpc/powerpc32/power6/memset.S +++ b/sysdeps/powerpc/powerpc32/power6/memset.S @@ -537,3 +537,4 @@ L(medium_28t): blr END (memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc32/power7/memset.S b/sysdeps/powerpc/powerpc32/power7/memset.S index 368e8b3939..68a6ec18d8 100644 --- a/sysdeps/powerpc/powerpc32/power7/memset.S +++ b/sysdeps/powerpc/powerpc32/power7/memset.S @@ -428,3 +428,4 @@ L(small): END (memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S index 30b25ef15f..91b9775edd 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S +++ b/sysdeps/powerpc/powerpc64/multiarch/memset-ppc64.S @@ -26,3 +26,4 @@ #endif #include +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc64/power4/memset.S b/sysdeps/powerpc/powerpc64/power4/memset.S index 0f14a5198a..91557f0442 100644 --- a/sysdeps/powerpc/powerpc64/power4/memset.S +++ b/sysdeps/powerpc/powerpc64/power4/memset.S @@ -237,3 +237,4 @@ L(medium_28t): blr END_GEN_TB (MEMSET,TB_TOCLESS) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc64/power6/memset.S b/sysdeps/powerpc/powerpc64/power6/memset.S index 140a756348..29ec7f200f 100644 --- a/sysdeps/powerpc/powerpc64/power6/memset.S +++ b/sysdeps/powerpc/powerpc64/power6/memset.S @@ -381,3 +381,4 @@ L(medium_28t): blr END_GEN_TB (MEMSET,TB_TOCLESS) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc64/power7/memset.S b/sysdeps/powerpc/powerpc64/power7/memset.S index 358199a805..1afeaf754d 100644 --- a/sysdeps/powerpc/powerpc64/power7/memset.S +++ b/sysdeps/powerpc/powerpc64/power7/memset.S @@ -384,3 +384,4 @@ L(small): END_GEN_TB (MEMSET,TB_TOCLESS) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/powerpc/powerpc64/power8/memset.S b/sysdeps/powerpc/powerpc64/power8/memset.S index 70cace14ef..73676cdb88 100644 --- a/sysdeps/powerpc/powerpc64/power8/memset.S +++ b/sysdeps/powerpc/powerpc64/power8/memset.S @@ -504,3 +504,4 @@ L(LE7_tail5): END_GEN_TB (MEMSET,TB_TOCLESS) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/sh/memset.S b/sysdeps/sh/memset.S index 7852b472eb..fc36bc836a 100644 --- a/sysdeps/sh/memset.S +++ b/sysdeps/sh/memset.S @@ -84,3 +84,4 @@ L_byte_exit: mov r7,r0 END(memset) libc_hidden_builtin_def (memset) +strong_alias (memset, __memset_generic) diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S index 2dda6f1ed6..e5082fa161 100644 --- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S @@ -27,3 +27,4 @@ # define memset __memset_ultra1 # include #endif +strong_alias (__memset_ultra1, __memset_generic) diff --git a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S index 3c3add791e..478a106c83 100644 --- a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S +++ b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S @@ -27,3 +27,4 @@ # define memset __memset_ultra1 # include #endif +strong_alias (__memset_ultra1, __memset_generic) diff --git a/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S index 09e7c1d6cd..b7b7e01a5e 100644 --- a/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S +++ b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S @@ -31,3 +31,8 @@ weak_alias (__mempcpy, mempcpy) compat_symbol (libc, __memmove_sse2_unaligned, memcpy, GLIBC_2_2_5); # endif #endif + +#ifndef SHARED +strong_alias (__mempcpy_sse2_unaligned, __memcpy_generic) +strong_alias (__memmove_sse2_unaligned, __memmove_generic) +#endif diff --git a/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S index d52d170804..bbbb82ab3b 100644 --- a/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S +++ b/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S @@ -29,6 +29,7 @@ # undef libc_hidden_builtin_def # define libc_hidden_builtin_def(name) # endif +strong_alias (__memset_sse2_unaligned, __memset_generic) # undef weak_alias # define weak_alias(original, alias)