From patchwork Fri Nov 9 18:13:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Sebor X-Patchwork-Id: 30095 Received: (qmail 84478 invoked by alias); 9 Nov 2018 18:13:27 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 84442 invoked by uid 89); 9 Nov 2018 18:13:26 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.2 spammy=thousand X-HELO: mail-qk1-f169.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version; bh=xtf4pP1sYQpC+qkTi4kH7ikLdzncv+Hh2sx3Ixf8Xa4=; b=JL0XeF3H8EBNvmm2XdH4iL8UOhZtqqn2S6pnP2HXZhLS+5zKLM9jz9ULsBLNseNucF 0m3ZjIkMxcPA0Kbcoc/7WH2lFiQX8KcEKLLa3qm2OF9GC11BqVo0gvY0JtiRl3CPddeg z54exWqLQ43awQ/oBTd057+YI1K1gmDoJ/N51h59QuyC5VBxHbQSlIsNmCk4lwQbSslq /TbpY/PjV62ODeD66xVlfBqsZ29q+/l8TewMv/NxLxjVOtWKTVZy52KR0U7yUOkmTYv0 bz1zyPfQeK2J2whxzdabp1s69OHDhBXwdmKYM5tqhvJa2raD81qUk5A2JRFCyYvZKSY4 5P1g== Return-Path: To: GNU C Library , Joseph Myers From: Martin Sebor Subject: [PATCH] add support for GCC 9 attribute copy Message-ID: Date: Fri, 9 Nov 2018 11:13:19 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 GCC 9 has just gained an enhancement to help detect attribute mismatches between alias declarations and their targets. It consists of a new warning, -Wattribute-alias, an enhancement to an existing warning, -Wmissing-attributes, and a new attribute called copy. The purpose of the warnings is to help identify either possible bugs (an alias declared with more restrictive attributes than its target promises) or optimization or diagnostic opportunities (an alias target missing some attributes that it could be declared with that might benefit analysis and code generation). The purpose of the new attribute is to easily apply (almost) the same set of attributes to one declaration as those already present on another. As expected (and intended) the enhancement triggers warnings for many alias declarations in Glibc code. Attached is a patch I tested with a recent Glibc to avoid all instances of the new warnings (I did no testing beyond recompiling Glibc with it). I post the patch here to help prevent failures in Glibc nightly builds due to -Werror. To fully benefit from the enhancement Glibc will need to be compiled with -Wattribute-alias=2 and remaining warnings reviewed and dealt with (IIRC, there are a couple of thousand but most should be straightforward to deal with). If there's something I can do to help make the GCC enhancement more useful please let me know. Martin PS For the background on this feature see GCC pr81824: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81824 include/ChangeLog: * libc-symbols.h (__attribute_copy__): Define macro unless it's already defined. (_strong_alias): Use __attribute_copy__. (_weak_alias, __hidden_ver1, __hidden_nolink2): Same. * misc/sys/cdefs.h (__attribute_copy__): New macro. * sysdeps/x86_64/multiarch/memchr.c (memchr): Use __attribute_copy__. * sysdeps/x86_64/multiarch/memcmp.c (memcmp): Same. * sysdeps/x86_64/multiarch/mempcpy.c (mempcpy): Same. * sysdeps/x86_64/multiarch/memset.c (memset): Same. * sysdeps/x86_64/multiarch/stpcpy.c (stpcpy): Same. * sysdeps/x86_64/multiarch/strcat.c (strcat): Same. * sysdeps/x86_64/multiarch/strchr.c (strchr): Same. * sysdeps/x86_64/multiarch/strcmp.c (strcmp): Same. * sysdeps/x86_64/multiarch/strcpy.c (strcpy): Same. * sysdeps/x86_64/multiarch/strcspn.c (strcspn): Same. * sysdeps/x86_64/multiarch/strlen.c (strlen): Same. * sysdeps/x86_64/multiarch/strncmp.c (strncmp): Same. * sysdeps/x86_64/multiarch/strncpy.c (strncpy): Same. * sysdeps/x86_64/multiarch/strnlen.c (strnlen): Same. * sysdeps/x86_64/multiarch/strpbrk.c (strpbrk): Same. * sysdeps/x86_64/multiarch/strrchr.c (strrchr): Same. * sysdeps/x86_64/multiarch/strspn.c (strspn): Same. diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 8b9273c..e71a479 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -125,6 +125,11 @@ # define ASM_LINE_SEP ; #endif +#ifndef __attribute_copy__ +/* Provide an empty definition when cdefs.h is not included. */ +# define __attribute_copy__(arg) +#endif + #ifndef __ASSEMBLER__ /* GCC understands weak symbols and aliases; use its interface where possible, instead of embedded assembly language. */ @@ -132,7 +137,8 @@ /* Define ALIASNAME as a strong alias for NAME. */ # define strong_alias(name, aliasname) _strong_alias(name, aliasname) # define _strong_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((alias (#name))); + extern __typeof (name) aliasname __attribute__ ((alias (#name))) \ + __attribute_copy__ (name); /* This comes between the return type and function name in a function definition to make that definition weak. */ @@ -143,14 +149,16 @@ If weak aliases are not available, this defines a strong alias. */ # define weak_alias(name, aliasname) _weak_alias (name, aliasname) # define _weak_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); + extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))) \ + __attribute_copy__ (name); /* Same as WEAK_ALIAS, but mark symbol as hidden. */ # define weak_hidden_alias(name, aliasname) \ _weak_hidden_alias (name, aliasname) # define _weak_hidden_alias(name, aliasname) \ extern __typeof (name) aliasname \ - __attribute__ ((weak, alias (#name), __visibility__ ("hidden"))); + __attribute__ ((weak, alias (#name), __visibility__ ("hidden"))) \ + __attribute_copy__ (name); /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */ # define weak_extern(symbol) _weak_extern (weak symbol) @@ -532,7 +540,8 @@ for linking") # define __hidden_ver1(local, internal, name) \ extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \ extern __typeof (name) __EI_##name \ - __attribute__((alias (__hidden_asmname (#local)))) + __attribute__((alias (__hidden_asmname (#local)))) \ + __attribute_copy__ (name) # define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name); # define hidden_data_ver(local, name) hidden_ver(local, name) # define hidden_def(name) __hidden_ver1(__GI_##name, name, name); @@ -545,7 +554,8 @@ for linking") # define __hidden_nolink1(local, internal, name, version) \ __hidden_nolink2 (local, internal, name, version) # define __hidden_nolink2(local, internal, name, version) \ - extern __typeof (name) internal __attribute__ ((alias (#local))); \ + extern __typeof (name) internal __attribute__ ((alias (#local))) \ + __attribute_copy__ (name); \ __hidden_nolink3 (local, internal, #name "@" #version) # define __hidden_nolink3(local, internal, vername) \ __asm__ (".symver " #internal ", " vername); diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 3f6fe3c..8d58568 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -431,6 +431,16 @@ # define __attribute_nonstring__ #endif +/* Undefine (also defined in libc-symbols.h). */ +#undef __attribute_copy__ +#if __GNUC_PREREQ (9, 0) +/* Copies attributes from the declaration or type referenced by + the argument. */ +# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg))) +#else +# define __attribute_copy__(arg) +#endif + #if (!defined _Static_assert && !defined __cplusplus \ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \ && (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__)) diff --git a/sysdeps/x86_64/multiarch/memchr.c b/sysdeps/x86_64/multiarch/memchr.c index 016f578..ce2e69c 100644 --- a/sysdeps/x86_64/multiarch/memchr.c +++ b/sysdeps/x86_64/multiarch/memchr.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_memchr, memchr, IFUNC_SELECTOR ()); strong_alias (memchr, __memchr) # ifdef SHARED __hidden_ver1 (memchr, __GI_memchr, __redirect_memchr) - __attribute__((visibility ("hidden"))); +__attribute__((visibility ("hidden"))) __attribute_copy__ (memchr); # endif #endif diff --git a/sysdeps/x86_64/multiarch/memcmp.c b/sysdeps/x86_64/multiarch/memcmp.c index 6f3ca43..bbd3b01 100644 --- a/sysdeps/x86_64/multiarch/memcmp.c +++ b/sysdeps/x86_64/multiarch/memcmp.c @@ -32,6 +32,6 @@ weak_alias (memcmp, bcmp) # ifdef SHARED __hidden_ver1 (memcmp, __GI_memcmp, __redirect_memcmp) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (memcmp); # endif #endif diff --git a/sysdeps/x86_64/multiarch/mempcpy.c b/sysdeps/x86_64/multiarch/mempcpy.c index 9fe41dd..d2f7928 100644 --- a/sysdeps/x86_64/multiarch/mempcpy.c +++ b/sysdeps/x86_64/multiarch/mempcpy.c @@ -35,8 +35,8 @@ libc_ifunc_redirected (__redirect_mempcpy, __mempcpy, IFUNC_SELECTOR ()); weak_alias (__mempcpy, mempcpy) # ifdef SHARED __hidden_ver1 (__mempcpy, __GI___mempcpy, __redirect___mempcpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (mempcpy); __hidden_ver1 (mempcpy, __GI_mempcpy, __redirect_mempcpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (mempcpy); # endif #endif diff --git a/sysdeps/x86_64/multiarch/memset.c b/sysdeps/x86_64/multiarch/memset.c index 064841d..87246dd 100644 --- a/sysdeps/x86_64/multiarch/memset.c +++ b/sysdeps/x86_64/multiarch/memset.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_memset, memset, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (memset, __GI_memset, __redirect_memset) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (memset); # endif #endif diff --git a/sysdeps/x86_64/multiarch/stpcpy.c b/sysdeps/x86_64/multiarch/stpcpy.c index 1e340fc..f74a54b 100644 --- a/sysdeps/x86_64/multiarch/stpcpy.c +++ b/sysdeps/x86_64/multiarch/stpcpy.c @@ -35,8 +35,8 @@ libc_ifunc_redirected (__redirect_stpcpy, __stpcpy, IFUNC_SELECTOR ()); weak_alias (__stpcpy, stpcpy) # ifdef SHARED __hidden_ver1 (__stpcpy, __GI___stpcpy, __redirect___stpcpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (stpcpy); __hidden_ver1 (stpcpy, __GI_stpcpy, __redirect_stpcpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (stpcpy); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strcat.c b/sysdeps/x86_64/multiarch/strcat.c index 1f7f626..1922c0a 100644 --- a/sysdeps/x86_64/multiarch/strcat.c +++ b/sysdeps/x86_64/multiarch/strcat.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strcat, strcat, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strcat, __GI_strcat, __redirect_strcat) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strcat); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strchr.c b/sysdeps/x86_64/multiarch/strchr.c index 76d64fb..87e99ba 100644 --- a/sysdeps/x86_64/multiarch/strchr.c +++ b/sysdeps/x86_64/multiarch/strchr.c @@ -50,6 +50,6 @@ libc_ifunc_redirected (__redirect_strchr, strchr, IFUNC_SELECTOR ()); weak_alias (strchr, index) # ifdef SHARED __hidden_ver1 (strchr, __GI_strchr, __redirect_strchr) - __attribute__((visibility ("hidden"))); + __attribute__((visibility ("hidden"))) __attribute_copy__ (strchr); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strcmp.c b/sysdeps/x86_64/multiarch/strcmp.c index b903e41..e3cf39d 100644 --- a/sysdeps/x86_64/multiarch/strcmp.c +++ b/sysdeps/x86_64/multiarch/strcmp.c @@ -54,6 +54,6 @@ libc_ifunc_redirected (__redirect_strcmp, strcmp, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strcmp, __GI_strcmp, __redirect_strcmp) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strcmp); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strcpy.c b/sysdeps/x86_64/multiarch/strcpy.c index 12e0e3f..838d916 100644 --- a/sysdeps/x86_64/multiarch/strcpy.c +++ b/sysdeps/x86_64/multiarch/strcpy.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strcpy, strcpy, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strcpy, __GI_strcpy, __redirect_strcpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strcpy); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strcspn.c b/sysdeps/x86_64/multiarch/strcspn.c index 9712e84..9d96526 100644 --- a/sysdeps/x86_64/multiarch/strcspn.c +++ b/sysdeps/x86_64/multiarch/strcspn.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strcspn, strcspn, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strcspn, __GI_strcspn, __redirect_strcspn) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strcspn); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strlen.c b/sysdeps/x86_64/multiarch/strlen.c index 1758d22..0860083 100644 --- a/sysdeps/x86_64/multiarch/strlen.c +++ b/sysdeps/x86_64/multiarch/strlen.c @@ -29,6 +29,6 @@ libc_ifunc_redirected (__redirect_strlen, strlen, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strlen, __GI_strlen, __redirect_strlen) - __attribute__((visibility ("hidden"))); + __attribute__((visibility ("hidden"))) __attribute_copy__ (strlen); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strncmp.c b/sysdeps/x86_64/multiarch/strncmp.c index 02b6d0b..32f5c6c 100644 --- a/sysdeps/x86_64/multiarch/strncmp.c +++ b/sysdeps/x86_64/multiarch/strncmp.c @@ -55,6 +55,6 @@ libc_ifunc_redirected (__redirect_strncmp, strncmp, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strncmp, __GI_strncmp, __redirect_strncmp) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strncmp); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strncpy.c b/sysdeps/x86_64/multiarch/strncpy.c index 3c3de8b..3201f0f 100644 --- a/sysdeps/x86_64/multiarch/strncpy.c +++ b/sysdeps/x86_64/multiarch/strncpy.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strncpy, strncpy, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strncpy, __GI_strncpy, __redirect_strncpy) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strncpy); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strnlen.c b/sysdeps/x86_64/multiarch/strnlen.c index 3ab94ce..9d64335 100644 --- a/sysdeps/x86_64/multiarch/strnlen.c +++ b/sysdeps/x86_64/multiarch/strnlen.c @@ -32,8 +32,8 @@ libc_ifunc_redirected (__redirect_strnlen, __strnlen, IFUNC_SELECTOR ()); weak_alias (__strnlen, strnlen); # ifdef SHARED __hidden_ver1 (__strnlen, __GI___strnlen, __redirect___strnlen) - __attribute__((visibility ("hidden"))); + __attribute__((visibility ("hidden"))) __attribute_copy__ (strnlen); __hidden_ver1 (strnlen, __GI_strnlen, __redirect_strnlen) - __attribute__((weak, visibility ("hidden"))); + __attribute__((weak, visibility ("hidden"))) __attribute_copy__ (strnlen); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strpbrk.c b/sysdeps/x86_64/multiarch/strpbrk.c index a0d435a..f110367 100644 --- a/sysdeps/x86_64/multiarch/strpbrk.c +++ b/sysdeps/x86_64/multiarch/strpbrk.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strpbrk, strpbrk, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strpbrk, __GI_strpbrk, __redirect_strpbrk) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strpbrk); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strrchr.c b/sysdeps/x86_64/multiarch/strrchr.c index a719edd..ba7458a 100644 --- a/sysdeps/x86_64/multiarch/strrchr.c +++ b/sysdeps/x86_64/multiarch/strrchr.c @@ -29,6 +29,6 @@ libc_ifunc_redirected (__redirect_strrchr, strrchr, IFUNC_SELECTOR ()); weak_alias (strrchr, rindex); # ifdef SHARED __hidden_ver1 (strrchr, __GI_strrchr, __redirect_strrchr) - __attribute__((visibility ("hidden"))); + __attribute__((visibility ("hidden"))) __attribute_copy__ (strrchr); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strspn.c b/sysdeps/x86_64/multiarch/strspn.c index 56ab4d9..8b80bdc 100644 --- a/sysdeps/x86_64/multiarch/strspn.c +++ b/sysdeps/x86_64/multiarch/strspn.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strspn, strspn, IFUNC_SELECTOR ()); # ifdef SHARED __hidden_ver1 (strspn, __GI_strspn, __redirect_strspn) - __attribute__ ((visibility ("hidden"))); + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strspn); # endif #endif