2002-11-21 Phil Edwards <pme@gcc.gnu.org>
[official-gcc.git] / gcc / crtstuff.c
blobe5f5d78aeea83bea230429d55611cdd6335ae859
1 /* Specialized bits of code needed to support construction and
2 destruction of file-scope objects in C++ code.
3 Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5 Contributed by Ron Guilmette (rfg@monkeys.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 In addition to the permissions in the GNU General Public License, the
15 Free Software Foundation gives you unlimited permission to link the
16 compiled version of this file into combinations with other programs,
17 and to distribute those combinations without any restriction coming
18 from the use of this file. (The General Public License restrictions
19 do apply in other respects; for example, they cover modification of
20 the file, and distribution when not linked into a combine
21 executable.)
23 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
24 WARRANTY; without even the implied warranty of MERCHANTABILITY or
25 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 for more details.
28 You should have received a copy of the GNU General Public License
29 along with GCC; see the file COPYING. If not, write to the Free
30 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
31 02111-1307, USA. */
33 /* This file is a bit like libgcc2.c in that it is compiled
34 multiple times and yields multiple .o files.
36 This file is useful on target machines where the object file format
37 supports multiple "user-defined" sections (e.g. COFF, ELF, ROSE). On
38 such systems, this file allows us to avoid running collect (or any
39 other such slow and painful kludge). Additionally, if the target
40 system supports a .init section, this file allows us to support the
41 linking of C++ code with a non-C++ main program.
43 Note that if INIT_SECTION_ASM_OP is defined in the tm.h file, then
44 this file *will* make use of the .init section. If that symbol is
45 not defined however, then the .init section will not be used.
47 Currently, only ELF and COFF are supported. It is likely however that
48 ROSE could also be supported, if someone was willing to do the work to
49 make whatever (small?) adaptations are needed. (Some work may be
50 needed on the ROSE assembler and linker also.)
52 This file must be compiled with gcc. */
54 /* It is incorrect to include config.h here, because this file is being
55 compiled for the target, and hence definitions concerning only the host
56 do not apply. */
58 /* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
59 supposedly valid even though this is a "target" file. */
60 #include "auto-host.h"
61 #include "tconfig.h"
62 #include "tsystem.h"
63 #include "unwind-dw2-fde.h"
65 #ifndef FORCE_CODE_SECTION_ALIGN
66 # define FORCE_CODE_SECTION_ALIGN
67 #endif
69 #ifndef CRT_CALL_STATIC_FUNCTION
70 # define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
71 static void __attribute__((__used__)) \
72 call_ ## FUNC (void) \
73 { \
74 asm (SECTION_OP); \
75 FUNC (); \
76 FORCE_CODE_SECTION_ALIGN \
77 asm (TEXT_SECTION_ASM_OP); \
79 #endif
81 #if defined(OBJECT_FORMAT_ELF) && defined(HAVE_LD_EH_FRAME_HDR) \
82 && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
83 && defined(__GLIBC__) && __GLIBC__ >= 2
84 #include <link.h>
85 # if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
86 || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
87 # define USE_PT_GNU_EH_FRAME
88 # endif
89 #endif
90 #if defined(EH_FRAME_SECTION_NAME) && !defined(USE_PT_GNU_EH_FRAME)
91 # define USE_EH_FRAME_REGISTRY
92 #endif
94 /* We do not want to add the weak attribute to the declarations of these
95 routines in unwind-dw2-fde.h because that will cause the definition of
96 these symbols to be weak as well.
98 This exposes a core issue, how to handle creating weak references vs
99 how to create weak definitions. Either we have to have the definition
100 of TARGET_WEAK_ATTRIBUTE be conditional in the shared header files or
101 have a second declaration if we want a function's references to be weak,
102 but not its definition.
104 Making TARGET_WEAK_ATTRIBUTE conditional seems like a good solution until
105 one thinks about scaling to larger problems -- ie, the condition under
106 which TARGET_WEAK_ATTRIBUTE is active will eventually get far too
107 complicated.
109 So, we take an approach similar to #pragma weak -- we have a second
110 declaration for functions that we want to have weak references.
112 Neither way is particularly good. */
114 /* References to __register_frame_info and __deregister_frame_info should
115 be weak in this file if at all possible. */
116 extern void __register_frame_info (void *, struct object *)
117 TARGET_ATTRIBUTE_WEAK;
118 extern void __register_frame_info_bases (void *, struct object *,
119 void *, void *)
120 TARGET_ATTRIBUTE_WEAK;
121 extern void *__deregister_frame_info (void *)
122 TARGET_ATTRIBUTE_WEAK;
123 extern void *__deregister_frame_info_bases (void *)
124 TARGET_ATTRIBUTE_WEAK;
126 /* Likewise for _Jv_RegisterClasses. */
127 extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK;
129 #ifdef OBJECT_FORMAT_ELF
131 /* Declare a pointer to void function type. */
132 typedef void (*func_ptr) (void);
133 #define STATIC static
135 #else /* OBJECT_FORMAT_ELF */
137 #include "gbl-ctors.h"
139 #define STATIC
141 #endif /* OBJECT_FORMAT_ELF */
143 #ifdef CRT_BEGIN
145 /* NOTE: In order to be able to support SVR4 shared libraries, we arrange
146 to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
147 __DTOR_END__ } per root executable and also one set of these symbols
148 per shared library. So in any given whole process image, we may have
149 multiple definitions of each of these symbols. In order to prevent
150 these definitions from conflicting with one another, and in order to
151 ensure that the proper lists are used for the initialization/finalization
152 of each individual shared library (respectively), we give these symbols
153 only internal (i.e. `static') linkage, and we also make it a point to
154 refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
155 symbol in crtbegin.o, where they are defined. */
157 /* The -1 is a flag to __do_global_[cd]tors indicating that this table
158 does not start with a count of elements. */
159 #ifdef CTOR_LIST_BEGIN
160 CTOR_LIST_BEGIN;
161 #elif defined(CTORS_SECTION_ASM_OP)
162 /* Hack: force cc1 to switch to .data section early, so that assembling
163 __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
164 static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
165 asm (CTORS_SECTION_ASM_OP);
166 STATIC func_ptr __CTOR_LIST__[1]
167 __attribute__ ((__unused__, aligned(sizeof(func_ptr))))
168 = { (func_ptr) (-1) };
169 #else
170 STATIC func_ptr __CTOR_LIST__[1]
171 __attribute__ ((__unused__, section(".ctors"), aligned(sizeof(func_ptr))))
172 = { (func_ptr) (-1) };
173 #endif /* __CTOR_LIST__ alternatives */
175 #ifdef DTOR_LIST_BEGIN
176 DTOR_LIST_BEGIN;
177 #elif defined(DTORS_SECTION_ASM_OP)
178 asm (DTORS_SECTION_ASM_OP);
179 STATIC func_ptr __DTOR_LIST__[1]
180 __attribute__ ((aligned(sizeof(func_ptr))))
181 = { (func_ptr) (-1) };
182 #else
183 STATIC func_ptr __DTOR_LIST__[1]
184 __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
185 = { (func_ptr) (-1) };
186 #endif /* __DTOR_LIST__ alternatives */
188 #ifdef USE_EH_FRAME_REGISTRY
189 /* Stick a label at the beginning of the frame unwind info so we can register
190 and deregister it with the exception handling library code. */
191 STATIC char __EH_FRAME_BEGIN__[]
192 __attribute__((section(EH_FRAME_SECTION_NAME), aligned(4)))
193 = { };
194 #endif /* USE_EH_FRAME_REGISTRY */
196 #ifdef JCR_SECTION_NAME
197 /* Stick a label at the beginning of the java class registration info
198 so we can register them properly. */
199 STATIC void *__JCR_LIST__[]
200 __attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*))))
201 = { };
202 #endif /* JCR_SECTION_NAME */
204 #ifdef INIT_SECTION_ASM_OP
206 #ifdef OBJECT_FORMAT_ELF
208 /* Declare the __dso_handle variable. It should have a unique value
209 in every shared-object; in a main program its value is zero. The
210 object should in any case be protected. This means the instance
211 in one DSO or the main program is not used in another object. The
212 dynamic linker takes care of this. */
214 #ifdef HAVE_GAS_HIDDEN
215 extern void *__dso_handle __attribute__ ((__visibility__ ("hidden")));
216 #endif
217 #ifdef CRTSTUFFS_O
218 void *__dso_handle = &__dso_handle;
219 #else
220 void *__dso_handle = 0;
221 #endif
223 /* The __cxa_finalize function may not be available so we use only a
224 weak declaration. */
225 extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
227 /* Run all the global destructors on exit from the program. */
229 /* Some systems place the number of pointers in the first word of the
230 table. On SVR4 however, that word is -1. In all cases, the table is
231 null-terminated. On SVR4, we start from the beginning of the list and
232 invoke each per-compilation-unit destructor routine in order
233 until we find that null.
235 Note that this function MUST be static. There will be one of these
236 functions in each root executable and one in each shared library, but
237 although they all have the same code, each one is unique in that it
238 refers to one particular associated `__DTOR_LIST__' which belongs to the
239 same particular root executable or shared library file.
241 On some systems, this routine is run more than once from the .fini,
242 when exit is called recursively, so we arrange to remember where in
243 the list we left off processing, and we resume at that point,
244 should we be re-invoked. */
246 static void __attribute__((used))
247 __do_global_dtors_aux (void)
249 static func_ptr *p = __DTOR_LIST__ + 1;
250 static _Bool completed;
251 func_ptr f;
253 if (__builtin_expect (completed, 0))
254 return;
256 #ifdef CRTSTUFFS_O
257 if (__cxa_finalize)
258 __cxa_finalize (__dso_handle);
259 #endif
261 while ((f = *p))
263 p++;
264 f ();
267 #ifdef USE_EH_FRAME_REGISTRY
268 #if defined(CRT_GET_RFIB_TEXT) || defined(CRT_GET_RFIB_DATA)
269 /* If we used the new __register_frame_info_bases interface,
270 make sure that we deregister from the same place. */
271 if (__deregister_frame_info_bases)
272 __deregister_frame_info_bases (__EH_FRAME_BEGIN__);
273 #else
274 if (__deregister_frame_info)
275 __deregister_frame_info (__EH_FRAME_BEGIN__);
276 #endif
277 #endif
279 completed = 1;
282 /* Stick a call to __do_global_dtors_aux into the .fini section. */
283 CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
285 #if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
286 /* Stick a call to __register_frame_info into the .init section. For some
287 reason calls with no arguments work more reliably in .init, so stick the
288 call in another function. */
290 static void __attribute__((used))
291 frame_dummy (void)
293 #ifdef USE_EH_FRAME_REGISTRY
294 static struct object object;
295 #if defined(CRT_GET_RFIB_TEXT) || defined(CRT_GET_RFIB_DATA)
296 void *tbase, *dbase;
297 #ifdef CRT_GET_RFIB_TEXT
298 CRT_GET_RFIB_TEXT (tbase);
299 #else
300 tbase = 0;
301 #endif
302 #ifdef CRT_GET_RFIB_DATA
303 CRT_GET_RFIB_DATA (dbase);
304 #else
305 dbase = 0;
306 #endif
307 if (__register_frame_info_bases)
308 __register_frame_info_bases (__EH_FRAME_BEGIN__, &object, tbase, dbase);
309 #else
310 if (__register_frame_info)
311 __register_frame_info (__EH_FRAME_BEGIN__, &object);
312 #endif
313 #endif /* USE_EH_FRAME_REGISTRY */
314 #ifdef JCR_SECTION_NAME
315 if (__JCR_LIST__[0] && _Jv_RegisterClasses)
316 _Jv_RegisterClasses (__JCR_LIST__);
317 #endif /* JCR_SECTION_NAME */
320 CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, frame_dummy)
321 #endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
323 #else /* OBJECT_FORMAT_ELF */
325 /* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o
326 and once in crtend.o). It must be declared static to avoid a link
327 error. Here, we define __do_global_ctors as an externally callable
328 function. It is externally callable so that __main can invoke it when
329 INVOKE__main is defined. This has the additional effect of forcing cc1
330 to switch to the .text section. */
332 static void __do_global_ctors_aux (void);
333 void
334 __do_global_ctors (void)
336 #ifdef INVOKE__main
337 /* If __main won't actually call __do_global_ctors then it doesn't matter
338 what's inside the function. The inside of __do_global_ctors_aux is
339 called automatically in that case. And the Alliant fx2800 linker
340 crashes on this reference. So prevent the crash. */
341 __do_global_ctors_aux ();
342 #endif
345 asm (INIT_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
347 /* On some svr4 systems, the initial .init section preamble code provided in
348 crti.o may do something, such as bump the stack, which we have to
349 undo before we reach the function prologue code for __do_global_ctors
350 (directly below). For such systems, define the macro INIT_SECTION_PREAMBLE
351 to expand into the code needed to undo the actions of the crti.o file. */
353 #ifdef INIT_SECTION_PREAMBLE
354 INIT_SECTION_PREAMBLE;
355 #endif
357 /* A routine to invoke all of the global constructors upon entry to the
358 program. We put this into the .init section (for systems that have
359 such a thing) so that we can properly perform the construction of
360 file-scope static-storage C++ objects within shared libraries. */
362 static void __attribute__((used))
363 __do_global_ctors_aux (void) /* prologue goes in .init section */
365 FORCE_CODE_SECTION_ALIGN /* explicit align before switch to .text */
366 asm (TEXT_SECTION_ASM_OP); /* don't put epilogue and body in .init */
367 DO_GLOBAL_CTORS_BODY;
368 atexit (__do_global_dtors);
371 #endif /* OBJECT_FORMAT_ELF */
373 #elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
375 /* This case is used by the Irix 6 port, which supports named sections but
376 not an SVR4-style .fini section. __do_global_dtors can be non-static
377 in this case because we protect it with -hidden_symbol. */
379 void
380 __do_global_dtors (void)
382 func_ptr *p, f;
383 for (p = __DTOR_LIST__ + 1; (f = *p); p++)
384 f ();
386 #ifdef USE_EH_FRAME_REGISTRY
387 if (__deregister_frame_info)
388 __deregister_frame_info (__EH_FRAME_BEGIN__);
389 #endif
392 #if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
393 /* A helper function for __do_global_ctors, which is in crtend.o. Here
394 in crtbegin.o, we can reference a couple of symbols not visible there.
395 Plus, since we're before libgcc.a, we have no problems referencing
396 functions from there. */
397 void
398 __do_global_ctors_1(void)
400 #ifdef USE_EH_FRAME_REGISTRY
401 static struct object object;
402 if (__register_frame_info)
403 __register_frame_info (__EH_FRAME_BEGIN__, &object);
404 #endif
405 #ifdef JCR_SECTION_NAME
406 if (__JCR_LIST__[0] && _Jv_RegisterClasses)
407 _Jv_RegisterClasses (__JCR_LIST__);
408 #endif
410 #endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
412 #else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
413 #error "What are you doing with crtstuff.c, then?"
414 #endif
416 #elif defined(CRT_END) /* ! CRT_BEGIN */
418 /* Put a word containing zero at the end of each of our two lists of function
419 addresses. Note that the words defined here go into the .ctors and .dtors
420 sections of the crtend.o file, and since that file is always linked in
421 last, these words naturally end up at the very ends of the two lists
422 contained in these two sections. */
424 #ifdef CTOR_LIST_END
425 CTOR_LIST_END;
426 #elif defined(CTORS_SECTION_ASM_OP)
427 /* Hack: force cc1 to switch to .data section early, so that assembling
428 __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
429 static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
430 asm (CTORS_SECTION_ASM_OP);
431 STATIC func_ptr __CTOR_END__[1]
432 __attribute__((aligned(sizeof(func_ptr))))
433 = { (func_ptr) 0 };
434 #else
435 STATIC func_ptr __CTOR_END__[1]
436 __attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
437 = { (func_ptr) 0 };
438 #endif
440 #ifdef DTOR_LIST_END
441 DTOR_LIST_END;
442 #elif defined(DTORS_SECTION_ASM_OP)
443 asm (DTORS_SECTION_ASM_OP);
444 STATIC func_ptr __DTOR_END__[1]
445 __attribute__ ((unused, aligned(sizeof(func_ptr))))
446 = { (func_ptr) 0 };
447 #else
448 STATIC func_ptr __DTOR_END__[1]
449 __attribute__((unused, section(".dtors"), aligned(sizeof(func_ptr))))
450 = { (func_ptr) 0 };
451 #endif
453 #ifdef EH_FRAME_SECTION_NAME
454 /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
455 this would be the 'length' field in a real FDE. */
456 STATIC int __FRAME_END__[]
457 __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
458 aligned(4)))
459 = { 0 };
460 #endif /* EH_FRAME_SECTION_NAME */
462 #ifdef JCR_SECTION_NAME
463 /* Null terminate the .jcr section array. */
464 STATIC void *__JCR_END__[1]
465 __attribute__ ((unused, section(JCR_SECTION_NAME),
466 aligned(sizeof(void *))))
467 = { 0 };
468 #endif /* JCR_SECTION_NAME */
470 #ifdef INIT_SECTION_ASM_OP
472 #ifdef OBJECT_FORMAT_ELF
473 static void __attribute__((used))
474 __do_global_ctors_aux (void)
476 func_ptr *p;
477 for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
478 (*p) ();
481 /* Stick a call to __do_global_ctors_aux into the .init section. */
482 CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, __do_global_ctors_aux)
483 #else /* OBJECT_FORMAT_ELF */
485 /* Stick the real initialization code, followed by a normal sort of
486 function epilogue at the very end of the .init section for this
487 entire root executable file or for this entire shared library file.
489 Note that we use some tricks here to get *just* the body and just
490 a function epilogue (but no function prologue) into the .init
491 section of the crtend.o file. Specifically, we switch to the .text
492 section, start to define a function, and then we switch to the .init
493 section just before the body code.
495 Earlier on, we put the corresponding function prologue into the .init
496 section of the crtbegin.o file (which will be linked in first).
498 Note that we want to invoke all constructors for C++ file-scope static-
499 storage objects AFTER any other possible initialization actions which
500 may be performed by the code in the .init section contributions made by
501 other libraries, etc. That's because those other initializations may
502 include setup operations for very primitive things (e.g. initializing
503 the state of the floating-point coprocessor, etc.) which should be done
504 before we start to execute any of the user's code. */
506 static void
507 __do_global_ctors_aux (void) /* prologue goes in .text section */
509 asm (INIT_SECTION_ASM_OP);
510 DO_GLOBAL_CTORS_BODY;
511 atexit (__do_global_dtors);
512 } /* epilogue and body go in .init section */
514 FORCE_CODE_SECTION_ALIGN
515 asm (TEXT_SECTION_ASM_OP);
517 #endif /* OBJECT_FORMAT_ELF */
519 #elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
521 /* This case is used by the Irix 6 port, which supports named sections but
522 not an SVR4-style .init section. __do_global_ctors can be non-static
523 in this case because we protect it with -hidden_symbol. */
524 extern void __do_global_ctors_1(void);
525 void
526 __do_global_ctors (void)
528 func_ptr *p;
529 #if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
530 __do_global_ctors_1();
531 #endif
532 for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
533 (*p) ();
536 #else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
537 #error "What are you doing with crtstuff.c, then?"
538 #endif
540 #else /* ! CRT_BEGIN && ! CRT_END */
541 #error "One of CRT_BEGIN or CRT_END must be defined."
542 #endif