On Fri, Feb 8, 2019 at 4:09 PM Miguel Ojeda <miguel.ojeda.sando...@gmail.com> wrote: > > From the GCC manual: > > copy > copy(function) > > The copy attribute applies the set of attributes with which function > has been declared to the declaration of the function to which > the attribute is applied. The attribute is designed for libraries > that define aliases or function resolvers that are expected > to specify the same set of attributes as their targets. The copy > attribute can be used with functions, variables, or types. However, > the kind of symbol to which the attribute is applied (either > function or variable) must match the kind of symbol to which > the argument refers. The copy attribute copies only syntactic and > semantic attributes but not attributes that affect a symbol’s > linkage or visibility such as alias, visibility, or weak. > The deprecated attribute is also not copied. > > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html > > The upcoming GCC 9 release extends the -Wmissing-attributes warnings > (enabled by -Wall) to C and aliases: it warns when particular function > attributes are missing in the aliases but not in their target, e.g.: > > void __cold f(void) {} > void __alias("f") g(void); > > diagnoses: > > warning: 'g' specifies less restrictive attribute than > its target 'f': 'cold' [-Wmissing-attributes] > > Using __copy(f) we can copy the __cold attribute from f to g: > > void __cold f(void) {} > void __copy(f) __alias("f") g(void); > > This attribute is most useful to deal with situations where an alias > is declared but we don't know the exact attributes the target has. > > For instance, in the kernel, the widely used module_init/exit macros > define the init/cleanup_module aliases, but those cannot be marked > always as __init/__exit since they some modules do not have their > functions marked as such.
Drop "they" from this sentence if there's a respin, otherwise looks helpful. Reviewed-by: Nick Desaulniers <ndesaulni...@google.com> > > Suggested-by: Martin Sebor <mse...@gcc.gnu.org> > Signed-off-by: Miguel Ojeda <miguel.ojeda.sando...@gmail.com> > --- > include/linux/compiler_attributes.h | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/include/linux/compiler_attributes.h > b/include/linux/compiler_attributes.h > index 19f32b0c29af..6b318efd8a74 100644 > --- a/include/linux/compiler_attributes.h > +++ b/include/linux/compiler_attributes.h > @@ -34,6 +34,7 @@ > #ifndef __has_attribute > # define __has_attribute(x) __GCC4_has_attribute_##x > # define __GCC4_has_attribute___assume_aligned__ (__GNUC_MINOR__ >= 9) > +# define __GCC4_has_attribute___copy__ 0 > # define __GCC4_has_attribute___designated_init__ 0 > # define __GCC4_has_attribute___externally_visible__ 1 > # define __GCC4_has_attribute___noclone__ 1 > @@ -100,6 +101,19 @@ > */ > #define __attribute_const__ __attribute__((__const__)) > > +/* > + * Optional: only supported since gcc >= 9 > + * Optional: not supported by clang > + * Optional: not supported by icc > + * > + * gcc: > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute > + */ > +#if __has_attribute(__copy__) > +# define __copy(symbol) __attribute__((__copy__(symbol))) > +#else > +# define __copy(symbol) > +#endif > + > /* > * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated' > * attribute warnings entirely and for good") for more information. > -- > 2.17.1 > -- Thanks, ~Nick Desaulniers