ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.pod
(Generate patch)

Comparing libecb/ecb.pod (file contents):
Revision 1.11 by sf-exg, Thu May 26 21:18:52 2011 UTC vs.
Revision 1.20 by root, Fri May 27 00:12:00 2011 UTC

1=head1 LIBECB - e-C-Builtins
2
1=head1 LIBECB 3=head2 ABOUT LIBECB
2 4
3You suck, we don't(tm) 5Libecb is currently a simple header file that doesn't require any
6configuration to use or include in your project.
7
8It's part of the e-suite of libraries, other members of which include
9libev and libeio.
10
11Its homepage can be found here:
12
13 http://software.schmorp.de/pkg/libecb
14
15It mainly provides a number of wrappers around GCC built-ins, together
16with replacement functions for other compilers. In addition to this,
17it provides a number of other lowlevel C utilities, such as endianness
18detection, byte swapping or bit rotations.
19
20Or in other words, things that should be built-in into any standard C
21system, but aren't.
22
23More might come.
4 24
5=head2 ABOUT THE HEADER 25=head2 ABOUT THE HEADER
6 26
7- how to include it 27At the moment, all you have to do is copy F<ecb.h> somewhere where your
8- it includes inttypes.h 28compiler can find it and include it:
9- no .a 29
10- whats a bool 30 #include <ecb.h>
11- function mean macro or function 31
12- macro means untyped 32The header should work fine for both C and C++ compilation, and gives you
33all of F<inttypes.h> in addition to the ECB symbols.
34
35There are currently no object files to link to - future versions might
36come with an (optional) object code library to link against, to reduce
37code size or gain access to additional features.
38
39It also currently includes everything from F<inttypes.h>.
40
41=head2 ABOUT THIS MANUAL / CONVENTIONS
42
43This manual mainly describes each (public) function available after
44including the F<ecb.h> header. The header might define other symbols than
45these, but these are not part of the public API, and not supported in any
46way.
47
48When the manual mentions a "function" then this could be defined either as
49as inline function, a macro, or an external symbol.
50
51When functions use a concrete standard type, such as C<int> or
52C<uint32_t>, then the corresponding function works only with that type. If
53only a generic name is used (C<expr>, C<cond>, C<value> and so on), then
54the corresponding function relies on C to implement the correct types, and
55is usually implemented as a macro. Specifically, a "bool" in this manual
56refers to any kind of boolean value, not a specific type.
13 57
14=head2 GCC ATTRIBUTES 58=head2 GCC ATTRIBUTES
15 59
16blabla where to put, what others 60A major part of libecb deals with GCC attributes. These are additional
61attributes that you cna assign to functions, variables and sometimes even
62types - much like C<const> or C<volatile> in C.
63
64While GCC allows declarations to show up in many surprising places,
65but not in many expeted places, the safest way is to put attribute
66declarations before the whole declaration:
67
68 ecb_const int mysqrt (int a);
69 ecb_unused int i;
70
71For variables, it is often nicer to put the attribute after the name, and
72avoid multiple declarations using commas:
73
74 int i ecb_unused;
17 75
18=over 4 76=over 4
19 77
20=item ecb_attribute ((attrs...)) 78=item ecb_attribute ((attrs...))
21 79
22A simple wrapper that expands to C<__attribute__((attrs))> on GCC, and 80A simple wrapper that expands to C<__attribute__((attrs))> on GCC, and to
23to nothing on other compilers, so the effect is that only GCC sees these. 81nothing on other compilers, so the effect is that only GCC sees these.
82
83Example: use the C<deprecated> attribute on a function.
84
85 ecb_attribute((__deprecated__)) void
86 do_not_use_me_anymore (void);
24 87
25=item ecb_unused 88=item ecb_unused
26 89
27Marks a function or a variable as "unused", which simply suppresses a 90Marks a function or a variable as "unused", which simply suppresses a
28warning by GCC when it detects it as unused. This is useful when you e.g. 91warning by GCC when it detects it as unused. This is useful when you e.g.
29declare a variable but do not always use it: 92declare a variable but do not always use it:
30 93
31 { 94 {
32 int var ecb_unused; 95 int var ecb_unused;
33 96
34 #ifdef SOMECONDITION 97 #ifdef SOMECONDITION
35 var = ...; 98 var = ...;
36 return var; 99 return var;
37 #else 100 #else
38 return 0; 101 return 0;
39 #endif 102 #endif
40 } 103 }
41 104
42=item ecb_noinline 105=item ecb_noinline
43 106
44Prevent a function from being inlined - it might be optimised away, but 107Prevent a function from being inlined - it might be optimised away, but
45not inlined into other functions. This is useful if you know your function 108not inlined into other functions. This is useful if you know your function
46is rarely called and large enough for inlining not to be helpful. 109is rarely called and large enough for inlining not to be helpful.
47 110
48=item ecb_noreturn 111=item ecb_noreturn
49 112
113Marks a function as "not returning, ever". Some typical functions that
114don't return are C<exit> or C<abort> (which really works hard to not
115return), and now you can make your own:
116
117 ecb_noreturn void
118 my_abort (const char *errline)
119 {
120 puts (errline);
121 abort ();
122 }
123
124In this case, the compiler would probably be smart enough to deduce it on
125its own, so this is mainly useful for declarations.
126
50=item ecb_const 127=item ecb_const
51 128
129Declares that the function only depends on the values of its arguments,
130much like a mathematical function. It specifically does not read or write
131any memory any arguments might point to, global variables, or call any
132non-const functions. It also must not have any side effects.
133
134Such a function can be optimised much more aggressively by the compiler -
135for example, multiple calls with the same arguments can be optimised into
136a single call, which wouldn't be possible if the compiler would have to
137expect any side effects.
138
139It is best suited for functions in the sense of mathematical functions,
140such as a function returning the square root of its input argument.
141
142Not suited would be a function that calculates the hash of some memory
143area you pass in, prints some messages or looks at a global variable to
144decide on rounding.
145
146See C<ecb_pure> for a slightly less restrictive class of functions.
147
52=item ecb_pure 148=item ecb_pure
53 149
150Similar to C<ecb_const>, declares a function that has no side
151effects. Unlike C<ecb_const>, the function is allowed to examine global
152variables and any other memory areas (such as the ones passed to it via
153pointers).
154
155While these functions cannot be optimised as aggressively as C<ecb_const>
156functions, they can still be optimised away in many occasions, and the
157compiler has more freedom in moving calls to them around.
158
159Typical examples for such functions would be C<strlen> or C<memcmp>. A
160function that calculates the MD5 sum of some input and updates some MD5
161state passed as argument would I<NOT> be pure, however, as it would modify
162some memory area that is not the return value.
163
54=item ecb_hot 164=item ecb_hot
55 165
166This declares a function as "hot" with regards to the cache - the function
167is used so often, that it is very beneficial to keep it in the cache if
168possible.
169
170The compiler reacts by trying to place hot functions near to each other in
171memory.
172
173Whether a function is hot or not often depends on the whole program,
174and less on the function itself. C<ecb_cold> is likely more useful in
175practise.
176
56=item ecb_cold 177=item ecb_cold
57 178
179The opposite of C<ecb_hot> - declares a function as "cold" with regards to
180the cache, or in other words, this function is not called often, or not at
181speed-critical times, and keeping it in the cache might be a waste of said
182cache.
183
184In addition to placing cold functions together (or at least away from hot
185functions), this knowledge can be used in other ways, for example, the
186function will be optimised for size, as opposed to speed, and codepaths
187leading to calls to those functions can automatically be marked as if
188C<ecb_unlikely> had been used to reach them.
189
190Good examples for such functions would be error reporting functions, or
191functions only called in exceptional or rare cases.
192
58=item ecb_artificial 193=item ecb_artificial
59 194
195Declares the function as "artificial", in this case meaning that this
196function is not really mean to be a function, but more like an accessor
197- many methods in C++ classes are mere accessor functions, and having a
198crash reported in such a method, or single-stepping through them, is not
199usually so helpful, especially when it's inlined to just a few instructions.
200
201Marking them as artificial will instruct the debugger about just this,
202leading to happier debugging and thus happier lives.
203
204Example: in some kind of smart-pointer class, mark the pointer accessor as
205artificial, so that the whole class acts more like a pointer and less like
206some C++ abstraction monster.
207
208 template<typename T>
209 struct my_smart_ptr
210 {
211 T *value;
212
213 ecb_artificial
214 operator T *()
215 {
216 return value;
217 }
218 };
219
60=back 220=back
61 221
62=head2 OPTIMISATION HINTS 222=head2 OPTIMISATION HINTS
63 223
64=over 4 224=over 4
65 225
66=item bool ecb_is_constant(expr) [MACRO] 226=item bool ecb_is_constant(expr)
67 227
68Returns true iff the expression can be deduced to be a compile-time 228Returns true iff the expression can be deduced to be a compile-time
69constant, and false otherwise. 229constant, and false otherwise.
70 230
71For example, when you have a C<rndm16> function that returns a 16 bit 231For example, when you have a C<rndm16> function that returns a 16 bit
89 return is_constant (n) && !(n & (n - 1)) 249 return is_constant (n) && !(n & (n - 1))
90 ? rndm16 () & (num - 1) 250 ? rndm16 () & (num - 1)
91 : (n * (uint32_t)rndm16 ()) >> 16; 251 : (n * (uint32_t)rndm16 ()) >> 16;
92 } 252 }
93 253
94=item bool ecb_expect (expr, value) [MACRO] 254=item bool ecb_expect (expr, value)
95 255
96Evaluates C<expr> and returns it. In addition, it tells the compiler that 256Evaluates C<expr> and returns it. In addition, it tells the compiler that
97the C<expr> evaluates to C<value> a lot, which can be used for static 257the C<expr> evaluates to C<value> a lot, which can be used for static
98branch optimisations. 258branch optimisations.
99 259
100Usually, you want to use the more intuitive C<ecb_likely> and 260Usually, you want to use the more intuitive C<ecb_likely> and
101C<ecb_unlikely> functions instead. 261C<ecb_unlikely> functions instead.
102 262
103=item bool ecb_likely (bool) [MACRO] 263=item bool ecb_likely (cond)
104 264
105=item bool ecb_unlikely (bool) [MACRO] 265=item bool ecb_unlikely (cond)
106 266
107These two functions expect a expression that is true or false and return 267These two functions expect a expression that is true or false and return
108C<1> or C<0>, respectively, so when used in the condition of an C<if> or 268C<1> or C<0>, respectively, so when used in the condition of an C<if> or
109other conditional statement, it will not change the program: 269other conditional statement, it will not change the program:
110 270
140 { 300 {
141 if (ecb_unlikely (current + size > end)) 301 if (ecb_unlikely (current + size > end))
142 real_reserve_method (size); /* presumably noinline */ 302 real_reserve_method (size); /* presumably noinline */
143 } 303 }
144 304
145=item bool ecb_assume (cond) [MACRO] 305=item bool ecb_assume (cond)
146 306
147Try to tell the compiler that some condition is true, even if it's not 307Try to tell the compiler that some condition is true, even if it's not
148obvious. 308obvious.
149 309
150This can be used to teach the compiler about invariants or other 310This can be used to teach the compiler about invariants or other
176 336
177This function does nothing itself, except tell the compiler that it will 337This function does nothing itself, except tell the compiler that it will
178never be executed. Apart from suppressing a warning in some cases, this 338never be executed. Apart from suppressing a warning in some cases, this
179function can be used to implement C<ecb_assume> or similar functions. 339function can be used to implement C<ecb_assume> or similar functions.
180 340
181=item bool ecb_prefetch (addr, rw, locality) [MACRO] 341=item bool ecb_prefetch (addr, rw, locality)
182 342
183Tells the compiler to try to prefetch memory at the given C<addr>ess 343Tells the compiler to try to prefetch memory at the given C<addr>ess
184for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of 344for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of
185C<0> means that there will only be one access later, C<3> means that 345C<0> means that there will only be one access later, C<3> means that
186the data will likely be accessed very often, and values in between mean 346the data will likely be accessed very often, and values in between mean
234equivalently the number of bits set to 0 before the least significant 394equivalently the number of bits set to 0 before the least significant
235bit set), starting from 0. If C<x> is 0 the result is undefined. A 395bit set), starting from 0. If C<x> is 0 the result is undefined. A
236common use case is to compute the integer binary logarithm, i.e., 396common use case is to compute the integer binary logarithm, i.e.,
237floor(log2(n)). For example: 397floor(log2(n)). For example:
238 398
239 ecb_ctz32(3) = 1 399 ecb_ctz32 (3) = 0
240 ecb_ctz32(6) = 2 400 ecb_ctz32 (6) = 1
241 401
242=item int ecb_popcount32 (uint32_t x) 402=item int ecb_popcount32 (uint32_t x)
243 403
244Returns the number of bits set to 1 in C<x>. For example: 404Returns the number of bits set to 1 in C<x>. For example:
245 405
246 ecb_popcount32(7) = 3 406 ecb_popcount32 (7) = 3
247 ecb_popcount32(255) = 8 407 ecb_popcount32 (255) = 8
248 408
249=item uint32_t ecb_bswap16 (uint32_t x) 409=item uint32_t ecb_bswap16 (uint32_t x)
250 410
251=item uint32_t ecb_bswap32 (uint32_t x) 411=item uint32_t ecb_bswap32 (uint32_t x)
412
413These two functions return the value of the 16-bit (32-bit) variable
414C<x> after reversing the order of bytes.
252 415
253=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count) 416=item uint32_t ecb_rotr32 (uint32_t x, unsigned int count)
254 417
255=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count) 418=item uint32_t ecb_rotl32 (uint32_t x, unsigned int count)
256 419
257These two functions return the value of C<x> after shifting all the bits 420These two functions return the value of C<x> after shifting all the bits
258by C<count> positions to the right or left respectively. 421by C<count> positions to the right or left respectively.
259 422
423Current GCC versions understand these functions and usually compile them
424to "optimal" code (e.g. a single C<roll> on x86).
425
260=back 426=back
261 427
262=head2 ARITHMETIC 428=head2 ARITHMETIC
263 429
264=over 4 430=over 4
265 431
266=item x = ecb_mod (m, n) [MACRO] 432=item x = ecb_mod (m, n)
267 433
268Returns the positive remainder of the modulo operation between C<m> 434Returns the positive remainder of the modulo operation between C<m> and
269and C<n>. 435C<n>. Unlike the C modulo operator C<%>, this function ensures that the
436return value is always positive - ISO C guarantees very little when
437negative numbers are used with C<%>.
438
439C<n> must be strictly positive (i.e. C<< >1 >>), while C<m> must be
440negatable, that is, both C<m> and C<-m> must be representable in its
441type.
270 442
271=back 443=back
272 444
273=head2 UTILITY 445=head2 UTILITY
274 446
275=over 4 447=over 4
276 448
277=item element_count = ecb_array_length (name) [MACRO] 449=item element_count = ecb_array_length (name) [MACRO]
278 450
451Returns the number of elements in the array C<name>. For example:
452
453 int primes[] = { 2, 3, 5, 7, 11 };
454 int sum = 0;
455
456 for (i = 0; i < ecb_array_length (primes); i++)
457 sum += primes [i];
458
279=back 459=back
280 460
281 461

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines