Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/xen/compiler.h
Line
Count
Source (jump to first uncovered line)
1
#ifndef __LINUX_COMPILER_H
2
#define __LINUX_COMPILER_H
3
4
#if !defined(__GNUC__) || (__GNUC__ < 4)
5
#error Sorry, your compiler is too old/not recognized.
6
#endif
7
8
289M
#define barrier()     __asm__ __volatile__("": : :"memory")
9
10
138M
#define likely(x)     __builtin_expect(!!(x),1)
11
903M
#define unlikely(x)   __builtin_expect(!!(x),0)
12
13
#define inline        __inline__
14
#define always_inline __inline__ __attribute__ ((__always_inline__))
15
#define noinline      __attribute__((__noinline__))
16
17
#define noreturn      __attribute__((__noreturn__))
18
19
#define __packed      __attribute__((__packed__))
20
21
#if (!defined(__clang__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5))
22
#define unreachable() do {} while (1)
23
#else
24
9.18M
#define unreachable() __builtin_unreachable()
25
#endif
26
27
#ifdef __clang__
28
/* Clang can replace some vars with new automatic ones that go in .data;
29
 * mark all explicit-segment vars 'used' to prevent that. */
30
#define __section(s)      __used __attribute__((__section__(s)))
31
#else
32
#define __section(s)      __attribute__((__section__(s)))
33
#endif
34
#define __used_section(s) __used __attribute__((__section__(s)))
35
#define __text_section(s) __attribute__((__section__(s)))
36
37
#define __aligned(a) __attribute__((__aligned__(a)))
38
39
#ifdef INIT_SECTIONS_ONLY
40
/*
41
 * For sources indicated to have only init code, make sure even
42
 * inline functions not expanded inline get placed in .init.text.
43
 */
44
#include <xen/init.h>
45
#define __inline__ __inline__ __init
46
#endif
47
48
#define __attribute_pure__  __attribute__((__pure__))
49
#define __attribute_const__ __attribute__((__const__))
50
#define __transparent__     __attribute__((__transparent_union__))
51
52
/*
53
 * The difference between the following two attributes is that __used is
54
 * intended to be used in cases where a reference to an identifier may be
55
 * invisible to the compiler (e.g. an inline assembly operand not listed
56
 * in the asm()'s operands), preventing the compiler from eliminating the
57
 * variable or function.
58
 * __maybe_unused otoh is to be used to merely prevent warnings (e.g. when
59
 * an identifier is used only inside a preprocessor conditional, yet putting
60
 * its declaration/definition inside another conditional would harm code
61
 * readability).
62
 */
63
#define __used         __attribute__((__used__))
64
#define __maybe_unused __attribute__((__unused__))
65
66
#define __must_check __attribute__((__warn_unused_result__))
67
#define __nonnull(...) __attribute__((__nonnull__(__VA_ARGS__)))
68
69
96.2M
#define offsetof(a,b) __builtin_offsetof(a,b)
70
71
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
72
#define alignof __alignof__
73
#endif
74
75
/* &a[0] degrades to a pointer: a different type from an array */
76
#define __must_be_array(a) \
77
8.23M
  BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
78
79
#ifdef GCC_HAS_VISIBILITY_ATTRIBUTE
80
/* Results in more efficient PIC code (no indirections through GOT or PLT). */
81
#pragma GCC visibility push(hidden)
82
#endif
83
84
/* This macro obfuscates arithmetic on a variable address so that gcc
85
   shouldn't recognize the original var, and make assumptions about it */
86
/*
87
 * Versions of the ppc64 compiler before 4.1 had a bug where use of
88
 * RELOC_HIDE could trash r30. The bug can be worked around by changing
89
 * the inline assembly constraint from =g to =r, in this particular
90
 * case either is valid.
91
 */
92
#define RELOC_HIDE(ptr, off)                    \
93
342M
  ({ unsigned long __ptr;                       \
94
342M
    __asm__ ("" : "=r"(__ptr) : "0"(ptr));      \
95
342M
    (typeof(ptr)) (__ptr + (off)); })
96
97
#ifdef __GCC_ASM_FLAG_OUTPUTS__
98
# define ASM_FLAG_OUT(yes, no) yes
99
#else
100
# define ASM_FLAG_OUT(yes, no) no
101
#endif
102
103
/*
104
 * NB: we need to disable the gcc-compat warnings for clang in some places or
105
 * else it will complain with: "'break' is bound to loop, GCC binds it to
106
 * switch" when a switch is used inside of a while expression inside of a
107
 * switch statement, ie:
108
 *
109
 * switch ( ... )
110
 * {
111
 * case ...:
112
 *      while ( ({ int x; switch ( foo ) { case 1: x = 1; break; } x }) )
113
 *      {
114
 *              ...
115
 *
116
 * This has already been reported upstream:
117
 * http://bugs.llvm.org/show_bug.cgi?id=32595 
118
 */
119
#ifdef __clang__
120
# define CLANG_DISABLE_WARN_GCC_COMPAT_START                    \
121
    _Pragma("clang diagnostic push")                            \
122
    _Pragma("clang diagnostic ignored \"-Wgcc-compat\"")
123
# define CLANG_DISABLE_WARN_GCC_COMPAT_END                      \
124
    _Pragma("clang diagnostic pop")
125
#else
126
# define CLANG_DISABLE_WARN_GCC_COMPAT_START
127
# define CLANG_DISABLE_WARN_GCC_COMPAT_END
128
#endif
129
130
#endif /* __LINUX_COMPILER_H */