Root/
Source at commit 2741 created 8 years 11 months ago. By ifabio, Add data for new logo and clut (grey) from macosxbootloader (Credits to Pike R. Alpha) | |
---|---|
1 | /*␊ |
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 | /*␊ |
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 | /* How to declare a function that *must* be inlined */␊ |
51 | /* Use "extern inline" even in the gcc3+ case to avoid warnings in ctype.h */␊ |
52 | #ifdef __GNUC__␊ |
53 | # if __GNUC__ >= 3␊ |
54 | # define __must_inline __extern_inline __attribute__((__always_inline__))␊ |
55 | # 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 | # define __likely(x) __builtin_expect(!!(x), 1)␊ |
124 | # define __unlikely(x) __builtin_expect(!!(x), 0)␊ |
125 | #else␊ |
126 | # define __likely(x) (!!(x))␊ |
127 | # define __unlikely(x) (!!(x))␊ |
128 | #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␊ |
159 |