blob: ded429966c1f447db9106359b174fb742fd3fe54 [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__
Daniel Santos733ed6e2013-02-21 16:41:41 -08007# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
H. Peter Anvin8cd2c292009-02-25 15:22:19 -08008# 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
Guenter Roeck2fb08152013-04-29 16:17:15 -070016#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
Daniel Santos6640dfd2013-02-21 16:41:32 -080017# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
18#endif
19
Daniel Santos733ed6e2013-02-21 16:41:41 -080020#if GCC_VERSION >= 40300
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
Rusty Russell6f33d582012-11-22 12:30:25 +103036#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
37
Daniel Santos6640dfd2013-02-21 16:41:32 -080038#ifndef __CHECKER__
39# define __compiletime_warning(message) __attribute__((warning(message)))
40# define __compiletime_error(message) __attribute__((error(message)))
41#endif /* __CHECKER__ */
Daniel Santos733ed6e2013-02-21 16:41:41 -080042#endif /* GCC_VERSION >= 40300 */
Daniel Santos6640dfd2013-02-21 16:41:32 -080043
Daniel Santos733ed6e2013-02-21 16:41:41 -080044#if GCC_VERSION >= 40500
David Daney38938c82009-12-04 17:44:50 -080045/*
46 * Mark a position in code as unreachable. This can be used to
47 * suppress control flow warnings after asm blocks that transfer
48 * control elsewhere.
49 *
50 * Early snapshots of gcc 4.5 don't support this and we can't detect
51 * this in the preprocessor, but we can live with this because they're
52 * unreleased. Really, we need to have autoconf for the kernel.
53 */
54#define unreachable() __builtin_unreachable()
Mikael Pettersson9c695202010-06-29 15:05:25 -070055
56/* Mark a function definition as prohibited from being cloned. */
57#define __noclone __attribute__((__noclone__))
58
Daniel Santos733ed6e2013-02-21 16:41:41 -080059#endif /* GCC_VERSION >= 40500 */
Arjan van de Ven9f0cf4a2009-09-26 14:33:01 +020060
Daniel Santos733ed6e2013-02-21 16:41:41 -080061#if GCC_VERSION >= 40600
Andi Kleen9a858dc2012-09-17 14:09:15 -070062/*
63 * Tell the optimizer that something else uses this function or variable.
64 */
65#define __visible __attribute__((externally_visible))
66#endif
67
Ingo Molnar3f0116c2013-10-10 10:16:30 +020068/*
69 * GCC 'asm goto' miscompiles certain code sequences:
70 *
71 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
72 *
73 * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
74 * Fixed in GCC 4.8.2 and later versions.
75 *
76 * (asm goto is automatically volatile - the naming reflects this.)
77 */
78#if GCC_VERSION <= 40801
79# define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
80#else
81# define asm_volatile_goto(x...) do { asm goto(x); } while (0)
82#endif
David Woodhousecf66bb92012-12-03 16:25:40 +000083
84#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
Daniel Santos733ed6e2013-02-21 16:41:41 -080085#if GCC_VERSION >= 40400
David Woodhousecf66bb92012-12-03 16:25:40 +000086#define __HAVE_BUILTIN_BSWAP32__
87#define __HAVE_BUILTIN_BSWAP64__
88#endif
Daniel Santos733ed6e2013-02-21 16:41:41 -080089#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
David Woodhousecf66bb92012-12-03 16:25:40 +000090#define __HAVE_BUILTIN_BSWAP16__
91#endif
Daniel Santos733ed6e2013-02-21 16:41:41 -080092#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */