blob: c9785c22744ec3377b7d1400418caf25af29beeb [file] [log] [blame]
Robert P. J. Day94f582f2007-10-16 23:26:11 -07001#ifndef __LINUX_COMPILER_H
2#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
3#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
Linus Torvaldsf9d14252009-01-02 09:29:43 -08005/* GCC 4.1.[01] miscompiles __weak */
H. Peter Anvin8cd2c292009-02-25 15:22:19 -08006#ifdef __KERNEL__
7# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1
8# error Your version of gcc miscompiles the __weak directive
9# endif
Linus Torvaldsf9d14252009-01-02 09:29:43 -080010#endif
11
David Rientjes0d7ebbb2007-05-09 02:35:27 -070012#define __used __attribute__((__used__))
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#define __must_check __attribute__((warn_unused_result))
14#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
Andi Kleena586df02007-07-21 17:10:00 +020015
Daniel Santos6640dfd2013-02-21 16:41:32 -080016#if __GNUC_MINOR__ > 0
17# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
18#endif
19
Linus Torvaldsf153b822009-01-02 09:23:03 -080020#if __GNUC_MINOR__ >= 3
Andi Kleena586df02007-07-21 17:10:00 +020021/* Mark functions as cold. gcc will assume any path leading to a call
22 to them will be unlikely. This means a lot of manual unlikely()s
23 are unnecessary now for any paths leading to the usual suspects
24 like BUG(), printk(), panic() etc. [but let's keep them for now for
25 older compilers]
26
27 Early snapshots of gcc 4.3 don't support this and we can't detect this
28 in the preprocessor, but we can live with this because they're unreleased.
29 Maketime probing would be overkill here.
30
31 gcc also has a __attribute__((__hot__)) to move hot functions into
32 a special section, but I don't see any sense in this right now in
33 the kernel context */
34#define __cold __attribute__((__cold__))
35
David Daney1399ff82012-01-10 15:07:25 -080036#define __linktime_error(message) __attribute__((__error__(message)))
David Daney38938c82009-12-04 17:44:50 -080037
Rusty Russell6f33d582012-11-22 12:30:25 +103038#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
39
Daniel Santos6640dfd2013-02-21 16:41:32 -080040#ifndef __CHECKER__
41# define __compiletime_warning(message) __attribute__((warning(message)))
42# define __compiletime_error(message) __attribute__((error(message)))
43#endif /* __CHECKER__ */
44#endif /* __GNUC_MINOR__ >= 3 */
45
David Daney38938c82009-12-04 17:44:50 -080046#if __GNUC_MINOR__ >= 5
47/*
48 * Mark a position in code as unreachable. This can be used to
49 * suppress control flow warnings after asm blocks that transfer
50 * control elsewhere.
51 *
52 * Early snapshots of gcc 4.5 don't support this and we can't detect
53 * this in the preprocessor, but we can live with this because they're
54 * unreleased. Really, we need to have autoconf for the kernel.
55 */
56#define unreachable() __builtin_unreachable()
Mikael Pettersson9c695202010-06-29 15:05:25 -070057
58/* Mark a function definition as prohibited from being cloned. */
59#define __noclone __attribute__((__noclone__))
60
Daniel Santos6640dfd2013-02-21 16:41:32 -080061#endif /* __GNUC_MINOR__ >= 5 */
Arjan van de Ven9f0cf4a2009-09-26 14:33:01 +020062
Andi Kleen9a858dc2012-09-17 14:09:15 -070063#if __GNUC_MINOR__ >= 6
64/*
65 * Tell the optimizer that something else uses this function or variable.
66 */
67#define __visible __attribute__((externally_visible))
68#endif
69
David Woodhousecf66bb92012-12-03 16:25:40 +000070
71#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
72#if __GNUC_MINOR__ >= 4
73#define __HAVE_BUILTIN_BSWAP32__
74#define __HAVE_BUILTIN_BSWAP64__
75#endif
76#if __GNUC_MINOR__ >= 8 || (defined(__powerpc__) && __GNUC_MINOR__ >= 6)
77#define __HAVE_BUILTIN_BSWAP16__
78#endif
79#endif