4 * Various compiler features
7 #ifndef _KLIBC_COMPILER_H
8 #define _KLIBC_COMPILER_H
10 /* Specific calling conventions */
11 /* __cdecl is used when we want varadic and non-varadic functions to have
12 the same binary calling convention. */
15 # define __cdecl __attribute__((cdecl,regparm(0)))
17 /* Most other C compilers have __cdecl as a keyword */
20 # define __cdecl /* Meaningless on non-i386 */
23 /* How to declare a function that *must* be inlined */
26 # define __must_inline static __inline__ __attribute__((always_inline))
28 # define __must_inline extern __inline__
31 # define __must_inline inline /* Just hope this works... */
34 /* How to declare a function that does not return */
36 # define __noreturn void __attribute__((noreturn))
38 # define __noreturn void
43 Many functions do not examine any values except their arguments,
44 and have no effects except the return value. Basically this is
45 just slightly more strict class than the `pure' attribute above,
46 since function is not allowed to read global memory.
48 Note that a function that has pointer arguments and examines the
49 data pointed to must _not_ be declared `const'. Likewise, a
50 function that calls a non-`const' function usually must not be
51 `const'. It does not make sense for a `const' function to return
55 # define __constfunc __attribute__((const))
59 #undef __attribute_const__
60 #define __attribute_const__ __constfunc
64 Many functions have no effects except the return value and their
65 return value depends only on the parameters and/or global
66 variables. Such a function can be subject to common subexpression
67 elimination and loop optimization just as an arithmetic operator
68 would be. These functions should be declared with the attribute
72 # define __purefunc __attribute__((pure))
76 #undef __attribute_pure__
77 #define __attribute_pure__ __purefunc
79 /* Format attribute */
81 # define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
83 # define __formatfunc(t,f,a)
86 /* malloc() function (returns unaliased pointer) */
87 #if defined(__GNUC__) && (__GNUC__ >= 3)
88 # define __mallocfunc __attribute__((malloc))
94 #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
95 # define __likely(x) __builtin_expect((x), 1)
96 # define __unlikely(x) __builtin_expect((x), 0)
98 # define __likely(x) (x)
99 # define __unlikely(x) (x)
102 /* Possibly unused function */
104 # define __unusedfunc __attribute__((unused))
106 # define __unusedfunc
109 /* It's all user space... */
112 /* The bitwise attribute: disallow arithmetric operations */
113 #ifdef __CHECKER__ /* sparse only */
114 # define __bitwise __attribute__((bitwise))