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.
This commit is contained in:
Martin Sebor 2018-11-09 17:24:12 -07:00
parent 968ed5301d
commit 1626a1cfcd
21 changed files with 71 additions and 26 deletions

View File

@ -1,3 +1,28 @@
2018-11-09 Martin Sebor <msebor@redhat.com>
* 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 <gabriel@inconstante.eti.br>
* misc/tst-efgcvt.c: Include support/check.h and

View File

@ -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);

View File

@ -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__))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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