RTEMS CPU Kit with SuperCore  4.11.3
linker_set.h
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1999 John D. Polstra
3  * Copyright (c) 1999,2001 Peter Wemm <peter@FreeBSD.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD: src/sys/sys/linker_set.h,v 1.13 2002/09/23 06:11:29 peter Exp $
28  */
29 
30 #ifndef _SYS_LINKER_SET_H_
31 #define _SYS_LINKER_SET_H_
32 
33 /* FIXME: These macros should not be here
34  * BSD has them macros in sys/cdefs.h
35  * older rtems had them in rtems/bsd/sys/cdefs.h
36  * newlib has some of them in sys/cdefs.h
37  */
38 
39 #if defined(__rtems__)
40 #ifndef __used
41 #define __used __attribute__((__used__))
42 #endif
43 #ifndef __CONCAT
44 #define __CONCAT1(x,y) x ## y
45 #define __CONCAT(x,y) __CONCAT1(x,y)
46 #endif
47 #endif
48 
49 /*
50  * The following macros are used to declare global sets of objects, which
51  * are collected by the linker into a `linker_set' as defined below.
52  * For ELF, this is done by constructing a separate segment for each set.
53  */
54 
55 /*
56  * Private macros, not to be used outside this header file.
57  */
58 #ifdef __GNUC__
59 #define __MAKE_SET(set, sym) \
60  static void const * const __set_##set##_sym_##sym \
61  __attribute((section("set_" #set))) __used = &sym
62 #else /* !__GNUC__ */
63 #ifndef lint
64 #error "This file needs to be compiled by GCC or lint"
65 #endif /* lint */
66 #define __MAKE_SET(set, sym) extern void const * const (__set_##set##_sym_##sym)
67 #endif /* __GNUC__ */
68 
69 /*
70  * Public macros.
71  */
72 #define TEXT_SET(set, sym) __MAKE_SET(set, sym)
73 #define DATA_SET(set, sym) __MAKE_SET(set, sym)
74 #define BSS_SET(set, sym) __MAKE_SET(set, sym)
75 #define ABS_SET(set, sym) __MAKE_SET(set, sym)
76 #define SET_ENTRY(set, sym) __MAKE_SET(set, sym)
77 
78 /*
79  * Initialize before referring to a give linker set
80  */
81 #define SET_DECLARE(set, ptype) \
82  extern ptype *__CONCAT(__start_set_,set)[]; \
83  extern ptype *__CONCAT(__stop_set_,set)[]
84 
85 #define SET_BEGIN(set) \
86  (__CONCAT(__start_set_,set))
87 #define SET_LIMIT(set) \
88  (__CONCAT(__stop_set_,set))
89 
90 /*
91  * Iterate over all the elements of a set.
92  *
93  * Sets always contain addresses of things, and "pvar" points to words
94  * containing those addresses. Thus is must be declared as "type **pvar",
95  * and the address of each set item is obtained inside the loop by "*pvar".
96  */
97 #define SET_FOREACH(pvar, set) \
98  for (pvar = SET_BEGIN(set); pvar < SET_LIMIT(set); pvar++)
99 
100 #define SET_ITEM(set, i) \
101  ((SET_BEGIN(set))[i])
102 
103 /*
104  * Provide a count of the items in a set.
105  */
106 #define SET_COUNT(set) \
107  (SET_LIMIT(set) - SET_BEGIN(set))
108 
109 #endif /* _SYS_LINKER_SET_H_ */