Adding upstream version 3.53.
[syslinux-debian/hramrach.git] / com32 / include / klibc / compiler.h
blob02af9a0e7ec5411731d53911d435f53aea058788
1 /*
2 * klibc/compiler.h
4 * Various compiler features
5 */
7 #ifndef _KLIBC_COMPILER_H
8 #define _KLIBC_COMPILER_H
10 #define __user
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
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
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
43 /* "const" function:
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.
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'.
56 #ifdef __GNUC__
57 # define __constfunc __attribute__((const))
58 #else
59 # define __constfunc
60 #endif
61 #undef __attribute_const__
62 #define __attribute_const__ __constfunc
64 /* "pure" function:
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'.
73 #ifdef __GNUC__
74 # define __purefunc __attribute__((pure))
75 #else
76 # define __purefunc
77 #endif
78 #undef __attribute_pure__
79 #define __attribute_pure__ __purefunc
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
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
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
104 /* Possibly unused function */
105 #ifdef __GNUC__
106 # define __unusedfunc __attribute__((unused))
107 #else
108 # define __unusedfunc
109 #endif
111 /* Constructors and destructors */
112 #define __constructor __attribute__((constructor))
113 #define __destructor __attribute__((destructor))
115 /* Packed structures */
116 #define __packed __attribute__((packed))
118 #endif