Fix mdoc(7)/man(7) mix up.
[netbsd-mini2440.git] / lib / csu / arm32 / c++rt0.c
blob88cdabe54dc86b255717c14cf6cebe647a017ba1
1 /* $NetBSD: c++rt0.c,v 1.3 2005/12/24 21:54:01 perry Exp $ */
3 /*-
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Paul Kranenburg.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Run-time module for GNU C++ compiled shared libraries.
35 * The linker constructs the following arrays of pointers to global
36 * constructors and destructors. The first element contains the
37 * number of pointers in each.
38 * The tables are also null-terminated.
40 #include <stdlib.h>
44 * We make the __{C,D}TOR_LIST__ symbols appear as type `SETD' and
45 * include a dummy local function in the set. This keeps references
46 * to these symbols local to the shared object this module is linked to.
48 static void dummy __P((void)) { return; }
50 /* Note: this is "a.out" dependent. */
51 __asm(".stabs \"___CTOR_LIST__\",22,0,0,_dummy");
52 __asm(".stabs \"___DTOR_LIST__\",22,0,0,_dummy");
54 #ifdef __arm32__ /* XXX ARM32_BROKEN_RELOCATIONS */
55 #define ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
56 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
58 void (*__CTOR_LIST__[0]) __P((void));
59 void (*__DTOR_LIST__[0]) __P((void));
61 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
62 static void __dtors __P((long)); /* XXX ARM32_BROKEN_RELOCATIONS */
63 static void __ctors __P((long)); /* XXX ARM32_BROKEN_RELOCATIONS */
64 #else /* XXX ARM32_BROKEN_RELOCATIONS */
65 static void __dtors __P((void));
66 static void __ctors __P((void));
67 #endif
69 static void
70 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
71 __dtors(base) /* XXX ARM32_BROKEN_RELOCATIONS */
72 long base; /* XXX ARM32_BROKEN_RELOCATIONS */
73 #else /* XXX ARM32_BROKEN_RELOCATIONS */
74 __dtors()
75 #endif
77 unsigned long i = (unsigned long) __DTOR_LIST__[0];
78 void (**p)(void) = __DTOR_LIST__ + i;
80 while (i--)
81 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
82 (*(void (*)(void))((char *)(*p--) + base))(); /* XXX ... */
83 #else /* XXX ARM32_BROKEN_RELOCATIONS */
84 (**p--)();
85 #endif
88 static void
89 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
90 __ctors(base) /* XXX ARM32_BROKEN_RELOCATIONS */
91 long base; /* XXX ARM32_BROKEN_RELOCATIONS */
92 #else /* XXX ARM32_BROKEN_RELOCATIONS */
93 __ctors()
94 #endif
96 unsigned long i = (unsigned long) __CTOR_LIST__[0];
97 void (**p)(void) = __CTOR_LIST__ + 1;
99 while (i--)
100 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
101 (*(void (*)(void))((char *)(*p++) + base))(); /* XXX ... */
102 #else /* XXX ARM32_BROKEN_RELOCATIONS */
103 (**p++)();
104 #endif
107 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
108 extern void __init __P((long)) __asm(".init"); /* XXX ARM32_BROKEN_RELOCATIONS */
109 extern void __fini __P((long)) __asm(".fini"); /* XXX ARM32_BROKEN_RELOCATIONS */
110 #else /* XXX ARM32_BROKEN_RELOCATIONS */
111 extern void __init __P((void)) __asm(".init");
112 extern void __fini __P((void)) __asm(".fini");
113 #endif
115 void
116 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
117 __init(base) /* XXX ARM32_BROKEN_RELOCATIONS */
118 long base; /* XXX ARM32_BROKEN_RELOCATIONS */
119 #else /* XXX ARM32_BROKEN_RELOCATIONS */
120 __init()
121 #endif
123 static int initialized = 0;
126 * Call global constructors.
127 * Arrange to call global destructors at exit.
129 if (!initialized) {
130 initialized = 1;
131 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
132 __ctors(base); /* XXX ARM32_BROKEN_RELOCATIONS */
133 #else /* XXX ARM32_BROKEN_RELOCATIONS */
134 __ctors();
135 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
140 void
141 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
142 __fini(base) /* XXX ARM32_BROKEN_RELOCATIONS */
143 long base; /* XXX ARM32_BROKEN_RELOCATIONS */
144 #else /* XXX ARM32_BROKEN_RELOCATIONS */
145 __fini()
146 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
149 * Call global destructors.
151 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
152 __dtors(base); /* XXX ARM32_BROKEN_RELOCATIONS */
153 #else /* XXX ARM32_BROKEN_RELOCATIONS */
154 __dtors();
155 #endif /* XXX ARM32_BROKEN_RELOCATIONS */