root/include/linux/compiler_types.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __LINUX_COMPILER_TYPES_H
   3 #define __LINUX_COMPILER_TYPES_H
   4 
   5 #ifndef __ASSEMBLY__
   6 
   7 #ifdef __CHECKER__
   8 # define __user         __attribute__((noderef, address_space(1)))
   9 # define __kernel       __attribute__((address_space(0)))
  10 # define __safe         __attribute__((safe))
  11 # define __force        __attribute__((force))
  12 # define __nocast       __attribute__((nocast))
  13 # define __iomem        __attribute__((noderef, address_space(2)))
  14 # define __must_hold(x) __attribute__((context(x,1,1)))
  15 # define __acquires(x)  __attribute__((context(x,0,1)))
  16 # define __releases(x)  __attribute__((context(x,1,0)))
  17 # define __acquire(x)   __context__(x,1)
  18 # define __release(x)   __context__(x,-1)
  19 # define __cond_lock(x,c)       ((c) ? ({ __acquire(x); 1; }) : 0)
  20 # define __percpu       __attribute__((noderef, address_space(3)))
  21 # define __rcu          __attribute__((noderef, address_space(4)))
  22 # define __private      __attribute__((noderef))
  23 extern void __chk_user_ptr(const volatile void __user *);
  24 extern void __chk_io_ptr(const volatile void __iomem *);
  25 # define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
  26 #else /* __CHECKER__ */
  27 # ifdef STRUCTLEAK_PLUGIN
  28 #  define __user __attribute__((user))
  29 # else
  30 #  define __user
  31 # endif
  32 # define __kernel
  33 # define __safe
  34 # define __force
  35 # define __nocast
  36 # define __iomem
  37 # define __chk_user_ptr(x) (void)0
  38 # define __chk_io_ptr(x) (void)0
  39 # define __builtin_warning(x, y...) (1)
  40 # define __must_hold(x)
  41 # define __acquires(x)
  42 # define __releases(x)
  43 # define __acquire(x) (void)0
  44 # define __release(x) (void)0
  45 # define __cond_lock(x,c) (c)
  46 # define __percpu
  47 # define __rcu
  48 # define __private
  49 # define ACCESS_PRIVATE(p, member) ((p)->member)
  50 #endif /* __CHECKER__ */
  51 
  52 /* Indirect macros required for expanded argument pasting, eg. __LINE__. */
  53 #define ___PASTE(a,b) a##b
  54 #define __PASTE(a,b) ___PASTE(a,b)
  55 
  56 #ifdef __KERNEL__
  57 
  58 /* Attributes */
  59 #include <linux/compiler_attributes.h>
  60 
  61 /* Compiler specific macros. */
  62 #ifdef __clang__
  63 #include <linux/compiler-clang.h>
  64 #elif defined(__INTEL_COMPILER)
  65 #include <linux/compiler-intel.h>
  66 #elif defined(__GNUC__)
  67 /* The above compilers also define __GNUC__, so order is important here. */
  68 #include <linux/compiler-gcc.h>
  69 #else
  70 #error "Unknown compiler"
  71 #endif
  72 
  73 /*
  74  * Some architectures need to provide custom definitions of macros provided
  75  * by linux/compiler-*.h, and can do so using asm/compiler.h. We include that
  76  * conditionally rather than using an asm-generic wrapper in order to avoid
  77  * build failures if any C compilation, which will include this file via an
  78  * -include argument in c_flags, occurs prior to the asm-generic wrappers being
  79  * generated.
  80  */
  81 #ifdef CONFIG_HAVE_ARCH_COMPILER_H
  82 #include <asm/compiler.h>
  83 #endif
  84 
  85 struct ftrace_branch_data {
  86         const char *func;
  87         const char *file;
  88         unsigned line;
  89         union {
  90                 struct {
  91                         unsigned long correct;
  92                         unsigned long incorrect;
  93                 };
  94                 struct {
  95                         unsigned long miss;
  96                         unsigned long hit;
  97                 };
  98                 unsigned long miss_hit[2];
  99         };
 100 };
 101 
 102 struct ftrace_likely_data {
 103         struct ftrace_branch_data       data;
 104         unsigned long                   constant;
 105 };
 106 
 107 #ifdef CONFIG_ENABLE_MUST_CHECK
 108 #define __must_check            __attribute__((__warn_unused_result__))
 109 #else
 110 #define __must_check
 111 #endif
 112 
 113 #if defined(CC_USING_HOTPATCH)
 114 #define notrace                 __attribute__((hotpatch(0, 0)))
 115 #elif defined(CC_USING_PATCHABLE_FUNCTION_ENTRY)
 116 #define notrace                 __attribute__((patchable_function_entry(0, 0)))
 117 #else
 118 #define notrace                 __attribute__((__no_instrument_function__))
 119 #endif
 120 
 121 /*
 122  * it doesn't make sense on ARM (currently the only user of __naked)
 123  * to trace naked functions because then mcount is called without
 124  * stack and frame pointer being set up and there is no chance to
 125  * restore the lr register to the value before mcount was called.
 126  */
 127 #define __naked                 __attribute__((__naked__)) notrace
 128 
 129 #define __compiler_offsetof(a, b)       __builtin_offsetof(a, b)
 130 
 131 /*
 132  * Force always-inline if the user requests it so via the .config.
 133  * Prefer gnu_inline, so that extern inline functions do not emit an
 134  * externally visible function. This makes extern inline behave as per gnu89
 135  * semantics rather than c99. This prevents multiple symbol definition errors
 136  * of extern inline functions at link time.
 137  * A lot of inline functions can cause havoc with function tracing.
 138  * Do not use __always_inline here, since currently it expands to inline again
 139  * (which would break users of __always_inline).
 140  */
 141 #if !defined(CONFIG_OPTIMIZE_INLINING)
 142 #define inline inline __attribute__((__always_inline__)) __gnu_inline \
 143         __inline_maybe_unused notrace
 144 #else
 145 #define inline inline                                    __gnu_inline \
 146         __inline_maybe_unused notrace
 147 #endif
 148 
 149 /*
 150  * gcc provides both __inline__ and __inline as alternate spellings of
 151  * the inline keyword, though the latter is undocumented. New kernel
 152  * code should only use the inline spelling, but some existing code
 153  * uses __inline__. Since we #define inline above, to ensure
 154  * __inline__ has the same semantics, we need this #define.
 155  *
 156  * However, the spelling __inline is strictly reserved for referring
 157  * to the bare keyword.
 158  */
 159 #define __inline__ inline
 160 
 161 /*
 162  * GCC does not warn about unused static inline functions for -Wunused-function.
 163  * Suppress the warning in clang as well by using __maybe_unused, but enable it
 164  * for W=1 build. This will allow clang to find unused functions. Remove the
 165  * __inline_maybe_unused entirely after fixing most of -Wunused-function warnings.
 166  */
 167 #ifdef KBUILD_EXTRA_WARN1
 168 #define __inline_maybe_unused
 169 #else
 170 #define __inline_maybe_unused __maybe_unused
 171 #endif
 172 
 173 /*
 174  * Rather then using noinline to prevent stack consumption, use
 175  * noinline_for_stack instead.  For documentation reasons.
 176  */
 177 #define noinline_for_stack noinline
 178 
 179 #endif /* __KERNEL__ */
 180 
 181 #endif /* __ASSEMBLY__ */
 182 
 183 /*
 184  * The below symbols may be defined for one or more, but not ALL, of the above
 185  * compilers. We don't consider that to be an error, so set them to nothing.
 186  * For example, some of them are for compiler specific plugins.
 187  */
 188 #ifndef __latent_entropy
 189 # define __latent_entropy
 190 #endif
 191 
 192 #ifndef __randomize_layout
 193 # define __randomize_layout __designated_init
 194 #endif
 195 
 196 #ifndef __no_randomize_layout
 197 # define __no_randomize_layout
 198 #endif
 199 
 200 #ifndef randomized_struct_fields_start
 201 # define randomized_struct_fields_start
 202 # define randomized_struct_fields_end
 203 #endif
 204 
 205 #ifndef asm_volatile_goto
 206 #define asm_volatile_goto(x...) asm goto(x)
 207 #endif
 208 
 209 #ifdef CONFIG_CC_HAS_ASM_INLINE
 210 #define asm_inline asm __inline
 211 #else
 212 #define asm_inline asm
 213 #endif
 214 
 215 #ifndef __no_fgcse
 216 # define __no_fgcse
 217 #endif
 218 
 219 /* Are two types/vars the same type (ignoring qualifiers)? */
 220 #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 221 
 222 /* Is this type a native word size -- useful for atomic operations */
 223 #define __native_word(t) \
 224         (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
 225          sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
 226 
 227 /* Helpers for emitting diagnostics in pragmas. */
 228 #ifndef __diag
 229 #define __diag(string)
 230 #endif
 231 
 232 #ifndef __diag_GCC
 233 #define __diag_GCC(version, severity, string)
 234 #endif
 235 
 236 #define __diag_push()   __diag(push)
 237 #define __diag_pop()    __diag(pop)
 238 
 239 #define __diag_ignore(compiler, version, option, comment) \
 240         __diag_ ## compiler(version, ignore, option)
 241 #define __diag_warn(compiler, version, option, comment) \
 242         __diag_ ## compiler(version, warn, option)
 243 #define __diag_error(compiler, version, option, comment) \
 244         __diag_ ## compiler(version, error, option)
 245 
 246 #endif /* __LINUX_COMPILER_TYPES_H */

/* [<][>][^][v][top][bottom][index][help] */