Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / lwk / compiler.h
1 #ifndef _LWK_COMPILER_H
2 #define _LWK_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(0,1)))
14 # define __releases(x)  __attribute__((context(1,0)))
15 # define __acquire(x)   __context__(1)
16 # define __release(x)   __context__(-1)
17 # define __cond_lock(x) ((x) ? ({ __context__(1); 1; }) : 0)
18 extern void __chk_user_ptr(void __user *);
19 extern void __chk_io_ptr(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) (x)
35 #endif
36
37 #ifdef __KERNEL__
38
39 #if __GNUC__ > 4
40 #error no compiler-gcc.h file for this gcc version
41 #elif __GNUC__ == 4
42 # include <lwk/compiler-gcc4.h>
43 #else
44 # error Sorry, your compiler is too old/not recognized.
45 #endif
46
47 /*
48  * Generic compiler-dependent macros required for kernel
49  * build go below this comment. Actual compiler/compiler version
50  * specific implementations come from the above header files
51  */
52
53 #define likely(x)       __builtin_expect(!!(x), 1)
54 #define unlikely(x)     __builtin_expect(!!(x), 0)
55
56 /* Optimization barrier */
57 #ifndef barrier
58 # define barrier() __memory_barrier()
59 #endif
60
61 #ifndef RELOC_HIDE
62 # define RELOC_HIDE(ptr, off)                                   \
63   ({ unsigned long __ptr;                                       \
64      __ptr = (unsigned long) (ptr);                             \
65     (typeof(ptr)) (__ptr + (off)); })
66 #endif
67
68 #endif /* __KERNEL__ */
69
70 #endif /* __ASSEMBLY__ */
71
72 #ifdef __KERNEL__
73 /*
74  * Allow us to mark functions as 'deprecated' and have gcc emit a nice
75  * warning for each use, in hopes of speeding the functions removal.
76  * Usage is:
77  *              int __deprecated foo(void)
78  */
79 #ifndef __deprecated
80 # define __deprecated           /* unimplemented */
81 #endif
82
83 #ifndef __must_check
84 #define __must_check
85 #endif
86
87 /*
88  * Allow us to avoid 'defined but not used' warnings on functions and data,
89  * as well as force them to be emitted to the assembly file.
90  *
91  * As of gcc 3.3, static functions that are not marked with attribute((used))
92  * may be elided from the assembly file.  As of gcc 3.3, static data not so
93  * marked will not be elided, but this may change in a future gcc version.
94  *
95  * In prior versions of gcc, such functions and data would be emitted, but
96  * would be warned about except with attribute((unused)).
97  */
98 #ifndef __attribute_used__
99 # define __attribute_used__     /* unimplemented */
100 #endif
101
102 /*
103  * From the GCC manual:
104  *
105  * Many functions have no effects except the return value and their
106  * return value depends only on the parameters and/or global
107  * variables.  Such a function can be subject to common subexpression
108  * elimination and loop optimization just as an arithmetic operator
109  * would be.
110  * [...]
111  */
112 #ifndef __attribute_pure__
113 # define __attribute_pure__     /* unimplemented */
114 #endif
115
116 #ifndef noinline
117 #define noinline
118 #endif
119
120 #ifndef __always_inline
121 #define __always_inline inline
122 #endif
123
124 #endif /* __KERNEL__ */
125
126 /*
127  * From the GCC manual:
128  *
129  * Many functions do not examine any values except their arguments,
130  * and have no effects except the return value.  Basically this is
131  * just slightly more strict class than the `pure' attribute above,
132  * since function is not allowed to read global memory.
133  *
134  * Note that a function that has pointer arguments and examines the
135  * data pointed to must _not_ be declared `const'.  Likewise, a
136  * function that calls a non-`const' function usually must not be
137  * `const'.  It does not make sense for a `const' function to return
138  * `void'.
139  */
140 #ifndef __attribute_const__
141 # define __attribute_const__    /* unimplemented */
142 #endif
143
144 #endif /* _LWK_COMPILER_H */