diff options
| author | Yann Sionneau <ysionneau@kalray.eu> | 2021-08-17 22:09:53 +0200 | 
|---|---|---|
| committer | Waldemar Brodkorb <wbx@openadk.org> | 2021-08-25 14:14:02 +0200 | 
| commit | 74b93e4d32633fc896ec61ca73b79f7d4725e2a3 (patch) | |
| tree | 250d77fa44602085227f5debc7d3227f00e6ee73 | |
| parent | 0894e879f091a6a281c02b8da1c0606f4f2dcfb8 (diff) | |
Fix warnings due to missing attributes for __EI_ prefixed symbols
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.
| -rw-r--r-- | include/libc-symbols.h | 14 | ||||
| -rw-r--r-- | 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)  | 
