Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/include/klibc/compiler.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1297 - (hide annotations) (download)
Fri May 27 15:12:11 2011 UTC (12 years, 11 months ago) by niro
File MIME type: text/plain
File size: 4221 byte(s)
-updated to klibc-1.5.22 with mntproc definitions patch included
1 niro 532 /*
2     * klibc/compiler.h
3     *
4     * Various compiler features
5     */
6    
7     #ifndef _KLIBC_COMPILER_H
8     #define _KLIBC_COMPILER_H
9    
10     /* Specific calling conventions */
11     /* __cdecl is used when we want varadic and non-varadic functions to have
12     the same binary calling convention. */
13     #ifdef __i386__
14     # ifdef __GNUC__
15     # define __cdecl __attribute__((cdecl,regparm(0)))
16     # else
17     /* Most other C compilers have __cdecl as a keyword */
18     # endif
19     #else
20     # define __cdecl /* Meaningless on non-i386 */
21     #endif
22    
23 niro 1297 /*
24     * How to declare a function which should be inlined or instantiated locally
25     */
26     #ifdef __GNUC__
27     # ifdef __GNUC_STDC_INLINE__
28     # define __static_inline static __inline__ __attribute__((__gnu_inline__))
29     # else
30     # define __static_inline static __inline__
31     # endif
32     #else
33     # define __static_inline inline /* Just hope this works... */
34     #endif
35    
36     /*
37     * How to declare a function which should be inlined or have a call to
38     * an external module
39     */
40     #ifdef __GNUC__
41     # ifdef __GNUC_STDC_INLINE__
42     # define __extern_inline extern __inline__ __attribute__((__gnu_inline__))
43     # else
44     # define __extern_inline extern __inline__
45     # endif
46     #else
47     # define __extern_inline inline /* Just hope this works... */
48     #endif
49    
50 niro 532 /* How to declare a function that *must* be inlined */
51 niro 815 /* Use "extern inline" even in the gcc3+ case to avoid warnings in ctype.h */
52 niro 532 #ifdef __GNUC__
53     # if __GNUC__ >= 3
54 niro 1297 # define __must_inline __extern_inline __attribute__((__always_inline__))
55 niro 532 # else
56     # define __must_inline extern __inline__
57     # endif
58     #else
59     # define __must_inline inline /* Just hope this works... */
60     #endif
61    
62     /* How to declare a function that does not return */
63     #ifdef __GNUC__
64     # define __noreturn void __attribute__((noreturn))
65     #else
66     # define __noreturn void
67     #endif
68    
69     /* "const" function:
70    
71     Many functions do not examine any values except their arguments,
72     and have no effects except the return value. Basically this is
73     just slightly more strict class than the `pure' attribute above,
74     since function is not allowed to read global memory.
75    
76     Note that a function that has pointer arguments and examines the
77     data pointed to must _not_ be declared `const'. Likewise, a
78     function that calls a non-`const' function usually must not be
79     `const'. It does not make sense for a `const' function to return
80     `void'.
81     */
82     #ifdef __GNUC__
83     # define __constfunc __attribute__((const))
84     #else
85     # define __constfunc
86     #endif
87     #undef __attribute_const__
88     #define __attribute_const__ __constfunc
89    
90     /* "pure" function:
91    
92     Many functions have no effects except the return value and their
93     return value depends only on the parameters and/or global
94     variables. Such a function can be subject to common subexpression
95     elimination and loop optimization just as an arithmetic operator
96     would be. These functions should be declared with the attribute
97     `pure'.
98     */
99     #ifdef __GNUC__
100     # define __purefunc __attribute__((pure))
101     #else
102     # define __purefunc
103     #endif
104     #undef __attribute_pure__
105     #define __attribute_pure__ __purefunc
106    
107     /* Format attribute */
108     #ifdef __GNUC__
109     # define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
110     #else
111     # define __formatfunc(t,f,a)
112     #endif
113    
114     /* malloc() function (returns unaliased pointer) */
115     #if defined(__GNUC__) && (__GNUC__ >= 3)
116     # define __mallocfunc __attribute__((malloc))
117     #else
118     # define __mallocfunc
119     #endif
120    
121     /* likely/unlikely */
122     #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
123 niro 815 # define __likely(x) __builtin_expect(!!(x), 1)
124     # define __unlikely(x) __builtin_expect(!!(x), 0)
125 niro 532 #else
126 niro 815 # define __likely(x) (!!(x))
127     # define __unlikely(x) (!!(x))
128 niro 532 #endif
129    
130     /* Possibly unused function */
131     #ifdef __GNUC__
132     # define __unusedfunc __attribute__((unused))
133     #else
134     # define __unusedfunc
135     #endif
136    
137     /* It's all user space... */
138     #define __user
139    
140     /* The bitwise attribute: disallow arithmetric operations */
141     #ifdef __CHECKER__ /* sparse only */
142     # define __bitwise __attribute__((bitwise))
143     #else
144     # define __bitwise
145     #endif
146    
147     /* Shut up unused warnings */
148     #ifdef __GNUC__
149     # define __attribute_used__ __attribute__((used))
150     #else
151     # define __attribute_used__
152     #endif
153    
154     /* Compiler pragma to make an alias symbol */
155     #define __ALIAS(__t, __f, __p, __a) \
156     __t __f __p __attribute__((weak, alias(#__a)));
157    
158     #endif