compiler.h: Move compiletime_assert() macros into compiler_types.h
The kernel test robot reports that moving READ_ONCE() out into its own header breaks a W=1 build for parisc, which is relying on the definition of compiletime_assert() being available: | In file included from ./arch/parisc/include/generated/asm/rwonce.h:1, | from ./include/asm-generic/barrier.h:16, | from ./arch/parisc/include/asm/barrier.h:29, | from ./arch/parisc/include/asm/atomic.h:11, | from ./include/linux/atomic.h:7, | from kernel/locking/percpu-rwsem.c:2: | ./arch/parisc/include/asm/atomic.h: In function 'atomic_read': | ./include/asm-generic/rwonce.h:36:2: error: implicit declaration of function 'compiletime_assert' [-Werror=implicit-function-declaration] | 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | | ^~~~~~~~~~~~~~~~~~ | ./include/asm-generic/rwonce.h:49:2: note: in expansion of macro 'compiletime_assert_rwonce_type' | 49 | compiletime_assert_rwonce_type(x); \ | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ./arch/parisc/include/asm/atomic.h:73:9: note: in expansion of macro 'READ_ONCE' | 73 | return READ_ONCE((v)->counter); | | ^~~~~~~~~ Move these macros into compiler_types.h, so that they are available to READ_ONCE() and friends. Link: http://lists.infradead.org/pipermail/linux-arm-kernel/2020-July/587094.html Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
@@ -273,47 +273,6 @@ static inline void *offset_to_ptr(const int *off)
|
|||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
/* Compile time object size, -1 for unknown */
|
|
||||||
#ifndef __compiletime_object_size
|
|
||||||
# define __compiletime_object_size(obj) -1
|
|
||||||
#endif
|
|
||||||
#ifndef __compiletime_warning
|
|
||||||
# define __compiletime_warning(message)
|
|
||||||
#endif
|
|
||||||
#ifndef __compiletime_error
|
|
||||||
# define __compiletime_error(message)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __OPTIMIZE__
|
|
||||||
# define __compiletime_assert(condition, msg, prefix, suffix) \
|
|
||||||
do { \
|
|
||||||
extern void prefix ## suffix(void) __compiletime_error(msg); \
|
|
||||||
if (!(condition)) \
|
|
||||||
prefix ## suffix(); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define _compiletime_assert(condition, msg, prefix, suffix) \
|
|
||||||
__compiletime_assert(condition, msg, prefix, suffix)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* compiletime_assert - break build and emit msg if condition is false
|
|
||||||
* @condition: a compile-time constant condition to check
|
|
||||||
* @msg: a message to emit if condition is false
|
|
||||||
*
|
|
||||||
* In tradition of POSIX assert, this macro will break the build if the
|
|
||||||
* supplied condition is *false*, emitting the supplied error message if the
|
|
||||||
* compiler has support to do so.
|
|
||||||
*/
|
|
||||||
#define compiletime_assert(condition, msg) \
|
|
||||||
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
|
|
||||||
|
|
||||||
#define compiletime_assert_atomic_type(t) \
|
|
||||||
compiletime_assert(__native_word(t), \
|
|
||||||
"Need native word sized stores/loads for atomicity.")
|
|
||||||
|
|
||||||
/* &a[0] degrades to a pointer: a different type from an array */
|
/* &a[0] degrades to a pointer: a different type from an array */
|
||||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||||
|
|
||||||
|
@@ -300,6 +300,47 @@ struct ftrace_likely_data {
|
|||||||
(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
|
(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
|
||||||
sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
||||||
|
|
||||||
|
/* Compile time object size, -1 for unknown */
|
||||||
|
#ifndef __compiletime_object_size
|
||||||
|
# define __compiletime_object_size(obj) -1
|
||||||
|
#endif
|
||||||
|
#ifndef __compiletime_warning
|
||||||
|
# define __compiletime_warning(message)
|
||||||
|
#endif
|
||||||
|
#ifndef __compiletime_error
|
||||||
|
# define __compiletime_error(message)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __OPTIMIZE__
|
||||||
|
# define __compiletime_assert(condition, msg, prefix, suffix) \
|
||||||
|
do { \
|
||||||
|
extern void prefix ## suffix(void) __compiletime_error(msg); \
|
||||||
|
if (!(condition)) \
|
||||||
|
prefix ## suffix(); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _compiletime_assert(condition, msg, prefix, suffix) \
|
||||||
|
__compiletime_assert(condition, msg, prefix, suffix)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compiletime_assert - break build and emit msg if condition is false
|
||||||
|
* @condition: a compile-time constant condition to check
|
||||||
|
* @msg: a message to emit if condition is false
|
||||||
|
*
|
||||||
|
* In tradition of POSIX assert, this macro will break the build if the
|
||||||
|
* supplied condition is *false*, emitting the supplied error message if the
|
||||||
|
* compiler has support to do so.
|
||||||
|
*/
|
||||||
|
#define compiletime_assert(condition, msg) \
|
||||||
|
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
|
||||||
|
|
||||||
|
#define compiletime_assert_atomic_type(t) \
|
||||||
|
compiletime_assert(__native_word(t), \
|
||||||
|
"Need native word sized stores/loads for atomicity.")
|
||||||
|
|
||||||
/* Helpers for emitting diagnostics in pragmas. */
|
/* Helpers for emitting diagnostics in pragmas. */
|
||||||
#ifndef __diag
|
#ifndef __diag
|
||||||
#define __diag(string)
|
#define __diag(string)
|
||||||
|
Reference in New Issue
Block a user