proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[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  * $DragonFly: src/sys/sys/linker_set.h,v 1.2 2003/06/17 04:28:58 dillon Exp $
28  */
29
30 #ifndef _SYS_LINKER_SET_H_
31 #define _SYS_LINKER_SET_H_
32
33 /*
34  * The following macros are used to declare global sets of objects, which
35  * are collected by the linker into a `struct linker_set' as defined below.
36  * For ELF, this is done by constructing a separate segment for each set.
37  * For a.out, it is done automatically by the linker.
38  *
39  * In the MAKE_SET macros below, the lines:
40  *
41  *   static void const * const __set_##set##_sym_##sym = &sym;
42  *
43  * are present only to prevent the compiler from producing bogus
44  * warnings about unused symbols.
45  */
46 #ifdef __ELF__
47
48 /*
49  * Alpha GAS needs an align before the section change.  It seems to assume
50  * that after the .previous, it is aligned, so the following .align 3 is
51  * ignored.  Since the previous instructions often contain strings, this is
52  * a problem.
53  */
54
55 #ifdef __alpha__
56 #define MAKE_SET(set, sym)                                              \
57         static void const * const __set_##set##_sym_##sym = &sym;       \
58         __asm(".align 3");                                              \
59         __asm(".section .set." #set ",\"aw\"");                         \
60         __asm(".quad " #sym);                                           \
61         __asm(".previous")
62 #else
63 #define MAKE_SET(set, sym)                                              \
64         static void const * const __set_##set##_sym_##sym = &sym;       \
65         __asm(".section .set." #set ",\"aw\"");                         \
66         __asm(".long " #sym);                                           \
67         __asm(".previous")
68 #endif
69 #define TEXT_SET(set, sym) MAKE_SET(set, sym)
70 #define DATA_SET(set, sym) MAKE_SET(set, sym)
71
72 #else
73
74 /*
75  * NB: the constants defined below must match those defined in
76  * ld/ld.h.  Since their calculation requires arithmetic, we
77  * can't name them symbolically (e.g., 23 is N_SETT | N_EXT).
78  */
79 #define MAKE_SET(set, sym, type) \
80         static void const * const __set_##set##_sym_##sym = &sym; \
81         __asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym)
82 #define TEXT_SET(set, sym) MAKE_SET(set, sym, 23)
83 #define DATA_SET(set, sym) MAKE_SET(set, sym, 25)
84
85 #endif
86
87 struct linker_set {
88         int     ls_length;
89         void    *ls_items[1];           /* really ls_length of them,
90                                                  * trailing NULL */
91 };
92
93 #endif /* _SYS_LINKER_SET_H_ */