Subversion Repositories Kolibri OS

Rev

Rev 1964 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #ifndef __LINUX_COMPILER_H
  2. #define __LINUX_COMPILER_H
  3.  
  4. #ifndef __ASSEMBLY__
  5.  
  6. #ifdef __CHECKER__
  7. # define __user         __attribute__((noderef, address_space(1)))
  8. # define __kernel       /* default address space */
  9. # define __safe         __attribute__((safe))
  10. # define __force        __attribute__((force))
  11. # define __nocast       __attribute__((nocast))
  12. # define __iomem        __attribute__((noderef, address_space(2)))
  13. # define __acquires(x)  __attribute__((context(x,0,1)))
  14. # define __releases(x)  __attribute__((context(x,1,0)))
  15. # define __acquire(x)   __context__(x,1)
  16. # define __release(x)   __context__(x,-1)
  17. # define __cond_lock(x,c)       ((c) ? ({ __acquire(x); 1; }) : 0)
  18. extern void __chk_user_ptr(const volatile void __user *);
  19. extern void __chk_io_ptr(const volatile void __iomem *);
  20. #else
  21. # define __user
  22. # define __kernel
  23. # define __safe
  24. # define __force
  25. # define __nocast
  26. # define __iomem
  27. # define __chk_user_ptr(x) (void)0
  28. # define __chk_io_ptr(x) (void)0
  29. # define __builtin_warning(x, y...) (1)
  30. # define __acquires(x)
  31. # define __releases(x)
  32. # define __acquire(x) (void)0
  33. # define __release(x) (void)0
  34. # define __cond_lock(x,c) (c)
  35. #endif
  36.  
  37. #ifdef __KERNEL__
  38.  
  39. #ifdef __GNUC__
  40. #include <linux/compiler-gcc.h>
  41. #endif
  42.  
  43. #define notrace __attribute__((no_instrument_function))
  44.  
  45. /* Intel compiler defines __GNUC__. So we will overwrite implementations
  46.  * coming from above header files here
  47.  */
  48. #ifdef __INTEL_COMPILER
  49. # include <linux/compiler-intel.h>
  50. #endif
  51.  
  52. /*
  53.  * Generic compiler-dependent macros required for kernel
  54.  * build go below this comment. Actual compiler/compiler version
  55.  * specific implementations come from the above header files
  56.  */
  57.  
  58. struct ftrace_branch_data {
  59.         const char *func;
  60.         const char *file;
  61.         unsigned line;
  62.         union {
  63.                 struct {
  64.                         unsigned long correct;
  65.                         unsigned long incorrect;
  66.                 };
  67.                 struct {
  68.                         unsigned long miss;
  69.                         unsigned long hit;
  70.                 };
  71.                 unsigned long miss_hit[2];
  72.         };
  73. };
  74.  
  75. /*
  76.  * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
  77.  * to disable branch tracing on a per file basis.
  78.  */
  79. #if defined(CONFIG_TRACE_BRANCH_PROFILING) \
  80.     && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
  81. void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
  82.  
  83. #define likely_notrace(x)       __builtin_expect(!!(x), 1)
  84. #define unlikely_notrace(x)     __builtin_expect(!!(x), 0)
  85.  
  86. #define __branch_check__(x, expect) ({                                  \
  87.                         int ______r;                                    \
  88.                         static struct ftrace_branch_data                \
  89.                                 __attribute__((__aligned__(4)))         \
  90.                                 __attribute__((section("_ftrace_annotated_branch"))) \
  91.                                 ______f = {                             \
  92.                                 .func = __func__,                       \
  93.                                 .file = __FILE__,                       \
  94.                                 .line = __LINE__,                       \
  95.                         };                                              \
  96.                         ______r = likely_notrace(x);                    \
  97.                         ftrace_likely_update(&______f, ______r, expect); \
  98.                         ______r;                                        \
  99.                 })
  100.  
  101. /*
  102.  * Using __builtin_constant_p(x) to ignore cases where the return
  103.  * value is always the same.  This idea is taken from a similar patch
  104.  * written by Daniel Walker.
  105.  */
  106. # ifndef likely
  107. #  define likely(x)     (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
  108. # endif
  109. # ifndef unlikely
  110. #  define unlikely(x)   (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
  111. # endif
  112.  
  113. #ifdef CONFIG_PROFILE_ALL_BRANCHES
  114. /*
  115.  * "Define 'is'", Bill Clinton
  116.  * "Define 'if'", Steven Rostedt
  117.  */
  118. #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
  119. #define __trace_if(cond) \
  120.         if (__builtin_constant_p((cond)) ? !!(cond) :                   \
  121.         ({                                                              \
  122.                 int ______r;                                            \
  123.                 static struct ftrace_branch_data                        \
  124.                         __attribute__((__aligned__(4)))                 \
  125.                         __attribute__((section("_ftrace_branch")))      \
  126.                         ______f = {                                     \
  127.                                 .func = __func__,                       \
  128.                                 .file = __FILE__,                       \
  129.                                 .line = __LINE__,                       \
  130.                         };                                              \
  131.                 ______r = !!(cond);                                     \
  132.                 ______f.miss_hit[______r]++;                                    \
  133.                 ______r;                                                \
  134.         }))
  135. #endif /* CONFIG_PROFILE_ALL_BRANCHES */
  136.  
  137. #else
  138. # define likely(x)      __builtin_expect(!!(x), 1)
  139. # define unlikely(x)    __builtin_expect(!!(x), 0)
  140. #endif
  141.  
  142. /* Optimization barrier */
  143. #ifndef barrier
  144. # define barrier() __memory_barrier()
  145. #endif
  146.  
  147. /* Unreachable code */
  148. #ifndef unreachable
  149. # define unreachable() do { } while (1)
  150. #endif
  151.  
  152. #ifndef RELOC_HIDE
  153. # define RELOC_HIDE(ptr, off)                                   \
  154.   ({ unsigned long __ptr;                                       \
  155.      __ptr = (unsigned long) (ptr);                             \
  156.     (typeof(ptr)) (__ptr + (off)); })
  157. #endif
  158.  
  159. #endif /* __KERNEL__ */
  160.  
  161. #endif /* __ASSEMBLY__ */
  162.  
  163. #ifdef __KERNEL__
  164. /*
  165.  * Allow us to mark functions as 'deprecated' and have gcc emit a nice
  166.  * warning for each use, in hopes of speeding the functions removal.
  167.  * Usage is:
  168.  *              int __deprecated foo(void)
  169.  */
  170. #ifndef __deprecated
  171. # define __deprecated           /* unimplemented */
  172. #endif
  173.  
  174. #ifdef MODULE
  175. #define __deprecated_for_modules __deprecated
  176. #else
  177. #define __deprecated_for_modules
  178. #endif
  179.  
  180. #ifndef __must_check
  181. #define __must_check
  182. #endif
  183.  
  184. #ifndef CONFIG_ENABLE_MUST_CHECK
  185. #undef __must_check
  186. #define __must_check
  187. #endif
  188. #ifndef CONFIG_ENABLE_WARN_DEPRECATED
  189. #undef __deprecated
  190. #undef __deprecated_for_modules
  191. #define __deprecated
  192. #define __deprecated_for_modules
  193. #endif
  194.  
  195. /*
  196.  * Allow us to avoid 'defined but not used' warnings on functions and data,
  197.  * as well as force them to be emitted to the assembly file.
  198.  *
  199.  * As of gcc 3.4, static functions that are not marked with attribute((used))
  200.  * may be elided from the assembly file.  As of gcc 3.4, static data not so
  201.  * marked will not be elided, but this may change in a future gcc version.
  202.  *
  203.  * NOTE: Because distributions shipped with a backported unit-at-a-time
  204.  * compiler in gcc 3.3, we must define __used to be __attribute__((used))
  205.  * for gcc >=3.3 instead of 3.4.
  206.  *
  207.  * In prior versions of gcc, such functions and data would be emitted, but
  208.  * would be warned about except with attribute((unused)).
  209.  *
  210.  * Mark functions that are referenced only in inline assembly as __used so
  211.  * the code is emitted even though it appears to be unreferenced.
  212.  */
  213. #ifndef __used
  214. # define __used                 /* unimplemented */
  215. #endif
  216.  
  217. #ifndef __maybe_unused
  218. # define __maybe_unused         /* unimplemented */
  219. #endif
  220.  
  221. #ifndef __always_unused
  222. # define __always_unused        /* unimplemented */
  223. #endif
  224.  
  225. #ifndef noinline
  226. #define noinline
  227. #endif
  228.  
  229. /*
  230.  * Rather then using noinline to prevent stack consumption, use
  231.  * noinline_for_stack instead.  For documentaiton reasons.
  232.  */
  233. #define noinline_for_stack noinline
  234.  
  235. #ifndef __always_inline
  236. #define __always_inline inline
  237. #endif
  238.  
  239. #endif /* __KERNEL__ */
  240.  
  241. /*
  242.  * From the GCC manual:
  243.  *
  244.  * Many functions do not examine any values except their arguments,
  245.  * and have no effects except the return value.  Basically this is
  246.  * just slightly more strict class than the `pure' attribute above,
  247.  * since function is not allowed to read global memory.
  248.  *
  249.  * Note that a function that has pointer arguments and examines the
  250.  * data pointed to must _not_ be declared `const'.  Likewise, a
  251.  * function that calls a non-`const' function usually must not be
  252.  * `const'.  It does not make sense for a `const' function to return
  253.  * `void'.
  254.  */
  255. #ifndef __attribute_const__
  256. # define __attribute_const__    /* unimplemented */
  257. #endif
  258.  
  259. /*
  260.  * Tell gcc if a function is cold. The compiler will assume any path
  261.  * directly leading to the call is unlikely.
  262.  */
  263.  
  264. #ifndef __cold
  265. #define __cold
  266. #endif
  267.  
  268. /* Simple shorthand for a section definition */
  269. #ifndef __section
  270. # define __section(S) __attribute__ ((__section__(#S)))
  271. #endif
  272.  
  273. /* Are two types/vars the same type (ignoring qualifiers)? */
  274. #ifndef __same_type
  275. # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
  276. #endif
  277.  
  278. /* Compile time object size, -1 for unknown */
  279. #ifndef __compiletime_object_size
  280. # define __compiletime_object_size(obj) -1
  281. #endif
  282. #ifndef __compiletime_warning
  283. # define __compiletime_warning(message)
  284. #endif
  285. #ifndef __compiletime_error
  286. # define __compiletime_error(message)
  287. #endif
  288.  
  289. /*
  290.  * Prevent the compiler from merging or refetching accesses.  The compiler
  291.  * is also forbidden from reordering successive instances of ACCESS_ONCE(),
  292.  * but only when the compiler is aware of some particular ordering.  One way
  293.  * to make the compiler aware of ordering is to put the two invocations of
  294.  * ACCESS_ONCE() in different C statements.
  295.  *
  296.  * This macro does absolutely -nothing- to prevent the CPU from reordering,
  297.  * merging, or refetching absolutely anything at any time.  Its main intended
  298.  * use is to mediate communication between process-level code and irq/NMI
  299.  * handlers, all running on the same CPU.
  300.  */
  301. #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
  302.  
  303. #endif /* __LINUX_COMPILER_H */
  304.