|
|
1.1 root 1: #ifndef _ASSERT_H
2: #define _ASSERT_H
3:
4: /** @file
5: *
6: * Assertions
7: *
8: * This file provides two assertion macros: assert() (for run-time
9: * assertions) and linker_assert() (for link-time assertions).
10: *
11: */
12:
13: FILE_LICENCE ( GPL2_OR_LATER );
14:
15: #ifdef NDEBUG
16: #define ASSERTING 0
17: #else
18: #define ASSERTING 1
19: #endif
20:
21: /** printf() for assertions
22: *
23: * This function exists so that the assert() macro can expand to
24: * printf() calls without dragging the printf() prototype into scope.
25: *
26: * As far as the compiler is concerned, assert_printf() and printf() are
27: * completely unrelated calls; it's only at the assembly stage that
28: * references to the assert_printf symbol are collapsed into references
29: * to the printf symbol.
30: */
31: extern int __attribute__ (( format ( printf, 1, 2 ) ))
32: assert_printf ( const char *fmt, ... ) asm ( "printf" );
33:
34: /**
35: * Assert a condition at run-time.
36: *
37: * If the condition is not true, a debug message will be printed.
38: * Assertions only take effect in debug-enabled builds (see DBG()).
39: *
40: * @todo Make an assertion failure abort the program
41: *
42: */
43: #define assert( condition ) \
44: do { \
45: if ( ASSERTING && ! (condition) ) { \
46: assert_printf ( "assert(%s) failed at %s line %d\n", \
47: #condition, __FILE__, __LINE__ ); \
48: } \
49: } while ( 0 )
50:
51: /**
52: * Assert a condition at link-time.
53: *
54: * If the condition is not true, the link will fail with an unresolved
55: * symbol (error_symbol).
56: *
57: * This macro is iPXE-specific. Do not use this macro in code
58: * intended to be portable.
59: *
60: */
61: #define linker_assert( condition, error_symbol ) \
62: if ( ! (condition) ) { \
63: extern void error_symbol ( void ); \
64: error_symbol(); \
65: }
66:
67: #endif /* _ASSERT_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.