Initial import from FreeBSD RELENG_4:
[dragonfly.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: src/sys/sys/linker_set.h,v 1.4.2.1 2000/08/02 21:52:20 peter Exp $
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 /*
48  * Alpha GAS needs an align before the section change.  It seems to assume
49  * that after the .previous, it is aligned, so the following .align 3 is
50  * ignored.  Since the previous instructions often contain strings, this is
51  * a problem.
52  */
53
54 #ifdef __alpha__
55 #define MAKE_SET(set, sym)                                              \
56         static void const * const __set_##set##_sym_##sym = &sym;       \
57         __asm(".align 3");                                              \
58         __asm(".section .set." #set ",\"aw\"");                         \
59         __asm(".quad " #sym);                                           \
60         __asm(".previous")
61 #else
62 #define MAKE_SET(set, sym)                                              \
63         static void const * const __set_##set##_sym_##sym = &sym;       \
64         __asm(".section .set." #set ",\"aw\"");                         \
65         __asm(".long " #sym);                                           \
66         __asm(".previous")
67 #endif
68 #define TEXT_SET(set, sym) MAKE_SET(set, sym)
69 #define DATA_SET(set, sym) MAKE_SET(set, sym)
70
71 #else
72
73 /*
74  * NB: the constants defined below must match those defined in
75  * ld/ld.h.  Since their calculation requires arithmetic, we
76  * can't name them symbolically (e.g., 23 is N_SETT | N_EXT).
77  */
78 #define MAKE_SET(set, sym, type) \
79         static void const * const __set_##set##_sym_##sym = &sym; \
80         __asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym)
81 #define TEXT_SET(set, sym) MAKE_SET(set, sym, 23)
82 #define DATA_SET(set, sym) MAKE_SET(set, sym, 25)
83
84 #endif
85
86 struct linker_set {
87         int     ls_length;
88         void    *ls_items[1];           /* really ls_length of them,
89                                                  * trailing NULL */
90 };
91
92 #endif /* _SYS_LINKER_SET_H_ */