]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add support for GCC 9 attribute copy.
authorMartin Sebor <msebor@redhat.com>
Sat, 10 Nov 2018 00:24:12 +0000 (17:24 -0700)
committerMartin Sebor <msebor@redhat.com>
Sat, 10 Nov 2018 00:24:12 +0000 (17:24 -0700)
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.

21 files changed:
ChangeLog
include/libc-symbols.h
misc/sys/cdefs.h
sysdeps/x86_64/multiarch/memchr.c
sysdeps/x86_64/multiarch/memcmp.c
sysdeps/x86_64/multiarch/mempcpy.c
sysdeps/x86_64/multiarch/memset.c
sysdeps/x86_64/multiarch/stpcpy.c
sysdeps/x86_64/multiarch/strcat.c
sysdeps/x86_64/multiarch/strchr.c
sysdeps/x86_64/multiarch/strcmp.c
sysdeps/x86_64/multiarch/strcpy.c
sysdeps/x86_64/multiarch/strcspn.c
sysdeps/x86_64/multiarch/strlen.c
sysdeps/x86_64/multiarch/strncat.c
sysdeps/x86_64/multiarch/strncmp.c
sysdeps/x86_64/multiarch/strncpy.c
sysdeps/x86_64/multiarch/strnlen.c
sysdeps/x86_64/multiarch/strpbrk.c
sysdeps/x86_64/multiarch/strrchr.c
sysdeps/x86_64/multiarch/strspn.c

index 7d723f5e7b2c71292c51db7b091f3913ecccda54..e43fd3e9876d0b3332985b840090493a00e39b27 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 8b9273c13a19f2658105c7997267d9086adae716..e71a479e84bd9bb036d2f5bb9dee5ec5f212c944 100644 (file)
 # 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.  */
 /* 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.  */
    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);
index 3f6fe3cc8563b49311327647fad53eb18d94da2c..8d585680a615f878eae4bef0549516cdb24ba513 100644 (file)
 # 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__))
index 016f57846a7f4d6ae143e2fdbda2f8bd92e2881f..372dd7784ae4f5a597acb1ec4d499467a85cedc9 100644 (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
index 6f3ca43128c6629172bac0619d7c1c184159ebb8..bbd3b01ed8dd9520c5db62cd1483464eced15a59 100644 (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
index 9fe41dda82fb662bedc2a738563da1e0bff4eab0..d2f7928ae482bedf861276845da9be77d41f81bc 100644 (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
index 064841d5fc251dec01c9bdcd7d1c96718ec4f738..4b8f57ffaa6b2119517041bc81bdb67be442f8db 100644 (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
index 1e340fca991a021c501fbcb8d7ecd9a8e6cfb8d2..f74a54b153a34c473d3ae760be7821ba128d07c6 100644 (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
index 1f7f6263f35ba4025504597f195429e6dd25511f..1922c0a0da43b59d572c4b17f84e15ba9eb9939a 100644 (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
index 76d64fb378e9bbacbed79eb2dbc1866a855d0dd7..87e99ba82a242669ef43f6fecf108863c8425681 100644 (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
index b903e418df151ec19e8a6259f8e59a239aa5ed9d..e3cf39d2c5ae4315407e5b624f92fd7928d9eb91 100644 (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
index 12e0e3ffe20602c6cec317e0eba8d44de62b2f9f..ce819dd232156037bc3792cf818ffaf69643c1d5 100644 (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
index 9712e8410c2659391892a2362500acb56a7a470d..9d9652627cb87bcb0c0de023bb5baec8e0ad6de7 100644 (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
index 1758d22b8fc75226511aaf907fb8364c61628a45..a2307409d90741a9fbcf41328cdad1741cb280f7 100644 (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
index 841c165565add1321ca27081ef2969d86a1009bf..2546277450b93e19f60f6b7234431715b5e75752 100644 (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
index 02b6d0b6f5717e2a77ad7c1fefbf9945513728e9..32f5c6c6c7c77008e9324a67988dabd8c453758d 100644 (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
index 3c3de8b18ebb177fc4698b53613f5c2e969d2df1..37aae2c3ba1bf39b7c1bb73ded45e81b62b9428d 100644 (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
index 3ab94ce230bbeb8830d1972df25c30b19996d1bf..9d64335fc2dacd64c2bfb4dd6d712b66083df514 100644 (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
index a0d435a504f7520f8c0dea79d5ba49efcc5b90fe..f1103678b61f298e18dbf933d60dc0a570ff805a 100644 (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
index a719edde10b4d5e3cfb378012f4274a3bc183d7f..ba7458a7d65d48bbde50b6c6a441b4ea44bc5320 100644 (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
index 56ab4d95589da626524f33eb5bb6e3fcd911c76d..5b9654e16c876e4f63c9fc587d9baee9e7e3b264 100644 (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