]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/sys/linker_set.h
"Fix" the previous initial attempt at fixing TUNABLE_INT(). This time
[FreeBSD/FreeBSD.git] / sys / sys / linker_set.h
1 /*-
2  * Copyright (c) 1999 John D. Polstra
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef _SYS_LINKER_SET_H_
30 #define _SYS_LINKER_SET_H_
31
32 /*
33  * The following macros are used to declare global sets of objects, which
34  * are collected by the linker into a `struct linker_set' as defined below.
35  * For ELF, this is done by constructing a separate segment for each set.
36  * For a.out, it is done automatically by the linker.
37  *
38  * In the MAKE_SET macros below, the lines:
39  *
40  *   static void const * const __set_##set##_sym_##sym = &sym;
41  *
42  * are present only to prevent the compiler from producing bogus
43  * warnings about unused symbols.
44  */
45 #ifdef __ELF__
46
47 #if defined(__alpha__) || defined(__ia64__)
48 #define MAKE_SET(set, sym)                                              \
49         static void const * const __set_##set##_sym_##sym = &sym;       \
50         __asm(".section .set." #set ",\"aw\"");                         \
51         __asm(".p2align 3");                                            \
52         __asm(".quad " #sym);                                           \
53         __asm(".previous")
54 #else
55 #define MAKE_SET(set, sym)                                              \
56         static void const * const __set_##set##_sym_##sym = &sym;       \
57         __asm(".section .set." #set ",\"aw\"");                         \
58         __asm(".p2align 2");                                            \
59         __asm(".long " #sym);                                           \
60         __asm(".previous")
61 #endif
62 #define TEXT_SET(set, sym) MAKE_SET(set, sym)
63 #define DATA_SET(set, sym) MAKE_SET(set, sym)
64
65 #else
66
67 /*
68  * NB: the constants defined below must match those defined in
69  * ld/ld.h.  Since their calculation requires arithmetic, we
70  * can't name them symbolically (e.g., 23 is N_SETT | N_EXT).
71  */
72 #define MAKE_SET(set, sym, type) \
73         static void const * const __set_##set##_sym_##sym = &sym; \
74         __asm(".stabs \"" #set "\", " #type ", 0, 0, " #sym)
75 #define TEXT_SET(set, sym) MAKE_SET(set, sym, 23)
76 #define DATA_SET(set, sym) MAKE_SET(set, sym, 25)
77
78 #endif
79
80 struct linker_set {
81         int     ls_length;
82         void    *ls_items[1];           /* really ls_length of them,
83                                                  * trailing NULL */
84 };
85
86 #endif /* _SYS_LINKER_SET_H_ */