Skip to content

Commit c0d9782

Browse files
committed
Compiler Attributes: add support for __copy (gcc >= 9)
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 some modules do not have their functions marked as such. Suggested-by: Martin Sebor <msebor@gcc.gnu.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
1 parent ff98e20 commit c0d9782

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

include/linux/compiler_attributes.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#ifndef __has_attribute
3535
# define __has_attribute(x) __GCC4_has_attribute_##x
3636
# define __GCC4_has_attribute___assume_aligned__ (__GNUC_MINOR__ >= 9)
37+
# define __GCC4_has_attribute___copy__ 0
3738
# define __GCC4_has_attribute___designated_init__ 0
3839
# define __GCC4_has_attribute___externally_visible__ 1
3940
# define __GCC4_has_attribute___noclone__ 1
@@ -100,6 +101,19 @@
100101
*/
101102
#define __attribute_const__ __attribute__((__const__))
102103

104+
/*
105+
* Optional: only supported since gcc >= 9
106+
* Optional: not supported by clang
107+
* Optional: not supported by icc
108+
*
109+
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute
110+
*/
111+
#if __has_attribute(__copy__)
112+
# define __copy(symbol) __attribute__((__copy__(symbol)))
113+
#else
114+
# define __copy(symbol)
115+
#endif
116+
103117
/*
104118
* Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated'
105119
* attribute warnings entirely and for good") for more information.

0 commit comments

Comments
 (0)