compiler-gcc4.h 2.1 KB
Newer Older
1 2 3
#ifndef __LINUX_COMPILER_H
#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
#endif
L
Linus Torvalds 已提交
4

L
Linus Torvalds 已提交
5
/* GCC 4.1.[01] miscompiles __weak */
6 7 8 9
#ifdef __KERNEL__
# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1
#  error Your version of gcc miscompiles the __weak directive
# endif
L
Linus Torvalds 已提交
10 11
#endif

12
#define __used			__attribute__((__used__))
L
Linus Torvalds 已提交
13 14
#define __must_check 		__attribute__((warn_unused_result))
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
15

16
#if __GNUC_MINOR__ >= 3
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/* Mark functions as cold. gcc will assume any path leading to a call
   to them will be unlikely.  This means a lot of manual unlikely()s
   are unnecessary now for any paths leading to the usual suspects
   like BUG(), printk(), panic() etc. [but let's keep them for now for
   older compilers]

   Early snapshots of gcc 4.3 don't support this and we can't detect this
   in the preprocessor, but we can live with this because they're unreleased.
   Maketime probing would be overkill here.

   gcc also has a __attribute__((__hot__)) to move hot functions into
   a special section, but I don't see any sense in this right now in
   the kernel context */
#define __cold			__attribute__((__cold__))

D
David Daney 已提交
32
#define __linktime_error(message) __attribute__((__error__(message)))
33 34 35 36 37 38 39 40 41 42 43 44

#if __GNUC_MINOR__ >= 5
/*
 * Mark a position in code as unreachable.  This can be used to
 * suppress control flow warnings after asm blocks that transfer
 * control elsewhere.
 *
 * Early snapshots of gcc 4.5 don't support this and we can't detect
 * this in the preprocessor, but we can live with this because they're
 * unreleased.  Really, we need to have autoconf for the kernel.
 */
#define unreachable() __builtin_unreachable()
45 46 47 48

/* Mark a function definition as prohibited from being cloned. */
#define __noclone	__attribute__((__noclone__))

49
#endif
50
#endif
51

52
#if __GNUC_MINOR__ > 0
53
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
54
#endif
55
#if __GNUC_MINOR__ >= 4 && !defined(__CHECKER__)
56
#define __compiletime_warning(message) __attribute__((warning(message)))
57
#define __compiletime_error(message) __attribute__((error(message)))
58
#endif