1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
219261401SArnaldo Carvalho de Melo #ifndef _TOOLS_LINUX_COMPILER_H_
3*a7306f3cSNataniel Farzan #error "Please do not include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
419261401SArnaldo Carvalho de Melo #endif
519261401SArnaldo Carvalho de Melo 
619261401SArnaldo Carvalho de Melo /*
719261401SArnaldo Carvalho de Melo  * Common definitions for all gcc versions go here.
819261401SArnaldo Carvalho de Melo  */
98918dc42SQuentin Monnet #ifndef GCC_VERSION
1019261401SArnaldo Carvalho de Melo #define GCC_VERSION (__GNUC__ * 10000		\
1119261401SArnaldo Carvalho de Melo 		     + __GNUC_MINOR__ * 100	\
1219261401SArnaldo Carvalho de Melo 		     + __GNUC_PATCHLEVEL__)
138918dc42SQuentin Monnet #endif
1419261401SArnaldo Carvalho de Melo 
15f7a858bfSLiam Howlett #if __has_attribute(__fallthrough__)
16f7a858bfSLiam Howlett # define fallthrough                    __attribute__((__fallthrough__))
17f7a858bfSLiam Howlett #else
18f7a858bfSLiam Howlett # define fallthrough                    do {} while (0)  /* fallthrough */
1919261401SArnaldo Carvalho de Melo #endif
2049006538SArnaldo Carvalho de Melo 
21d0ee23f9SNathan Chancellor #if __has_attribute(__error__)
2249006538SArnaldo Carvalho de Melo # define __compiletime_error(message) __attribute__((error(message)))
23d0ee23f9SNathan Chancellor #endif
24f6441affSArnaldo Carvalho de Melo 
25f6441affSArnaldo Carvalho de Melo /* &a[0] degrades to a pointer: a different type from an array */
26f6441affSArnaldo Carvalho de Melo #define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
276c346643SArnaldo Carvalho de Melo 
286e1690c4SArnaldo Carvalho de Melo #ifndef __pure
296e1690c4SArnaldo Carvalho de Melo #define  __pure		__attribute__((pure))
306e1690c4SArnaldo Carvalho de Melo #endif
319dd4ca47SArnaldo Carvalho de Melo #define  noinline	__attribute__((noinline))
32259d4077SArnaldo Carvalho de Melo #ifndef __packed
33c9f5da74SArnaldo Carvalho de Melo #define __packed	__attribute__((packed))
34259d4077SArnaldo Carvalho de Melo #endif
35259d4077SArnaldo Carvalho de Melo #ifndef __noreturn
366c346643SArnaldo Carvalho de Melo #define __noreturn	__attribute__((noreturn))
37259d4077SArnaldo Carvalho de Melo #endif
38259d4077SArnaldo Carvalho de Melo #ifndef __aligned
395c97cac6SArnaldo Carvalho de Melo #define __aligned(x)	__attribute__((aligned(x)))
40259d4077SArnaldo Carvalho de Melo #endif
41afaed6d3SArnaldo Carvalho de Melo #define __printf(a, b)	__attribute__((format(printf, a, b)))
423ee350fbSArnaldo Carvalho de Melo #define __scanf(a, b)	__attribute__((format(scanf, a, b)))
43