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