ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.pod
Revision: 1.20
Committed: Fri May 27 00:12:00 2011 UTC (13 years ago) by root
Branch: MAIN
Changes since 1.19: +20 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.14 =head1 LIBECB - e-C-Builtins
2 root 1.3
3 root 1.14 =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 sf-exg 1.16 It's part of the e-suite of libraries, other members of which include
9 root 1.14 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 sf-exg 1.16 it provides a number of other lowlevel C utilities, such as endianness
18 root 1.14 detection, byte swapping or bit rotations.
19    
20 root 1.17 Or in other words, things that should be built-in into any standard C
21 root 1.18 system, but aren't.
22 root 1.17
23 root 1.14 More might come.
24 root 1.3
25     =head2 ABOUT THE HEADER
26    
27 root 1.14 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 sf-exg 1.16 There are currently no object files to link to - future versions might
36 root 1.14 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 root 1.1
58     =head2 GCC ATTRIBUTES
59    
60 root 1.20 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 root 1.3
76 root 1.1 =over 4
77    
78 root 1.2 =item ecb_attribute ((attrs...))
79 root 1.1
80 root 1.15 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 root 1.2
88 root 1.3 =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 root 1.15 {
95     int var ecb_unused;
96 root 1.3
97 root 1.15 #ifdef SOMECONDITION
98     var = ...;
99     return var;
100     #else
101     return 0;
102     #endif
103     }
104 root 1.3
105 root 1.2 =item ecb_noinline
106    
107 root 1.9 Prevent a function from being inlined - it might be optimised away, but
108 root 1.3 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 root 1.2 =item ecb_noreturn
112    
113 root 1.17 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 sf-exg 1.19 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 root 1.17
127 root 1.2 =item ecb_const
128    
129 sf-exg 1.19 Declares that the function only depends on the values of its arguments,
130 root 1.17 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 sf-exg 1.19 such as a function returning the square root of its input argument.
141 root 1.17
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 root 1.2 =item ecb_pure
149    
150 root 1.17 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 root 1.2 =item ecb_hot
165    
166 root 1.17 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 sf-exg 1.19 Whether a function is hot or not often depends on the whole program,
174 root 1.17 and less on the function itself. C<ecb_cold> is likely more useful in
175     practise.
176    
177 root 1.2 =item ecb_cold
178    
179 root 1.17 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 sf-exg 1.19 C<ecb_unlikely> had been used to reach them.
189 root 1.17
190     Good examples for such functions would be error reporting functions, or
191     functions only called in exceptional or rare cases.
192    
193 root 1.2 =item ecb_artificial
194    
195 root 1.17 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 root 1.2 =back
221 root 1.1
222     =head2 OPTIMISATION HINTS
223    
224     =over 4
225    
226 root 1.14 =item bool ecb_is_constant(expr)
227 root 1.1
228 root 1.3 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 root 1.5 0..n-1, then you could use this inline function in a header file:
234 root 1.3
235     ecb_inline uint32_t
236     rndm (uint32_t n)
237     {
238 root 1.6 return (n * (uint32_t)rndm16 ()) >> 16;
239 root 1.3 }
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 root 1.6 : (n * (uint32_t)rndm16 ()) >> 16;
252 root 1.3 }
253    
254 root 1.14 =item bool ecb_expect (expr, value)
255 root 1.1
256 root 1.7 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 root 1.1
260 root 1.7 Usually, you want to use the more intuitive C<ecb_likely> and
261     C<ecb_unlikely> functions instead.
262 root 1.1
263 root 1.15 =item bool ecb_likely (cond)
264 root 1.1
265 root 1.15 =item bool ecb_unlikely (cond)
266 root 1.1
267 root 1.7 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 sf-exg 1.11 is likely to be true (and for C<ecb_unlikely>, that it is unlikely to be
277 root 1.7 true).
278    
279 root 1.9 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 root 1.7
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 root 1.9 each time something is added, you have to check for a buffer overrun, but
295 root 1.7 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 root 1.14 =item bool ecb_assume (cond)
306 root 1.7
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 root 1.9 never be executed. Apart from suppressing a warning in some cases, this
339 root 1.7 function can be used to implement C<ecb_assume> or similar functions.
340    
341 root 1.14 =item bool ecb_prefetch (addr, rw, locality)
342 root 1.7
343     Tells the compiler to try to prefetch memory at the given C<addr>ess
344 root 1.10 for either reading (C<rw> = 0) or writing (C<rw> = 1). A C<locality> of
345 root 1.7 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 root 1.9 array you loop over. This prefetches memory some 128 array elements later,
353 root 1.7 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 root 1.1
377 root 1.2 =back
378 root 1.1
379     =head2 BIT FIDDLING / BITSTUFFS
380    
381 root 1.4 =over 4
382    
383 root 1.3 =item bool ecb_big_endian ()
384    
385     =item bool ecb_little_endian ()
386    
387 sf-exg 1.11 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 root 1.3 =item int ecb_ctz32 (uint32_t x)
392    
393 sf-exg 1.11 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 root 1.15 ecb_ctz32 (3) = 0
400     ecb_ctz32 (6) = 1
401 sf-exg 1.11
402 root 1.3 =item int ecb_popcount32 (uint32_t x)
403    
404 sf-exg 1.11 Returns the number of bits set to 1 in C<x>. For example:
405    
406 root 1.15 ecb_popcount32 (7) = 3
407     ecb_popcount32 (255) = 8
408 sf-exg 1.11
409 root 1.8 =item uint32_t ecb_bswap16 (uint32_t x)
410    
411 root 1.3 =item uint32_t ecb_bswap32 (uint32_t x)
412    
413 sf-exg 1.13 These two functions return the value of the 16-bit (32-bit) variable
414     C<x> after reversing the order of bytes.
415    
416 root 1.3 =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 sf-exg 1.11 These two functions return the value of C<x> after shifting all the bits
421     by C<count> positions to the right or left respectively.
422    
423 root 1.20 Current GCC versions understand these functions and usually compile them
424     to "optimal" code (e.g. a single C<roll> on x86).
425    
426 root 1.3 =back
427 root 1.1
428     =head2 ARITHMETIC
429    
430 root 1.3 =over 4
431    
432 root 1.14 =item x = ecb_mod (m, n)
433 root 1.3
434 root 1.14 Returns the positive remainder of the modulo operation between C<m> and
435 sf-exg 1.16 C<n>. Unlike the C modulo operator C<%>, this function ensures that the
436 root 1.20 return value is always positive - ISO C guarantees very little when
437     negative numbers are used with C<%>.
438 root 1.14
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 sf-exg 1.11
443 root 1.3 =back
444 root 1.1
445     =head2 UTILITY
446    
447 root 1.3 =over 4
448    
449 root 1.8 =item element_count = ecb_array_length (name) [MACRO]
450 root 1.3
451 sf-exg 1.13 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 root 1.3 =back
460 root 1.1
461