Force a standard format upon debug messages.
[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 OBJECT_SYMBOL _H2 ( obj_, OBJECT )
16 #undef _STR
17 #define _STR(s) #s
18 #undef _XSTR
19 #define _XSTR(s) _STR(s)
20 #define OBJECT_SYMBOL_STR _XSTR ( OBJECT_SYMBOL )
21
22 #ifdef ASSEMBLY
23
24         .globl  OBJECT_SYMBOL
25         .equ    OBJECT_SYMBOL, 0
26
27 #else /* ASSEMBLY */
28
29 __asm__ ( ".globl\t" OBJECT_SYMBOL_STR );
30 __asm__ ( ".equ\t" OBJECT_SYMBOL_STR ", 0" );
31
32 /*
33  * Macro to allow objects to explicitly drag in other objects by
34  * object name.  Used by config.c.
35  *
36  */
37 #define REQUIRE_OBJECT(object) \
38         __asm__ ( ".equ\tneed_" #object ", obj_" #object );
39
40 /*
41  * If debug_OBJECT is set to a true value, the macro DBG(...) will
42  * expand to printf(...) when compiling OBJECT, and the symbol
43  * WITH_DEBUG_MESSAGES will be inserted into the object file.
44  *
45  */
46 #define DEBUG_SYMBOL _H2 ( debug_, OBJECT )
47 #if DEBUG_SYMBOL
48 #include "console.h"
49 #define DBG(...) printf ( _XSTR ( OBJECT ) ": " __VA_ARGS__ )
50 #define DEBUG_SYMBOL_STR _XSTR ( DEBUG_SYMBOL )
51 __asm__ ( ".equ\tWITH_DEBUG_MESSAGES, 0" );
52 #else
53 #define DBG(...)
54 #endif
55
56 #define PACKED __attribute__((packed))
57 #define __unused __attribute__((unused))
58 #define __used __attribute__((used))
59
60 #endif /* ASSEMBLY */
61
62 #endif /* COMPILER_H */