Expand PMF_FN_* macros.
[netbsd-mini2440.git] / lib / csu / c++ / c++rt0.c
blobaf42f7bbe2d732503cf0056475513b9253186899
1 /* $NetBSD: c++rt0.c,v 1.10 2005/12/24 22:02:10 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 void (*__CTOR_LIST__[0]) __P((void));
55 void (*__DTOR_LIST__[0]) __P((void));
57 static void __dtors __P((void));
58 static void __ctors __P((void));
60 static void
61 __dtors()
63 unsigned long i = (unsigned long) __DTOR_LIST__[0];
64 void (**p)(void) = __DTOR_LIST__ + i;
66 while (i--)
67 (**p--)();
70 static void
71 __ctors()
73 unsigned long i = (unsigned long) __CTOR_LIST__[0];
74 void (**p)(void) = __CTOR_LIST__ + 1;
76 while (i--)
77 (**p++)();
80 extern void __init __P((void)) __asm(".init");
81 extern void __fini __P((void)) __asm(".fini");
83 void
84 __init()
86 static int initialized = 0;
89 * Call global constructors.
90 * Arrange to call global destructors at exit.
92 if (!initialized) {
93 initialized = 1;
94 __ctors();
99 void
100 __fini()
103 * Call global destructors.
105 __dtors();