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 */
25 # if __GNUC_MAJOR__ >= 3
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
41 /* How to declare a "constant" function (a function in the
42 mathematical sense) */
44 # define __constfunc __attribute__((const))
49 /* Format attribute */
51 # define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
53 # define __formatfunc(t,f,a)
57 #if defined(__GNUC__) && (__GNUC_MAJOR__ > 2 || (__GNUC_MAJOR__ == 2 && __GNUC_MINOR__ >= 95))
58 # define __likely(x) __builtin_expect((x), 1)
59 # define __unlikely(x) __builtin_expect((x), 0)
61 # define __likely(x) (x)
62 # define __unlikely(x) (x)
65 /* Possibly unused function */
67 # define __unusedfunc __attribute__((unused))
74 Many functions have no effects except the return value and their
75 return value depends only on the parameters and/or global
76 variables. Such a function can be subject to common subexpression
77 elimination and loop optimization just as an arithmetic operator
78 would be. These functions should be declared with the attribute
82 # define __attribute_pure__ __attribute__((pure))
84 # define __attribute_pure__
89 Many functions do not examine any values except their arguments,
90 and have no effects except the return value. Basically this is
91 just slightly more strict class than the `pure' attribute above,
92 since function is not allowed to read global memory.
94 Note that a function that has pointer arguments and examines the
95 data pointed to must _not_ be declared `const'. Likewise, a
96 function that calls a non-`const' function usually must not be
97 `const'. It does not make sense for a `const' function to return
101 # define __attribute_const__ __attribute__((const))
103 # define __attribute_const__