1 /*
2  * klibc/compiler.h
3  *
4  * Various compiler features
5  */
6 
7 #ifndef _KLIBC_COMPILER_H
8 #define _KLIBC_COMPILER_H
9 
10 #define __user
11 
12 /* Specific calling conventions */
13 /* __cdecl is used when we want varadic and non-varadic functions to have
14    the same binary calling convention. */
15 #ifdef __i386__
16 # ifdef __GNUC__
17 #  define __cdecl __attribute__((cdecl,regparm(0)))
18 # else
19   /* Most other C compilers have __cdecl as a keyword */
20 # endif
21 #else
22 # define __cdecl		/* Meaningless on non-i386 */
23 #endif
24 
25 /* How to declare a function that *must* be inlined */
26 #ifdef __GNUC__
27 # if __GNUC_MAJOR__ >= 3
28 #  define __must_inline static __inline__ __attribute__((always_inline))
29 # else
30 #  define __must_inline extern __inline__
31 # endif
32 #else
33 # define __must_inline inline	/* Just hope this works... */
34 #endif
35 
36 /* How to declare a function that does not return */
37 #ifdef __GNUC__
38 # define __noreturn void __attribute__((noreturn))
39 #else
40 # define __noreturn void
41 #endif
42 
43 /* "const" function:
44 
45      Many functions do not examine any values except their arguments,
46      and have no effects except the return value.  Basically this is
47      just slightly more strict class than the `pure' attribute above,
48      since function is not allowed to read global memory.
49 
50      Note that a function that has pointer arguments and examines the
51      data pointed to must _not_ be declared `const'.  Likewise, a
52      function that calls a non-`const' function usually must not be
53      `const'.  It does not make sense for a `const' function to return
54      `void'.
55 */
56 #ifdef __GNUC__
57 # define __constfunc __attribute__((const))
58 #else
59 # define __constfunc
60 #endif
61 #undef __attribute_const__
62 #define __attribute_const__ __constfunc
63 
64 /* "pure" function:
65 
66      Many functions have no effects except the return value and their
67      return value depends only on the parameters and/or global
68      variables.  Such a function can be subject to common subexpression
69      elimination and loop optimization just as an arithmetic operator
70      would be.  These functions should be declared with the attribute
71      `pure'.
72 */
73 #ifdef __GNUC__
74 # define __purefunc __attribute__((pure))
75 #else
76 # define __purefunc
77 #endif
78 #undef __attribute_pure__
79 #define __attribute_pure__ __purefunc
80 
81 /* Format attribute */
82 #ifdef __GNUC__
83 # define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
84 #else
85 # define __formatfunc(t,f,a)
86 #endif
87 
88 /* malloc() function (returns unaliased pointer) */
89 #if defined(__GNUC__) && (__GNUC_MAJOR__ >= 3)
90 # define __mallocfunc __attribute__((malloc))
91 #else
92 # define __mallocfunc
93 #endif
94 
95 /* likely/unlikely */
96 #if defined(__GNUC__) && (__GNUC_MAJOR__ > 2 || (__GNUC_MAJOR__ == 2 && __GNUC_MINOR__ >= 95))
97 # define __likely(x)   __builtin_expect(!!(x), 1)
98 # define __unlikely(x) __builtin_expect(!!(x), 0)
99 #else
100 # define __likely(x)   (!!(x))
101 # define __unlikely(x) (!!(x))
102 #endif
103 
104 /* Possibly unused function */
105 #ifdef __GNUC__
106 # define __unusedfunc	__attribute__((unused))
107 #else
108 # define __unusedfunc
109 #endif
110 
111 /* Declare a variable or data structure as unused. */
112 #ifdef __GNUC__
113 # define __unused	__attribute__((unused))
114 #else
115 # define __unused
116 #endif
117 
118 /* Used symbol */
119 #define __used				__attribute__((used))
120 
121 /* Constructors and destructors */
122 #define __constructor	__attribute__((constructor))
123 #define __destructor	__attribute__((destructor))
124 
125 /* Packed structures */
126 #define __packed	__attribute__((packed))
127 
128 /* Weak symbols */
129 #define __weak          __attribute__((weak))
130 
131 /* Alignment */
132 #define __aligned(x)	__attribute__((aligned(x)))
133 #define __alignas(x)	__attribute__((aligned(__alignof__(x))))
134 
135 /* Handling of common (affect constructors/destructors) */
136 #define __common	__attribute__((common))
137 #define __nocommon	__attribute__((nocommon))
138 
139 /* Weak symbols */
140 #define __weak			__attribute__((weak))
141 
142 #define __export		__attribute__((visibility("default")))
143 
144 #endif
145