401d4e4583a9d2f487cf108b6efe3aa9b8b162d6
[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 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 #define REQUIRE_OBJECT(object) \
33         __asm__ ( ".equ\tneed_" #object ", obj_" #object );
34
35 #define PACKED __attribute__((packed))
36 #define __unused __attribute__((unused))
37 #define __used __attribute__((used))
38
39 #endif /* ASSEMBLY */
40
41 #endif /* COMPILER_H */