|
@@ -24,6 +24,50 @@
|
24
|
24
|
*
|
25
|
25
|
*/
|
26
|
26
|
|
|
27
|
+/* Force visibility of all symbols to "hidden", i.e. inform gcc that
|
|
28
|
+ * all symbol references resolve strictly within our final binary.
|
|
29
|
+ * This avoids unnecessary PLT/GOT entries on x86_64.
|
|
30
|
+ *
|
|
31
|
+ * This is a stronger claim than specifying "-fvisibility=hidden",
|
|
32
|
+ * since it also affects symbols marked with "extern".
|
|
33
|
+ */
|
|
34
|
+#ifndef ASSEMBLY
|
|
35
|
+#if __GNUC__ >= 4
|
|
36
|
+#pragma GCC visibility push(hidden)
|
|
37
|
+#endif
|
|
38
|
+#endif /* ASSEMBLY */
|
|
39
|
+
|
|
40
|
+/**
|
|
41
|
+ * @defgroup symmacros Macros to provide or require explicit symbols
|
|
42
|
+ * @{
|
|
43
|
+ */
|
|
44
|
+
|
|
45
|
+/** Provide a symbol within this object file */
|
|
46
|
+#ifdef ASSEMBLY
|
|
47
|
+#define PROVIDE_SYMBOL( _sym ) \
|
|
48
|
+ .globl _sym ; \
|
|
49
|
+ .comm _sym, 0
|
|
50
|
+#else /* ASSEMBLY */
|
|
51
|
+#define PROVIDE_SYMBOL( _sym ) \
|
|
52
|
+ char _sym[0]
|
|
53
|
+#endif /* ASSEMBLY */
|
|
54
|
+
|
|
55
|
+/** Require a symbol within this object file */
|
|
56
|
+#ifdef ASSEMBLY
|
|
57
|
+#define REQUIRE_SYMBOL( _sym ) \
|
|
58
|
+ .equ __need_ # _sym, _sym
|
|
59
|
+#else /* ASSEMBLY */
|
|
60
|
+#define REQUIRE_SYMBOL( _sym ) \
|
|
61
|
+ __asm__ ( ".equ\t__need_" #_sym ", " #_sym )
|
|
62
|
+#endif /* ASSEMBLY */
|
|
63
|
+
|
|
64
|
+/** @} */
|
|
65
|
+
|
|
66
|
+/**
|
|
67
|
+ * @defgroup objmacros Macros to provide or require explicit objects
|
|
68
|
+ * @{
|
|
69
|
+ */
|
|
70
|
+
|
27
|
71
|
/* Not quite sure why cpp requires two levels of macro call in order
|
28
|
72
|
* to actually expand OBJECT...
|
29
|
73
|
*/
|
|
@@ -31,44 +75,24 @@
|
31
|
75
|
#define _H1( x, y ) x ## y
|
32
|
76
|
#undef _H2
|
33
|
77
|
#define _H2( x, y ) _H1 ( x, y )
|
34
|
|
-#define PREFIX_OBJECT(prefix) _H2 ( prefix, OBJECT )
|
35
|
|
-#define OBJECT_SYMBOL PREFIX_OBJECT(obj_)
|
36
|
|
-#undef _STR
|
37
|
|
-#define _STR(s) #s
|
38
|
|
-#undef _XSTR
|
39
|
|
-#define _XSTR(s) _STR(s)
|
40
|
|
-#define OBJECT_SYMBOL_STR _XSTR ( OBJECT_SYMBOL )
|
41
|
|
-
|
42
|
|
-#ifdef ASSEMBLY
|
|
78
|
+#define PREFIX_OBJECT( _prefix ) _H2 ( _prefix, OBJECT )
|
|
79
|
+#define OBJECT_SYMBOL PREFIX_OBJECT ( obj_ )
|
43
|
80
|
|
44
|
|
- .globl OBJECT_SYMBOL
|
45
|
|
- .equ OBJECT_SYMBOL, 0
|
|
81
|
+/** Always provide the symbol for the current object (defined by -DOBJECT) */
|
|
82
|
+PROVIDE_SYMBOL ( OBJECT_SYMBOL );
|
46
|
83
|
|
47
|
|
-#else /* ASSEMBLY */
|
|
84
|
+/** Explicitly require another object */
|
|
85
|
+#define REQUIRE_OBJECT( _obj ) REQUIRE_SYMBOL ( obj_ ## _obj )
|
48
|
86
|
|
49
|
|
-__asm__ ( ".globl\t" OBJECT_SYMBOL_STR );
|
50
|
|
-__asm__ ( ".equ\t" OBJECT_SYMBOL_STR ", 0" );
|
|
87
|
+/** @} */
|
51
|
88
|
|
52
|
|
-/**
|
53
|
|
- * Drag in an object by object name.
|
54
|
|
- *
|
55
|
|
- * Macro to allow objects to explicitly drag in other objects by
|
56
|
|
- * object name. Used by config.c.
|
57
|
|
- *
|
58
|
|
- */
|
59
|
|
-#define REQUIRE_OBJECT(object) \
|
60
|
|
- __asm__ ( ".equ\tneed_" #object ", obj_" #object );
|
|
89
|
+/** Select file identifier for errno.h (if used) */
|
|
90
|
+#define ERRFILE PREFIX_OBJECT ( ERRFILE_ )
|
61
|
91
|
|
62
|
|
-/* Force visibility of all symbols to "hidden", i.e. inform gcc that
|
63
|
|
- * all symbol references resolve strictly within our final binary.
|
64
|
|
- * This avoids unnecessary PLT/GOT entries on x86_64.
|
65
|
|
- *
|
66
|
|
- * This is a stronger claim than specifying "-fvisibility=hidden",
|
67
|
|
- * since it also affects symbols marked with "extern".
|
|
92
|
+/** @defgroup dbg Debugging infrastructure
|
|
93
|
+ * @{
|
68
|
94
|
*/
|
69
|
|
-#if __GNUC__ >= 4
|
70
|
|
-#pragma GCC visibility push(hidden)
|
71
|
|
-#endif
|
|
95
|
+#ifndef ASSEMBLY
|
72
|
96
|
|
73
|
97
|
/** @def DBG
|
74
|
98
|
*
|
|
@@ -117,12 +141,7 @@ __asm__ ( ".equ\t" OBJECT_SYMBOL_STR ", 0" );
|
117
|
141
|
* DEBUG_LEVEL will be inserted into the object file.
|
118
|
142
|
*
|
119
|
143
|
*/
|
120
|
|
-#define DEBUG_SYMBOL PREFIX_OBJECT(debug_)
|
121
|
|
-
|
122
|
|
-#if DEBUG_SYMBOL
|
123
|
|
-#define DEBUG_SYMBOL_STR _XSTR ( DEBUG_SYMBOL )
|
124
|
|
-__asm__ ( ".equ\tDBGLVL, " DEBUG_SYMBOL_STR );
|
125
|
|
-#endif
|
|
144
|
+#define DEBUG_SYMBOL PREFIX_OBJECT ( debug_ )
|
126
|
145
|
|
127
|
146
|
/** printf() for debugging
|
128
|
147
|
*
|
|
@@ -305,8 +324,13 @@ int __debug_disable;
|
305
|
324
|
#define NDEBUG
|
306
|
325
|
#endif
|
307
|
326
|
|
308
|
|
-/** Select file identifier for errno.h (if used) */
|
309
|
|
-#define ERRFILE PREFIX_OBJECT ( ERRFILE_ )
|
|
327
|
+#endif /* ASSEMBLY */
|
|
328
|
+/** @} */
|
|
329
|
+
|
|
330
|
+/** @defgroup attrs Miscellaneous attributes
|
|
331
|
+ * @{
|
|
332
|
+ */
|
|
333
|
+#ifndef ASSEMBLY
|
310
|
334
|
|
311
|
335
|
/** Declare a data structure as packed. */
|
312
|
336
|
#define PACKED __attribute__ (( packed ))
|
|
@@ -374,11 +398,14 @@ int __debug_disable;
|
374
|
398
|
*/
|
375
|
399
|
#define __shared __asm__ ( "_shared_bss" ) __aligned
|
376
|
400
|
|
|
401
|
+#endif /* ASSEMBLY */
|
|
402
|
+/** @} */
|
|
403
|
+
|
377
|
404
|
/**
|
378
|
405
|
* Optimisation barrier
|
379
|
406
|
*/
|
|
407
|
+#ifndef ASSEMBLY
|
380
|
408
|
#define barrier() __asm__ __volatile__ ( "" : : : "memory" )
|
381
|
|
-
|
382
|
409
|
#endif /* ASSEMBLY */
|
383
|
410
|
|
384
|
411
|
#include <bits/compiler.h>
|