diff mbox series

[uclibc-ng-devel] Fix warnings due to missing attributes for __EI_ prefixed symbols

Message ID 20210817200953.12939-1-ysionneau@kalray.eu
State Accepted
Headers show
Series [uclibc-ng-devel] Fix warnings due to missing attributes for __EI_ prefixed symbols | expand

Commit Message

Yann Sionneau Aug. 17, 2021, 8:09 p.m. UTC
With new compiler (gcc >= 9 ?) building uClibc-ng now gives this sort of warnings:

./include/libc-symbols.h:426:25: warning: '__EI_localeconv' specifies less restrictive attribute than its target 'localeconv': 'nothrow' [-Wmissing-attributes]
  426 |  extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
      |                         ^~~~~
./include/libc-symbols.h:429:29: note: in expansion of macro '__hidden_ver1'
  429 | #  define hidden_def(name)  __hidden_ver1(__GI_##name, name, name);
      |                             ^~~~~~~~~~~~~
./include/libc-symbols.h:497:32: note: in expansion of macro 'hidden_def'
  497 | # define libc_hidden_def(name) hidden_def (name)
      |                                ^~~~~~~~~~
libc/misc/locale/locale.c:306:1: note: in expansion of macro 'libc_hidden_def'
  306 | libc_hidden_def(localeconv)
      | ^~~~~~~~~~~~~~~
In file included from libc/misc/locale/localeconv.c:8:
libc/misc/locale/locale.c:261:15: note: '__EI_localeconv' target declared here
  261 | struct lconv *localeconv(void)
      |               ^~~~~~~~~~

The fix is mostly being backported/adapted from glibc.
---
 include/libc-symbols.h | 14 ++++++++++----
 include/sys/cdefs.h    | 11 +++++++++++
 2 files changed, 21 insertions(+), 4 deletions(-)

Comments

Waldemar Brodkorb Aug. 25, 2021, 12:20 p.m. UTC | #1
Hi Yann,

thx, committed and pushed,

best regards
 Waldemar

Yann Sionneau wrote,

> With new compiler (gcc >= 9 ?) building uClibc-ng now gives this sort of warnings:
> 
> ./include/libc-symbols.h:426:25: warning: '__EI_localeconv' specifies less restrictive attribute than its target 'localeconv': 'nothrow' [-Wmissing-attributes]
>   426 |  extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
>       |                         ^~~~~
> ./include/libc-symbols.h:429:29: note: in expansion of macro '__hidden_ver1'
>   429 | #  define hidden_def(name)  __hidden_ver1(__GI_##name, name, name);
>       |                             ^~~~~~~~~~~~~
> ./include/libc-symbols.h:497:32: note: in expansion of macro 'hidden_def'
>   497 | # define libc_hidden_def(name) hidden_def (name)
>       |                                ^~~~~~~~~~
> libc/misc/locale/locale.c:306:1: note: in expansion of macro 'libc_hidden_def'
>   306 | libc_hidden_def(localeconv)
>       | ^~~~~~~~~~~~~~~
> In file included from libc/misc/locale/localeconv.c:8:
> libc/misc/locale/locale.c:261:15: note: '__EI_localeconv' target declared here
>   261 | struct lconv *localeconv(void)
>       |               ^~~~~~~~~~
> 
> The fix is mostly being backported/adapted from glibc.
> ---
>  include/libc-symbols.h | 14 ++++++++++----
>  include/sys/cdefs.h    | 11 +++++++++++
>  2 files changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index 4dc05c76e..2254375ad 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -156,6 +156,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.  */
> @@ -163,13 +168,13 @@
>  /* 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);
>  /* Same, but does not check for type match. Use sparingly.
>     Example: strong_alias(stat,stat64) may fail, this one works: */
>  # define strong_alias_untyped(name, aliasname) \
>    _strong_alias_untyped(name, aliasname)
>  # define _strong_alias_untyped(name, aliasname) \
> -  extern __typeof (aliasname) aliasname __attribute__ ((alias (#name)));
> +  extern __typeof (aliasname) aliasname __attribute__ ((alias (#name))) __attribute_copy__ (name);
>  
>  # ifdef HAVE_WEAK_SYMBOLS
>  
> @@ -182,7 +187,7 @@
>     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);
>  
>  /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
>  #  define weak_extern(symbol) _weak_extern (weak symbol)
> @@ -423,7 +428,8 @@ FIXME! - ?
>  #  define __hidden_asmname2(prefix, name) #prefix name
>  #  define __hidden_ver1(local, internal, name) \
>  	extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
> -	extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
> +	extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#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);
> diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h
> index a4359a05c..5c4daebcd 100644
> --- a/include/sys/cdefs.h
> +++ b/include/sys/cdefs.h
> @@ -330,6 +330,17 @@
>  # endif
>  #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
> +
> +
>  /* GCC 4.3 and above allow passing all anonymous arguments of an
>     __extern_always_inline function to some other vararg function.  */
>  #if __GNUC_PREREQ (4,3)
> -- 
> 2.17.1
> 
> _______________________________________________
> devel mailing list
> devel@uclibc-ng.org
> https://mailman.uclibc-ng.org/cgi-bin/mailman/listinfo/devel
>
diff mbox series

Patch

diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 4dc05c76e..2254375ad 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -156,6 +156,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.  */
@@ -163,13 +168,13 @@ 
 /* 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);
 /* Same, but does not check for type match. Use sparingly.
    Example: strong_alias(stat,stat64) may fail, this one works: */
 # define strong_alias_untyped(name, aliasname) \
   _strong_alias_untyped(name, aliasname)
 # define _strong_alias_untyped(name, aliasname) \
-  extern __typeof (aliasname) aliasname __attribute__ ((alias (#name)));
+  extern __typeof (aliasname) aliasname __attribute__ ((alias (#name))) __attribute_copy__ (name);
 
 # ifdef HAVE_WEAK_SYMBOLS
 
@@ -182,7 +187,7 @@ 
    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);
 
 /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
 #  define weak_extern(symbol) _weak_extern (weak symbol)
@@ -423,7 +428,8 @@  FIXME! - ?
 #  define __hidden_asmname2(prefix, name) #prefix name
 #  define __hidden_ver1(local, internal, name) \
 	extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
-	extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
+	extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#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);
diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h
index a4359a05c..5c4daebcd 100644
--- a/include/sys/cdefs.h
+++ b/include/sys/cdefs.h
@@ -330,6 +330,17 @@ 
 # endif
 #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
+
+
 /* GCC 4.3 and above allow passing all anonymous arguments of an
    __extern_always_inline function to some other vararg function.  */
 #if __GNUC_PREREQ (4,3)