Moved definition of __shared into compiler.h
[people/lynusvaz/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 #define PACKED __attribute__((packed))
71 #define __unused __attribute__((unused))
72 #define __used __attribute__((used))
73
74 /*
75  * To save space in the binary when multiple-driver images are
76  * compiled, uninitialised data areas can be shared between drivers.
77  * This will typically be used to share statically-allocated receive
78  * and transmit buffers between drivers.
79  *
80  * Use as e.g.
81  *
82  *  struct {
83  *      char    rx_buf[NUM_RX_BUF][RX_BUF_SIZE];
84  *      char    tx_buf[TX_BUF_SIZE];
85  *  } my_static_data __shared;
86  *
87  */
88
89 #define __shared __asm__ ( "_shared_bss" );
90
91 #endif /* ASSEMBLY */
92
93 #endif /* COMPILER_H */