Commit 0b999ae3 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'compiler-attributes-for-linus-v5.0-rc7' of git://github.com/ojeda/linux

Pull compiler attributes fixes from Miguel Ojeda:
 "Clean the new GCC 9 -Wmissing-attributes warnings

  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]

  These patch series clean these new warnings. Most of them are caused
  by the module_init/exit macros"

Link: https://lore.kernel.org/lkml/20190125104353.2791-1-labbott@redhat.com/

* tag 'compiler-attributes-for-linus-v5.0-rc7' of git://github.com/ojeda/linux:
  include/linux/module.h: copy __init/__exit attrs to init/cleanup_module
  Compiler Attributes: add support for __copy (gcc >= 9)
  lib/crc32.c: mark crc32_le_base/__crc32c_le_base aliases as __pure
parents 5ded5871 a6e60d84
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#ifndef __has_attribute #ifndef __has_attribute
# define __has_attribute(x) __GCC4_has_attribute_##x # define __has_attribute(x) __GCC4_has_attribute_##x
# define __GCC4_has_attribute___assume_aligned__ (__GNUC_MINOR__ >= 9) # 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___designated_init__ 0
# define __GCC4_has_attribute___externally_visible__ 1 # define __GCC4_has_attribute___externally_visible__ 1
# define __GCC4_has_attribute___noclone__ 1 # define __GCC4_has_attribute___noclone__ 1
...@@ -100,6 +101,19 @@ ...@@ -100,6 +101,19 @@
*/ */
#define __attribute_const__ __attribute__((__const__)) #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' * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated'
* attribute warnings entirely and for good") for more information. * attribute warnings entirely and for good") for more information.
......
...@@ -129,13 +129,13 @@ extern void cleanup_module(void); ...@@ -129,13 +129,13 @@ extern void cleanup_module(void);
#define module_init(initfn) \ #define module_init(initfn) \
static inline initcall_t __maybe_unused __inittest(void) \ static inline initcall_t __maybe_unused __inittest(void) \
{ return initfn; } \ { return initfn; } \
int init_module(void) __attribute__((alias(#initfn))); int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));
/* This is only required if you want to be unloadable. */ /* This is only required if you want to be unloadable. */
#define module_exit(exitfn) \ #define module_exit(exitfn) \
static inline exitcall_t __maybe_unused __exittest(void) \ static inline exitcall_t __maybe_unused __exittest(void) \
{ return exitfn; } \ { return exitfn; } \
void cleanup_module(void) __attribute__((alias(#exitfn))); void cleanup_module(void) __copy(exitfn) __attribute__((alias(#exitfn)));
#endif #endif
......
...@@ -206,8 +206,8 @@ u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len) ...@@ -206,8 +206,8 @@ u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
EXPORT_SYMBOL(crc32_le); EXPORT_SYMBOL(crc32_le);
EXPORT_SYMBOL(__crc32c_le); EXPORT_SYMBOL(__crc32c_le);
u32 crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le); u32 __pure crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);
u32 __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le); u32 __pure __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);
/* /*
* This multiplies the polynomials x and y modulo the given modulus. * This multiplies the polynomials x and y modulo the given modulus.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment