blob: 68b162d92254d91cd543c783b9d80359f7bde758 [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
Daniel Santos733ed6e2013-02-21 16:41:41 -080016#if GCC_VERSION >= 40100
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
David Woodhousecf66bb92012-12-03 16:25:40 +000068
69#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
Daniel Santos733ed6e2013-02-21 16:41:41 -080070#if GCC_VERSION >= 40400
David Woodhousecf66bb92012-12-03 16:25:40 +000071#define __HAVE_BUILTIN_BSWAP32__
72#define __HAVE_BUILTIN_BSWAP64__
73#endif
Daniel Santos733ed6e2013-02-21 16:41:41 -080074#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
David Woodhousecf66bb92012-12-03 16:25:40 +000075#define __HAVE_BUILTIN_BSWAP16__
76#endif
Daniel Santos733ed6e2013-02-21 16:41:41 -080077#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */