__attribute__ does not need to be treated as a variadic macro, since
[people/lynusvaz/gpxe.git] / src / include / compiler.h
1 #ifndef COMPILER_H
2 #define COMPILER_H
3
4 /*
5  * Doxygen can't cope with some of the more esoteric areas of C, so we
6  * make its life simpler.
7  *
8  */
9 #ifdef DOXYGEN
10 #define __attribute__(x)
11 #endif
12
13 /*
14  * We export the symbol obj_OBJECT (OBJECT is defined on command-line)
15  * as a global symbol, so that the linker can drag in selected object
16  * files from the library using -u obj_OBJECT.
17  *
18  * Not quite sure why cpp requires two levels of macro call in order
19  * to actually expand OBJECT...
20  */
21 #undef _H1
22 #define _H1( x, y ) x ## y
23 #undef _H2
24 #define _H2( x, y ) _H1 ( x, y )
25 #define PREFIX_OBJECT(prefix) _H2 ( prefix, OBJECT )
26 #define OBJECT_SYMBOL PREFIX_OBJECT(obj_)
27 #undef _STR
28 #define _STR(s) #s
29 #undef _XSTR
30 #define _XSTR(s) _STR(s)
31 #define OBJECT_SYMBOL_STR _XSTR ( OBJECT_SYMBOL )
32
33 #ifdef ASSEMBLY
34
35         .globl  OBJECT_SYMBOL
36         .equ    OBJECT_SYMBOL, 0
37
38 #else /* ASSEMBLY */
39
40 __asm__ ( ".globl\t" OBJECT_SYMBOL_STR );
41 __asm__ ( ".equ\t" OBJECT_SYMBOL_STR ", 0" );
42
43 /*
44  * Macro to allow objects to explicitly drag in other objects by
45  * object name.  Used by config.c.
46  *
47  */
48 #define REQUIRE_OBJECT(object) \
49         __asm__ ( ".equ\tneed_" #object ", obj_" #object );
50
51 /*
52  * If debug_OBJECT is set to a true value, the macro DBG(...) will
53  * expand to printf(...) when compiling OBJECT, and the symbol
54  * DEBUG_LEVEL will be inserted into the object file.
55  *
56  */
57 #define DEBUG_SYMBOL PREFIX_OBJECT(debug_)
58
59 #if DEBUG_SYMBOL
60 #include "console.h"
61 #define DEBUG_SYMBOL_STR _XSTR ( DEBUG_SYMBOL )
62 __asm__ ( ".equ\tDEBUG_LEVEL, " DEBUG_SYMBOL_STR );
63 #endif
64
65 #define DBG_PRINT(...) printf ( __VA_ARGS__ )
66 #define DBG_DISCARD(...)
67 #define DBG  DBG_DISCARD
68 #define DBG2 DBG_DISCARD
69
70 #if DEBUG_SYMBOL >= 1
71 #undef DBG
72 #define DBG DBG_PRINT
73 #endif
74
75 #if DEBUG_SYMBOL >= 2
76 #undef DBG2
77 #define DBG2 DBG_PRINT
78 #endif
79
80 /*
81  * ASSERT() macros
82  *
83  */
84 #define ASSERT(x)
85
86 #if DEBUG_SYMBOL >= 1
87 #undef ASSERT
88 #define ASSERT(x)                                                             \
89         do {                                                                  \
90                 if ( ! (x) ) {                                                \
91                         DBG ( "ASSERT(%s) failed at %s line %d [%s]\n", #x,   \
92                               __FILE__, __LINE__, __FUNCTION__ );             \
93                 }                                                             \
94         } while (0)
95 #endif
96
97 /*
98  * Commonly-used attributes.
99  *
100  * Note that __used can be used only for functions.  If you have a
101  * static variable declaration that you want to force to be included,
102  * use __unused.
103  *
104  */
105 #define PACKED __attribute__ (( packed ))
106 #define __unused __attribute__ (( unused ))
107 #define __used __attribute__ (( used ))
108 #define __aligned __attribute__ (( aligned ( 16 ) ))
109
110 /*
111  * To save space in the binary when multiple-driver images are
112  * compiled, uninitialised data areas can be shared between drivers.
113  * This will typically be used to share statically-allocated receive
114  * and transmit buffers between drivers.
115  *
116  * Use as e.g.
117  *
118  *  struct {
119  *      char    rx_buf[NUM_RX_BUF][RX_BUF_SIZE];
120  *      char    tx_buf[TX_BUF_SIZE];
121  *  } my_static_data __shared;
122  *
123  */
124
125 #define __shared __asm__ ( "_shared_bss" )
126
127 #endif /* ASSEMBLY */
128
129 #endif /* COMPILER_H */