ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.pod
Revision: 1.23
Committed: Fri May 27 01:35:46 2011 UTC (13 years, 1 month ago) by sf-exg
Branch: MAIN
Changes since 1.22: +2 -2 lines
Log Message:
Doc fixes.

File Contents

# Content
1 =head1 LIBECB - e-C-Builtins
2
3 =head2 ABOUT LIBECB
4
5 Libecb is currently a simple header file that doesn't require any
6 configuration to use or include in your project.
7
8 It's part of the e-suite of libraries, other members of which include
9 libev and libeio.
10
11 Its homepage can be found here:
12
13 http://software.schmorp.de/pkg/libecb
14
15 It mainly provides a number of wrappers around GCC built-ins, together
16 with replacement functions for other compilers. In addition to this,
17 it provides a number of other lowlevel C utilities, such as endianness
18 detection, byte swapping or bit rotations.
19
20 Or in other words, things that should be built-in into any standard C
21 system, but aren't.
22
23 More might come.
24
25 =head2 ABOUT THE HEADER
26
27 At the moment, all you have to do is copy F<ecb.h> somewhere where your
28 compiler can find it and include it:
29
30 #include <ecb.h>
31
32 The header should work fine for both C and C++ compilation, and gives you
33 all of F<inttypes.h> in addition to the ECB symbols.
34
35 There are currently no object files to link to - future versions might
36 come with an (optional) object code library to link against, to reduce
37 code size or gain access to additional features.
38
39 It also currently includes everything from F<inttypes.h>.
40
41 =head2 ABOUT THIS MANUAL / CONVENTIONS
42
43 This manual mainly describes each (public) function available after
44 including the F<ecb.h> header. The header might define other symbols than
45 these, but these are not part of the public API, and not supported in any
46 way.
47
48 When the manual mentions a "function" then this could be defined either as
49 as inline function, a macro, or an external symbol.
50
51 When functions use a concrete standard type, such as C<int> or
52 C<uint32_t>, then the corresponding function works only with that type. If
53 only a generic name is used (C<expr>, C<cond>, C<value> and so on), then
54 the corresponding function relies on C to implement the correct types, and
55 is usually implemented as a macro. Specifically, a "bool" in this manual
56 refers to any kind of boolean value, not a specific type.
57
58 =head2 GCC ATTRIBUTES
59
60 A major part of libecb deals with GCC attributes. These are additional
61 attributes that you cna assign to functions, variables and sometimes even
62 types - much like C<const> or C<volatile> in C.
63
64 While GCC allows declarations to show up in many surprising places,
65 but not in many expeted places, the safest way is to put attribute
66 declarations before the whole declaration:
67
68 ecb_const int mysqrt (int a);
69 ecb_unused int i;
70
71 For variables, it is often nicer to put the attribute after the name, and
72 avoid multiple declarations using commas:
73
74 int i ecb_unused;
75
76 =over 4
77
78 =item ecb_attribute ((attrs...))
79
80 A simple wrapper that expands to C<__attribute__((attrs))> on GCC, and to
81 nothing on other compilers, so the effect is that only GCC sees these.
82
83 Example: use the C<deprecated> attribute on a function.
84
85 ecb_attribute((__deprecated__)) void
86 do_not_use_me_anymore (void);
87
88 =item ecb_unused
89
90 Marks a function or a variable as "unused", which simply suppresses a
91 warning by GCC when it detects it as unused. This is useful when you e.g.
92 declare a variable but do not always use it:
93
94 {
95 int var ecb_unused;
96
97 #ifdef SOMECONDITION
98 var = ...;
99 return var;
100 #else
101 return 0;
102 #endif
103 }
104
105 =item ecb_noinline
106
107 Prevent a function from being inlined - it might be optimised away, but
108 not inlined into other functions. This is useful if you know your function
109 is rarely called and large enough for inlining not to be helpful.
110
111 =item ecb_noreturn
112
113 Marks a function as "not returning, ever". Some typical functions that
114 don't return are C<exit> or C<abort> (which really works hard to not
115 return), 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
124 In this case, the compiler would probably be smart enough to deduce it on
125 its own, so this is mainly useful for declarations.
126
127 =item ecb_const
128
129 Declares that the function only depends on the values of its arguments,
130 much like a mathematical function. It specifically does not read or write
131 any memory any arguments might point to, global variables, or call any
132 non-const functions. It also must not have any side effects.
133
134 Such a function can be optimised much more aggressively by the compiler -
135 for example, multiple calls with the same arguments can be optimised into
136 a single call, which wouldn't be possible if the compiler would have to
137 expect any side effects.
138
139 It is best suited for functions in the sense of mathematical functions,
140 such as a function returning the square root of its input argument.
141
142 Not suited would be a function that calculates the hash of some memory
143 area you pass in, prints some messages or looks at a global variable to
144 decide on rounding.
145
146 See C<ecb_pure> for a slightly less restrictive class of functions.
147
148 =item ecb_pure
149
150 Similar to C<ecb_const>, declares a function that has no side
151 effects. Unlike C<ecb_const>, the function is allowed to examine global
152 variables and any other memory areas (such as the ones passed to it via
153 pointers).
154
155 While these functions cannot be optimised as aggressively as C<ecb_const>
156 functions, they can still be optimised away in many occasions, and the
157 compiler has more freedom in moving calls to them around.
158
159 Typical examples for such functions would be C<strlen> or C<memcmp>. A
160 function that calculates the MD5 sum of some input and updates some MD5
161 state passed as argument would I<NOT> be pure, however, as it would modify
162 some memory area that is not the return value.
163
164 =item ecb_hot
165
166 This declares a function as "hot" with regards to the cache - the function
167 is used so often, that it is very beneficial to keep it in the cache if
168 possible.
169
170 The compiler reacts by trying to place hot functions near to each other in
171 memory.
172
173 Whether a function is hot or not often depends on the whole program,
174 and less on the function itself. C<ecb_cold> is likely more useful in
175 practise.
176
177 =item ecb_cold
178
179 The opposite of C<ecb_hot> - declares a function as "cold" with regards to
180 the cache, or in other words, this function is not called often, or not at
181 speed-critical times, and keeping it in the cache might be a waste of said
182 cache.
183
184 In addition to placing cold functions together (or at least away from hot
185 functions), this knowledge can be used in other ways, for example, the
186 function will be optimised for size, as opposed to speed, and codepaths
187 leading to calls to those functions can automatically be marked as if
188 C<ecb_unlikely> had been used to reach them.
189
190 Good examples for such functions would be error reporting functions, or
191 functions only called in exceptional or rare cases.
192
193 =item ecb_artificial
194
195 Declares the function as "artificial", in this case meaning that this
196 function 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
198 crash reported in such a method, or single-stepping through them, is not
199 usually so helpful, especially when it's inlined to just a few instructions.
200
201 Marking them as artificial will instruct the debugger about just this,
202 leading to happier debugging and thus happier lives.
203
204 Example: in some kind of smart-pointer class, mark the pointer accessor as
205 artificial, so that the whole class acts more like a pointer and less like
206 some 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
220 =back
221
222 =head2 OPTIMISATION HINTS
223
224 =over 4
225
226 =item bool ecb_is_constant(expr)
227
228 Returns true iff the expression can be deduced to be a compile-time
229 constant, and false otherwise.
230
231 For example, when you have a C<rndm16> function that returns a 16 bit
232 random number, and you have a function that maps this to a range from
233 0..n-1, then you could use this inline function in a header file:
234
235 ecb_inline uint32_t
236 rndm (uint32_t n)
237 {
238 return (n * (uint32_t)rndm16 ()) >> 16;
239 }
240
241 However, for powers of two, you could use a normal mask, but that is only
242 worth it if, at compile time, you can detect this case. This is the case
243 when the passed number is a constant and also a power of two (C<n & (n -
244 1) == 0>):
245
246 ecb_inline uint32_t
247 rndm (uint32_t n)
248 {
249 return is_constant (n) && !(n & (n - 1))
250 ? rndm16 () & (num - 1)
251 : (n * (uint32_t)rndm16 ()) >> 16;
252 }
253
254 =item bool ecb_expect (expr, value)
255
256 Evaluates C<expr> and returns it. In addition, it tells the compiler that
257 the C<expr> evaluates to C<value> a lot, which can be used for static
258 branch optimisations.
259
260 Usually, you want to use the more intuitive C<ecb_likely> and
261 C<ecb_unlikely> functions instead.
262
263 =item bool ecb_likely (cond)
264
265 =item bool ecb_unlikely (cond)
266
267 These two functions expect a expression that is true or false and return
268 C<1> or C<0>, respectively, so when used in the condition of an C<if> or
269 other conditional statement, it will not change the program:
270
271 /* these two do the same thing */
272 if (some_condition) ...;
273 if (ecb_likely (some_condition)) ...;
274
275 However, by using C<ecb_likely>, you tell the compiler that the condition
276 is likely to be true (and for C<ecb_unlikely>, that it is unlikely to be
277 true).
278
279 For example, when you check for a null pointer and expect this to be a
280 rare, exceptional, case, then use C<ecb_unlikely>:
281
282 void my_free (void *ptr)
283 {
284 if (ecb_unlikely (ptr == 0))
285 return;
286 }
287
288 Consequent use of these functions to mark away exceptional cases or to
289 tell the compiler what the hot path through a function is can increase
290 performance considerably.
291
292 A very good example is in a function that reserves more space for some
293 memory block (for example, inside an implementation of a string stream) -
294 each time something is added, you have to check for a buffer overrun, but
295 you expect that most checks will turn out to be false:
296
297 /* make sure we have "size" extra room in our buffer */
298 ecb_inline void
299 reserve (int size)
300 {
301 if (ecb_unlikely (current + size > end))
302 real_reserve_method (size); /* presumably noinline */
303 }
304
305 =item bool ecb_assume (cond)
306
307 Try to tell the compiler that some condition is true, even if it's not
308 obvious.
309
310 This can be used to teach the compiler about invariants or other
311 conditions that might improve code generation, but which are impossible to
312 deduce form the code itself.
313
314 For example, the example reservation function from the C<ecb_unlikely>
315 description could be written thus (only C<ecb_assume> was added):
316
317 ecb_inline void
318 reserve (int size)
319 {
320 if (ecb_unlikely (current + size > end))
321 real_reserve_method (size); /* presumably noinline */
322
323 ecb_assume (current + size <= end);
324 }
325
326 If you then call this function twice, like this:
327
328 reserve (10);
329 reserve (1);
330
331 Then the compiler I<might> be able to optimise out the second call
332 completely, as it knows that C<< current + 1 > end >> is false and the
333 call will never be executed.
334
335 =item bool ecb_unreachable ()
336
337 This function does nothing itself, except tell the compiler that it will
338 never be executed. Apart from suppressing a warning in some cases, this
339 function can be used to implement C<ecb_assume> or similar functions.
340
341 =item bool ecb_prefetch (addr, rw, locality)
342
343 Tells the compiler to try to prefetch memory at the given C<addr>ess
344 for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of
345 C<0> means that there will only be one access later, C<3> means that
346 the data will likely be accessed very often, and values in between mean
347 something... in between. The memory pointed to by the address does not
348 need to be accessible (it could be a null pointer for example), but C<rw>
349 and C<locality> must be compile-time constants.
350
351 An obvious way to use this is to prefetch some data far away, in a big
352 array you loop over. This prefetches memory some 128 array elements later,
353 in the hope that it will be ready when the CPU arrives at that location.
354
355 int sum = 0;
356
357 for (i = 0; i < N; ++i)
358 {
359 sum += arr [i]
360 ecb_prefetch (arr + i + 128, 0, 0);
361 }
362
363 It's hard to predict how far to prefetch, and most CPUs that can prefetch
364 are often good enough to predict this kind of behaviour themselves. It
365 gets more interesting with linked lists, especially when you do some fair
366 processing on each list element:
367
368 for (node *n = start; n; n = n->next)
369 {
370 ecb_prefetch (n->next, 0, 0);
371 ... do medium amount of work with *n
372 }
373
374 After processing the node, (part of) the next node might already be in
375 cache.
376
377 =back
378
379 =head2 BIT FIDDLING / BITSTUFFS
380
381 =over 4
382
383 =item bool ecb_big_endian ()
384
385 =item bool ecb_little_endian ()
386
387 These two functions return true if the byte order is big endian
388 (most-significant byte first) or little endian (least-significant byte
389 first) respectively.
390
391 =item int ecb_ctz32 (uint32_t x)
392
393 Returns the index of the least significant bit set in C<x> (or
394 equivalently the number of bits set to 0 before the least significant
395 bit set), starting from 0. If C<x> is 0 the result is undefined. A
396 common use case is to compute the integer binary logarithm, i.e.,
397 floor(log2(n)). For example:
398
399 ecb_ctz32 (3) = 0
400 ecb_ctz32 (6) = 1
401
402 =item int ecb_popcount32 (uint32_t x)
403
404 Returns the number of bits set to 1 in C<x>. For example:
405
406 ecb_popcount32 (7) = 3
407 ecb_popcount32 (255) = 8
408
409 =item uint32_t ecb_bswap16 (uint32_t x)
410
411 =item uint32_t ecb_bswap32 (uint32_t x)
412
413 These two functions return the value of the 16-bit (32-bit) value C<x>
414 after reversing the order of bytes (0x11223344 becomes 0x44332211).
415
416 =item uint32_t ecb_rotr32 (uint32_t x, unsigned int count)
417
418 =item uint32_t ecb_rotl32 (uint32_t x, unsigned int count)
419
420 These two functions return the value of C<x> after rotating all the bits
421 by C<count> positions to the right or left respectively.
422
423 Current GCC versions understand these functions and usually compile them
424 to "optimal" code (e.g. a single C<roll> on x86).
425
426 =back
427
428 =head2 ARITHMETIC
429
430 =over 4
431
432 =item x = ecb_mod (m, n)
433
434 Returns the positive remainder of the modulo operation between C<m> and
435 C<n>. Unlike the C modulo operator C<%>, this function ensures that the
436 return value is always positive - ISO C guarantees very little when
437 negative numbers are used with C<%>.
438
439 C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be
440 negatable, that is, both C<m> and C<-m> must be representable in its
441 type.
442
443 =back
444
445 =head2 UTILITY
446
447 =over 4
448
449 =item element_count = ecb_array_length (name)
450
451 Returns 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
459 =back
460
461