1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*
* Copyright (c) 2015, 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifndef _RTEMS_LINKERSET_H
#define _RTEMS_LINKERSET_H
#include <rtems/score/basedefs.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define _LINKER_SET_BEGIN( set ) \
_Linker_set_##set##_begin
#define _LINKER_SET_END( set ) \
_Linker_set_##set##_end
#define RTEMS_LINKER_SET_ASSIGN_BEGIN( set, item ) \
do { \
item = _LINKER_SET_BEGIN( set ); \
RTEMS_OBFUSCATE_VARIABLE( item ); \
} while ( 0 )
#define RTEMS_LINKER_SET_ASSIGN_END( set, item ) \
do { \
item = _LINKER_SET_END( set ); \
RTEMS_OBFUSCATE_VARIABLE( item ); \
} while ( 0 )
#define RTEMS_LINKER_SET_SIZE( set ) \
( (size_t) ( _Linker_set_##set##_end - _Linker_set_##set##_begin ) )
#define RTEMS_LINKER_ROSET_DECLARE( set, type ) \
extern type const _LINKER_SET_BEGIN( set )[0]; \
extern type const _LINKER_SET_END( set )[0]
#define RTEMS_LINKER_ROSET( set, type ) \
type const _LINKER_SET_BEGIN( set )[0] \
RTEMS_SECTION( ".rtemsroset." #set ".begin" ) RTEMS_USED; \
type const _LINKER_SET_END( set )[0] \
RTEMS_SECTION( ".rtemsroset." #set ".end" ) RTEMS_USED
#define RTEMS_LINKER_ROSET_ITEM_DECLARE( set, type, item ) \
extern type const _Linker_set_##set##_##item
#define RTEMS_LINKER_ROSET_ITEM_REFERENCE( set, type, item ) \
static type const * const _Set_reference_##set##_##item \
RTEMS_SECTION( ".rtemsroset.reference" ) RTEMS_USED = \
&_Linker_set_##set##_##item
#define RTEMS_LINKER_ROSET_ITEM_ORDERED( set, type, item, order ) \
type const _Linker_set_##set##_##item \
RTEMS_SECTION( ".rtemsroset." #set ".content.0." RTEMS_XSTRING( order ) ) \
RTEMS_USED
#define RTEMS_LINKER_ROSET_ITEM( set, type, item ) \
type const _Linker_set_##set##_##item \
RTEMS_SECTION( ".rtemsroset." #set ".content.1" ) RTEMS_USED
#define RTEMS_LINKER_ROSET_CONTENT( set, decl ) \
decl \
RTEMS_SECTION( ".rtemsroset." #set ".content" )
#define RTEMS_LINKER_RWSET_DECLARE( set, type ) \
extern type _LINKER_SET_BEGIN( set )[0]; \
extern type _LINKER_SET_END( set )[0]
#define RTEMS_LINKER_RWSET( set, type ) \
type _LINKER_SET_BEGIN( set )[0] \
RTEMS_SECTION( ".rtemsrwset." #set ".begin" ) RTEMS_USED; \
type _LINKER_SET_END( set )[0] \
RTEMS_SECTION( ".rtemsrwset." #set ".end" ) RTEMS_USED
#define RTEMS_LINKER_RWSET_ITEM_DECLARE( set, type, item ) \
extern type _Linker_set_##set##_##item
/*
* The .rtemsroset is here not a typo. We must ensure that the references are
* not a victim of the garbage collection of the linker. Thus, we place them
* in a dedicated area of the RTEMS read-only linker set section.
*/
#define RTEMS_LINKER_RWSET_ITEM_REFERENCE( set, type, item ) \
static type * const _Set_reference_##set##_##item \
RTEMS_SECTION( ".rtemsroset.reference" ) RTEMS_USED = \
&_Linker_set_##set##_##item
#define RTEMS_LINKER_RWSET_ITEM_ORDERED( set, type, item, order ) \
type _Linker_set_##set##_##item \
RTEMS_SECTION( ".rtemsrwset." #set ".content.0." RTEMS_XSTRING( order ) ) \
RTEMS_USED
#define RTEMS_LINKER_RWSET_ITEM( set, type, item ) \
type _Linker_set_##set##_##item \
RTEMS_SECTION( ".rtemsrwset." #set ".content.1" ) RTEMS_USED
#define RTEMS_LINKER_RWSET_CONTENT( set, decl ) \
decl \
RTEMS_SECTION( ".rtemsrwset." #set ".content" )
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _RTEMS_LINKERSET_H */
|