blob: 412bc6c2b02358bd48f87cc0d029bd753dbae613 [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
Linus Torvaldsf153b822009-01-02 09:23:03 -080016#if __GNUC_MINOR__ >= 3
Andi Kleena586df02007-07-21 17:10:00 +020017/* Mark functions as cold. gcc will assume any path leading to a call
18 to them will be unlikely. This means a lot of manual unlikely()s
19 are unnecessary now for any paths leading to the usual suspects
20 like BUG(), printk(), panic() etc. [but let's keep them for now for
21 older compilers]
22
23 Early snapshots of gcc 4.3 don't support this and we can't detect this
24 in the preprocessor, but we can live with this because they're unreleased.
25 Maketime probing would be overkill here.
26
27 gcc also has a __attribute__((__hot__)) to move hot functions into
28 a special section, but I don't see any sense in this right now in
29 the kernel context */
30#define __cold __attribute__((__cold__))
31
David Daney1399ff82012-01-10 15:07:25 -080032#define __linktime_error(message) __attribute__((__error__(message)))
David Daney38938c82009-12-04 17:44:50 -080033
34#if __GNUC_MINOR__ >= 5
35/*
36 * Mark a position in code as unreachable. This can be used to
37 * suppress control flow warnings after asm blocks that transfer
38 * control elsewhere.
39 *
40 * Early snapshots of gcc 4.5 don't support this and we can't detect
41 * this in the preprocessor, but we can live with this because they're
42 * unreleased. Really, we need to have autoconf for the kernel.
43 */
44#define unreachable() __builtin_unreachable()
Mikael Pettersson9c695202010-06-29 15:05:25 -070045
46/* Mark a function definition as prohibited from being cloned. */
47#define __noclone __attribute__((__noclone__))
48
David Daney38938c82009-12-04 17:44:50 -080049#endif
Andi Kleena586df02007-07-21 17:10:00 +020050#endif
Arjan van de Ven9f0cf4a2009-09-26 14:33:01 +020051
Andi Kleen9a858dc2012-09-17 14:09:15 -070052#if __GNUC_MINOR__ >= 6
53/*
54 * Tell the optimizer that something else uses this function or variable.
55 */
56#define __visible __attribute__((externally_visible))
57#endif
58
Andrew Morton7cff7ce2009-10-09 00:01:39 -070059#if __GNUC_MINOR__ > 0
Arjan van de Ven9f0cf4a2009-09-26 14:33:01 +020060#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
Andrew Morton7cff7ce2009-10-09 00:01:39 -070061#endif
Daniel Santos415c2c52012-09-28 18:20:02 -050062#if __GNUC_MINOR__ >= 3 && !defined(__CHECKER__)
Arjan van de Ven4a312762009-09-30 13:05:23 +020063#define __compiletime_warning(message) __attribute__((warning(message)))
Arjan van de Ven63312b62009-10-02 07:50:50 -070064#define __compiletime_error(message) __attribute__((error(message)))
Arjan van de Ven4a312762009-09-30 13:05:23 +020065#endif