From: Martin Sebor Date: Sat, 10 Nov 2018 00:24:12 +0000 (-0700) Subject: Add support for GCC 9 attribute copy. X-Git-Tag: glibc-2.29~316 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1626a1cfcd6ba1cc64721be1036c2873211d499b;p=thirdparty%2Fglibc.git Add support for GCC 9 attribute copy. GCC 9 has 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. This change, tested on x86_64-linux, avoids all instances of the new warnings by making use of the attribute where appropriate. To fully benefit from the enhancement Glibc will need to be compiled with -Wattribute-alias=2 and remaining warnings reviewed and dealt with (there are a couple of thousand but most should be straightforward to deal with). ChangeLog: * include/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/ChangeLog b/ChangeLog index 7d723f5e7b2..e43fd3e9876 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2018-11-09 Martin Sebor + + * include/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. + 2018-11-09 Gabriel F. T. Gomes * misc/tst-efgcvt.c: Include support/check.h and diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 8b9273c13a1..e71a479e84b 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 3f6fe3cc856..8d585680a61 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 016f57846a7..372dd7784ae 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 6f3ca43128c..bbd3b01ed8d 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 9fe41dda82f..d2f7928ae48 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 064841d5fc2..4b8f57ffaa6 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 1e340fca991..f74a54b153a 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 1f7f6263f35..1922c0a0da4 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 76d64fb378e..87e99ba82a2 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 b903e418df1..e3cf39d2c5a 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 12e0e3ffe20..ce819dd2321 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 9712e8410c2..9d9652627cb 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 1758d22b8fc..a2307409d90 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/strncat.c b/sysdeps/x86_64/multiarch/strncat.c index 841c165565a..2546277450b 100644 --- a/sysdeps/x86_64/multiarch/strncat.c +++ b/sysdeps/x86_64/multiarch/strncat.c @@ -30,6 +30,6 @@ libc_ifunc_redirected (__redirect_strncat, strncat, IFUNC_SELECTOR ()); strong_alias (strncat, __strncat); # ifdef SHARED __hidden_ver1 (strncat, __GI___strncat, __redirect_strncat) - __attribute__((visibility ("hidden"))); + __attribute__((visibility ("hidden"))) __attribute_copy__ (strncat); # endif #endif diff --git a/sysdeps/x86_64/multiarch/strncmp.c b/sysdeps/x86_64/multiarch/strncmp.c index 02b6d0b6f57..32f5c6c6c7c 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 3c3de8b18eb..37aae2c3ba1 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 3ab94ce230b..9d64335fc2d 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 a0d435a504f..f1103678b61 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 a719edde10b..ba7458a7d65 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 56ab4d95589..5b9654e16c8 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