syslinux-3.08-2 sources from FC4
[bootcd.git] / syslinux / com32 / include / klibc / compiler.h
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 /* Constructors and destructors */
112 #define __constructor   __attribute__((constructor))
113 #define __destructor    __attribute__((destructor))
114
115 #endif