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

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines