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