1992-03-07 05:32:07 +01:00
|
|
|
/* Specialized bits of code needed to support construction and
|
|
|
|
destruction of file-scope objects in C++ code.
|
1999-09-09 23:36:20 +02:00
|
|
|
Copyright (C) 1991, 1994-1999 Free Software Foundation, Inc.
|
1996-06-28 20:08:53 +02:00
|
|
|
Contributed by Ron Guilmette (rfg@monkeys.com).
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
This file is part of GNU CC.
|
|
|
|
|
|
|
|
GNU CC is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
GNU CC is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GNU CC; see the file COPYING. If not, write to
|
1995-06-15 13:33:25 +02:00
|
|
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
|
|
Boston, MA 02111-1307, USA. */
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
/* As a special exception, if you link this library with files
|
|
|
|
compiled with GCC to produce an executable, this does not cause
|
|
|
|
the resulting executable to be covered by the GNU General Public License.
|
|
|
|
This exception does not however invalidate any other reasons why
|
|
|
|
the executable file might be covered by the GNU General Public License. */
|
|
|
|
|
|
|
|
/* This file is a bit like libgcc1.c/libgcc2.c in that it is compiled
|
|
|
|
multiple times and yields multiple .o files.
|
|
|
|
|
|
|
|
This file is useful on target machines where the object file format
|
|
|
|
supports multiple "user-defined" sections (e.g. COFF, ELF, ROSE). On
|
|
|
|
such systems, this file allows us to avoid running collect (or any
|
|
|
|
other such slow and painful kludge). Additionally, if the target
|
|
|
|
system supports a .init section, this file allows us to support the
|
|
|
|
linking of C++ code with a non-C++ main program.
|
|
|
|
|
|
|
|
Note that if INIT_SECTION_ASM_OP is defined in the tm.h file, then
|
|
|
|
this file *will* make use of the .init section. If that symbol is
|
|
|
|
not defined however, then the .init section will not be used.
|
|
|
|
|
1992-06-04 21:12:25 +02:00
|
|
|
Currently, only ELF and COFF are supported. It is likely however that
|
|
|
|
ROSE could also be supported, if someone was willing to do the work to
|
|
|
|
make whatever (small?) adaptations are needed. (Some work may be
|
|
|
|
needed on the ROSE assembler and linker also.)
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
This file must be compiled with gcc. */
|
|
|
|
|
|
|
|
/* It is incorrect to include config.h here, because this file is being
|
|
|
|
compiled for the target, and hence definitions concerning only the host
|
|
|
|
do not apply. */
|
|
|
|
|
|
|
|
#include "tm.h"
|
1997-09-10 20:00:28 +02:00
|
|
|
#include "defaults.h"
|
1997-12-07 01:31:01 +01:00
|
|
|
#include <stddef.h>
|
|
|
|
#include "frame.h"
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1999-02-27 23:21:58 +01:00
|
|
|
/* We do not want to add the weak attribute to the declarations of these
|
|
|
|
routines in frame.h because that will cause the definition of these
|
|
|
|
symbols to be weak as well.
|
|
|
|
|
|
|
|
This exposes a core issue, how to handle creating weak references vs
|
|
|
|
how to create weak definitions. Either we have to have the definition
|
|
|
|
of TARGET_WEAK_ATTRIBUTE be conditional in the shared header files or
|
|
|
|
have a second declaration if we want a function's references to be weak,
|
|
|
|
but not its definition.
|
|
|
|
|
|
|
|
Making TARGET_WEAK_ATTRIBUTE conditional seems like a good solution until
|
|
|
|
one thinks about scaling to larger problems -- ie, the condition under
|
|
|
|
which TARGET_WEAK_ATTRIBUTE is active will eventually get far too
|
|
|
|
complicated.
|
|
|
|
|
|
|
|
So, we take an approach similar to #pragma weak -- we have a second
|
|
|
|
declaration for functions that we want to have weak references.
|
|
|
|
|
|
|
|
Neither way is particularly good. */
|
|
|
|
|
|
|
|
/* References to __register_frame_info and __deregister_frame_info should
|
|
|
|
be weak in this file if at all possible. */
|
|
|
|
extern void __register_frame_info (void *, struct object *)
|
|
|
|
TARGET_ATTRIBUTE_WEAK;
|
|
|
|
|
|
|
|
extern void *__deregister_frame_info (void *)
|
|
|
|
TARGET_ATTRIBUTE_WEAK;
|
|
|
|
|
1998-09-20 01:01:43 +02:00
|
|
|
#ifndef OBJECT_FORMAT_MACHO
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
/* Provide default definitions for the pseudo-ops used to switch to the
|
|
|
|
.ctors and .dtors sections.
|
|
|
|
|
|
|
|
Note that we want to give these sections the SHF_WRITE attribute
|
|
|
|
because these sections will actually contain data (i.e. tables of
|
|
|
|
addresses of functions in the current root executable or shared library
|
|
|
|
file) and, in the case of a shared library, the relocatable addresses
|
|
|
|
will have to be properly resolved/relocated (and then written into) by
|
|
|
|
the dynamic linker when it actually attaches the given shared library
|
|
|
|
to the executing process. (Note that on SVR4, you may wish to use the
|
|
|
|
`-z text' option to the ELF linker, when building a shared library, as
|
|
|
|
an additional check that you are doing everything right. But if you do
|
|
|
|
use the `-z text' option when building a shared library, you will get
|
|
|
|
errors unless the .ctors and .dtors sections are marked as writable
|
|
|
|
via the SHF_WRITE attribute.) */
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#ifndef CTORS_SECTION_ASM_OP
|
1994-11-19 05:09:58 +01:00
|
|
|
#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif
|
|
|
|
#ifndef DTORS_SECTION_ASM_OP
|
1994-11-19 05:09:58 +01:00
|
|
|
#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#ifdef OBJECT_FORMAT_ELF
|
|
|
|
|
|
|
|
/* Declare a pointer to void function type. */
|
|
|
|
typedef void (*func_ptr) (void);
|
|
|
|
#define STATIC static
|
|
|
|
|
|
|
|
#else /* OBJECT_FORMAT_ELF */
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#include "gbl-ctors.h"
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#define STATIC
|
|
|
|
|
|
|
|
#endif /* OBJECT_FORMAT_ELF */
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
#ifdef CRT_BEGIN
|
|
|
|
|
|
|
|
#ifdef INIT_SECTION_ASM_OP
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#ifdef OBJECT_FORMAT_ELF
|
|
|
|
|
1999-12-17 08:39:13 +01:00
|
|
|
/* Declare the __dso_handle variable. It should have a unique value
|
|
|
|
in every shared-object; in a main program its value is zero. */
|
|
|
|
|
|
|
|
#ifdef CRTSTUFFS_O
|
|
|
|
void *__dso_handle = &__dso_handle;
|
|
|
|
#else
|
|
|
|
void *__dso_handle = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* The __cxa_finalize function may not be available so we use only a
|
|
|
|
weak declaration. */
|
|
|
|
extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
/* Run all the global destructors on exit from the program. */
|
|
|
|
|
|
|
|
/* Some systems place the number of pointers in the first word of the
|
|
|
|
table. On SVR4 however, that word is -1. In all cases, the table is
|
|
|
|
null-terminated. On SVR4, we start from the beginning of the list and
|
|
|
|
invoke each per-compilation-unit destructor routine in order
|
|
|
|
until we find that null.
|
|
|
|
|
|
|
|
Note that this function MUST be static. There will be one of these
|
|
|
|
functions in each root executable and one in each shared library, but
|
|
|
|
although they all have the same code, each one is unique in that it
|
|
|
|
refers to one particular associated `__DTOR_LIST__' which belongs to the
|
1996-10-24 03:23:43 +02:00
|
|
|
same particular root executable or shared library file.
|
|
|
|
|
|
|
|
On some systems, this routine is run more than once from the .fini,
|
|
|
|
when exit is called recursively, so we arrange to remember where in
|
|
|
|
the list we left off processing, and we resume at that point,
|
|
|
|
should we be re-invoked. */
|
1994-11-19 05:09:58 +01:00
|
|
|
|
1997-09-10 20:00:28 +02:00
|
|
|
static char __EH_FRAME_BEGIN__[];
|
1994-11-19 05:09:58 +01:00
|
|
|
static func_ptr __DTOR_LIST__[];
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_dtors_aux (void)
|
1994-11-19 05:09:58 +01:00
|
|
|
{
|
1996-10-24 03:23:43 +02:00
|
|
|
static func_ptr *p = __DTOR_LIST__ + 1;
|
1997-11-25 19:55:32 +01:00
|
|
|
static int completed = 0;
|
|
|
|
|
|
|
|
if (completed)
|
|
|
|
return;
|
|
|
|
|
1999-12-17 08:39:13 +01:00
|
|
|
if (__dso_handle && __cxa_finalize)
|
|
|
|
__cxa_finalize (__dso_handle);
|
|
|
|
|
1996-10-24 03:23:43 +02:00
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
p++;
|
|
|
|
(*(p-1)) ();
|
|
|
|
}
|
1997-09-10 20:00:28 +02:00
|
|
|
|
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
1999-02-27 23:21:58 +01:00
|
|
|
if (__deregister_frame_info)
|
|
|
|
__deregister_frame_info (__EH_FRAME_BEGIN__);
|
1997-09-10 20:00:28 +02:00
|
|
|
#endif
|
1997-11-25 19:55:32 +01:00
|
|
|
completed = 1;
|
1994-11-19 05:09:58 +01:00
|
|
|
}
|
|
|
|
|
1997-11-25 19:55:32 +01:00
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
/* Stick a call to __do_global_dtors_aux into the .fini section. */
|
1996-07-04 00:07:53 +02:00
|
|
|
|
Warning fixes:
* Makefile.in (varasm.o): Depend on dbxout.h.
(cse.o): Depend on toplev.h and output.h.
(gcse.o): Depend on output.h.
* mips.c: Include system.h and toplev.h and remove redundant code.
Include output.h after tree.h so all its prototypes get activated.
* mips.md (table_jump): Remove unused variable `dest'.
* sparc.h: Add prototype for `v8plus_regcmp_op'.
* crtstuff.c (fini_dummy, init_dummy): Mark function definitions
with __attribute__ ((__unused__)).
(__frame_dummy): Provide prototype before use, wrap it with
EH_FRAME_SECTION_ASM_OP.
* cse.c: Move inclusion of <setjmp.h> above local headers.
Include toplev.h and output.h.
* dbxout.h: Add prototype for `dbxout_begin_function'.
* final.c (final_scan_insn): Wrap variable `max_skip' in macro
ASM_OUTPUT_MAX_SKIP_ALIGN.
* gcse.c: Include system.h and output.h.
(dump_cuid_table, dump_rd_table, dump_cprop_data, dump_pre_data):
Make extern instead of static.
(compute_can_copy): Only declare variables `reg' and `insn' when
AVOID_CCMODE_COPIES is not defined.
(record_set_info): Mark parameter `setter' with ATTRIBUTE_UNUSED.
(hash_scan_clobber): Likewise for `x' and `insn'.
(hash_scan_call): Likewise.
(record_last_set_info): Likewise for `setter'.
(mark_call): Likewise for `pat'.
(pre_insert_insn): Wrap variable `note' in macro HAVE_cc0.
* libgcc2.c (__bb_init_prg): Replace bzero with memset and fix the
length parameter so that it multiplies the number of elements by
the sizeof(element).
* output.h: Add prototype for `weak_finish'.
* recog.h: Likewise for `validate_replace_src'.
* rtl.h: Likewise for `optimize_save_area_alloca',
`fix_sched_param', `purge_addressof', `gcse_main',
`regmove_optimize', `dbr_schedule', `branch_prob' and
`end_branch_prob'.
* toplev.h: Likewise for `set_float_handler' and
`output_quoted_string'.
* varasm.c: Include dbxout.h.
From-SVN: r20351
1998-06-08 20:30:27 +02:00
|
|
|
static void __attribute__ ((__unused__))
|
1999-03-23 01:43:51 +01:00
|
|
|
fini_dummy (void)
|
1994-11-19 05:09:58 +01:00
|
|
|
{
|
|
|
|
asm (FINI_SECTION_ASM_OP);
|
|
|
|
__do_global_dtors_aux ();
|
|
|
|
#ifdef FORCE_FINI_SECTION_ALIGN
|
|
|
|
FORCE_FINI_SECTION_ALIGN;
|
|
|
|
#endif
|
|
|
|
asm (TEXT_SECTION_ASM_OP);
|
|
|
|
}
|
|
|
|
|
1997-09-10 20:00:28 +02:00
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
1997-12-15 08:05:04 +01:00
|
|
|
/* Stick a call to __register_frame_info into the .init section. For some
|
|
|
|
reason calls with no arguments work more reliably in .init, so stick the
|
|
|
|
call in another function. */
|
1997-09-10 20:00:28 +02:00
|
|
|
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
frame_dummy (void)
|
1997-09-10 20:00:28 +02:00
|
|
|
{
|
1997-12-07 01:31:01 +01:00
|
|
|
static struct object object;
|
1999-02-27 23:21:58 +01:00
|
|
|
if (__register_frame_info)
|
|
|
|
__register_frame_info (__EH_FRAME_BEGIN__, &object);
|
1997-09-10 20:00:28 +02:00
|
|
|
}
|
|
|
|
|
Warning fixes:
* Makefile.in (varasm.o): Depend on dbxout.h.
(cse.o): Depend on toplev.h and output.h.
(gcse.o): Depend on output.h.
* mips.c: Include system.h and toplev.h and remove redundant code.
Include output.h after tree.h so all its prototypes get activated.
* mips.md (table_jump): Remove unused variable `dest'.
* sparc.h: Add prototype for `v8plus_regcmp_op'.
* crtstuff.c (fini_dummy, init_dummy): Mark function definitions
with __attribute__ ((__unused__)).
(__frame_dummy): Provide prototype before use, wrap it with
EH_FRAME_SECTION_ASM_OP.
* cse.c: Move inclusion of <setjmp.h> above local headers.
Include toplev.h and output.h.
* dbxout.h: Add prototype for `dbxout_begin_function'.
* final.c (final_scan_insn): Wrap variable `max_skip' in macro
ASM_OUTPUT_MAX_SKIP_ALIGN.
* gcse.c: Include system.h and output.h.
(dump_cuid_table, dump_rd_table, dump_cprop_data, dump_pre_data):
Make extern instead of static.
(compute_can_copy): Only declare variables `reg' and `insn' when
AVOID_CCMODE_COPIES is not defined.
(record_set_info): Mark parameter `setter' with ATTRIBUTE_UNUSED.
(hash_scan_clobber): Likewise for `x' and `insn'.
(hash_scan_call): Likewise.
(record_last_set_info): Likewise for `setter'.
(mark_call): Likewise for `pat'.
(pre_insert_insn): Wrap variable `note' in macro HAVE_cc0.
* libgcc2.c (__bb_init_prg): Replace bzero with memset and fix the
length parameter so that it multiplies the number of elements by
the sizeof(element).
* output.h: Add prototype for `weak_finish'.
* recog.h: Likewise for `validate_replace_src'.
* rtl.h: Likewise for `optimize_save_area_alloca',
`fix_sched_param', `purge_addressof', `gcse_main',
`regmove_optimize', `dbr_schedule', `branch_prob' and
`end_branch_prob'.
* toplev.h: Likewise for `set_float_handler' and
`output_quoted_string'.
* varasm.c: Include dbxout.h.
From-SVN: r20351
1998-06-08 20:30:27 +02:00
|
|
|
static void __attribute__ ((__unused__))
|
1999-03-23 01:43:51 +01:00
|
|
|
init_dummy (void)
|
1997-09-10 20:00:28 +02:00
|
|
|
{
|
|
|
|
asm (INIT_SECTION_ASM_OP);
|
|
|
|
frame_dummy ();
|
|
|
|
#ifdef FORCE_INIT_SECTION_ALIGN
|
|
|
|
FORCE_INIT_SECTION_ALIGN;
|
|
|
|
#endif
|
|
|
|
asm (TEXT_SECTION_ASM_OP);
|
|
|
|
}
|
|
|
|
#endif /* EH_FRAME_SECTION_ASM_OP */
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#else /* OBJECT_FORMAT_ELF */
|
|
|
|
|
1992-03-19 21:41:45 +01:00
|
|
|
/* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o
|
1992-05-13 23:25:51 +02:00
|
|
|
and once in crtend.o). It must be declared static to avoid a link
|
1992-03-19 21:41:45 +01:00
|
|
|
error. Here, we define __do_global_ctors as an externally callable
|
|
|
|
function. It is externally callable so that __main can invoke it when
|
|
|
|
INVOKE__main is defined. This has the additional effect of forcing cc1
|
|
|
|
to switch to the .text section. */
|
1996-07-04 00:07:53 +02:00
|
|
|
|
1992-03-20 20:06:07 +01:00
|
|
|
static void __do_global_ctors_aux ();
|
1999-03-23 01:43:51 +01:00
|
|
|
void
|
|
|
|
__do_global_ctors (void)
|
1992-05-24 05:32:28 +02:00
|
|
|
{
|
|
|
|
#ifdef INVOKE__main /* If __main won't actually call __do_global_ctors
|
|
|
|
then it doesn't matter what's inside the function.
|
|
|
|
The inside of __do_global_ctors_aux is called
|
|
|
|
automatically in that case.
|
|
|
|
And the Alliant fx2800 linker crashes
|
|
|
|
on this reference. So prevent the crash. */
|
|
|
|
__do_global_ctors_aux ();
|
|
|
|
#endif
|
|
|
|
}
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
asm (INIT_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
|
|
|
|
|
1995-05-20 01:30:17 +02:00
|
|
|
/* On some svr4 systems, the initial .init section preamble code provided in
|
|
|
|
crti.o may do something, such as bump the stack, which we have to
|
|
|
|
undo before we reach the function prologue code for __do_global_ctors
|
|
|
|
(directly below). For such systems, define the macro INIT_SECTION_PREAMBLE
|
1996-07-04 00:07:53 +02:00
|
|
|
to expand into the code needed to undo the actions of the crti.o file. */
|
1995-05-20 01:30:17 +02:00
|
|
|
|
|
|
|
#ifdef INIT_SECTION_PREAMBLE
|
|
|
|
INIT_SECTION_PREAMBLE;
|
|
|
|
#endif
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
/* A routine to invoke all of the global constructors upon entry to the
|
|
|
|
program. We put this into the .init section (for systems that have
|
|
|
|
such a thing) so that we can properly perform the construction of
|
|
|
|
file-scope static-storage C++ objects within shared libraries. */
|
|
|
|
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_ctors_aux (void) /* prologue goes in .init section */
|
1992-03-07 05:32:07 +01:00
|
|
|
{
|
1993-02-06 00:41:52 +01:00
|
|
|
#ifdef FORCE_INIT_SECTION_ALIGN
|
|
|
|
FORCE_INIT_SECTION_ALIGN; /* Explicit align before switch to .text */
|
|
|
|
#endif
|
1992-03-07 05:32:07 +01:00
|
|
|
asm (TEXT_SECTION_ASM_OP); /* don't put epilogue and body in .init */
|
|
|
|
DO_GLOBAL_CTORS_BODY;
|
1999-09-20 20:59:09 +02:00
|
|
|
atexit (__do_global_dtors);
|
1992-03-07 05:32:07 +01:00
|
|
|
}
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#endif /* OBJECT_FORMAT_ELF */
|
1996-10-16 22:25:25 +02:00
|
|
|
|
|
|
|
#else /* defined(INIT_SECTION_ASM_OP) */
|
|
|
|
|
1996-10-31 20:53:37 +01:00
|
|
|
#ifdef HAS_INIT_SECTION
|
1996-10-16 22:25:25 +02:00
|
|
|
/* This case is used by the Irix 6 port, which supports named sections but
|
|
|
|
not an SVR4-style .fini section. __do_global_dtors can be non-static
|
1997-09-10 20:00:28 +02:00
|
|
|
in this case because we protect it with -hidden_symbol. */
|
|
|
|
|
|
|
|
static char __EH_FRAME_BEGIN__[];
|
1996-10-16 22:25:25 +02:00
|
|
|
static func_ptr __DTOR_LIST__[];
|
|
|
|
void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_dtors (void)
|
1996-10-16 22:25:25 +02:00
|
|
|
{
|
|
|
|
func_ptr *p;
|
|
|
|
for (p = __DTOR_LIST__ + 1; *p; p++)
|
|
|
|
(*p) ();
|
1997-09-10 20:00:28 +02:00
|
|
|
|
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
1999-02-27 23:21:58 +01:00
|
|
|
if (__deregister_frame_info)
|
|
|
|
__deregister_frame_info (__EH_FRAME_BEGIN__);
|
1997-09-10 20:00:28 +02:00
|
|
|
#endif
|
1996-10-16 22:25:25 +02:00
|
|
|
}
|
1998-01-02 23:50:23 +01:00
|
|
|
|
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
|
|
|
/* Define a function here to call __register_frame. crtend.o is linked in
|
|
|
|
after libgcc.a, and hence can't call libgcc.a functions directly. That
|
|
|
|
can lead to unresolved function references. */
|
|
|
|
void
|
1999-03-23 01:43:51 +01:00
|
|
|
__frame_dummy (void)
|
1998-01-02 23:50:23 +01:00
|
|
|
{
|
|
|
|
static struct object object;
|
1999-02-27 23:21:58 +01:00
|
|
|
if (__register_frame_info)
|
|
|
|
__register_frame_info (__EH_FRAME_BEGIN__, &object);
|
1998-01-02 23:50:23 +01:00
|
|
|
}
|
|
|
|
#endif
|
1996-10-31 20:53:37 +01:00
|
|
|
#endif
|
1996-10-16 22:25:25 +02:00
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif /* defined(INIT_SECTION_ASM_OP) */
|
|
|
|
|
|
|
|
/* Force cc1 to switch to .data section. */
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
/* NOTE: In order to be able to support SVR4 shared libraries, we arrange
|
|
|
|
to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
|
|
|
|
__DTOR_END__ } per root executable and also one set of these symbols
|
|
|
|
per shared library. So in any given whole process image, we may have
|
|
|
|
multiple definitions of each of these symbols. In order to prevent
|
|
|
|
these definitions from conflicting with one another, and in order to
|
|
|
|
ensure that the proper lists are used for the initialization/finalization
|
|
|
|
of each individual shared library (respectively), we give these symbols
|
|
|
|
only internal (i.e. `static') linkage, and we also make it a point to
|
|
|
|
refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
|
|
|
|
symbol in crtbegin.o, where they are defined. */
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
/* The -1 is a flag to __do_global_[cd]tors
|
|
|
|
indicating that this table does not start with a count of elements. */
|
1992-03-19 21:41:45 +01:00
|
|
|
#ifdef CTOR_LIST_BEGIN
|
|
|
|
CTOR_LIST_BEGIN;
|
|
|
|
#else
|
1992-03-07 05:32:07 +01:00
|
|
|
asm (CTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
STATIC func_ptr __CTOR_LIST__[1] __attribute__ ((__unused__))
|
|
|
|
= { (func_ptr) (-1) };
|
1992-03-19 21:41:45 +01:00
|
|
|
#endif
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1992-03-19 21:41:45 +01:00
|
|
|
#ifdef DTOR_LIST_BEGIN
|
|
|
|
DTOR_LIST_BEGIN;
|
|
|
|
#else
|
1992-03-07 05:32:07 +01:00
|
|
|
asm (DTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
|
1994-11-19 05:09:58 +01:00
|
|
|
STATIC func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
|
1992-03-19 21:41:45 +01:00
|
|
|
#endif
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1997-09-10 20:00:28 +02:00
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
|
|
|
/* Stick a label at the beginning of the frame unwind info so we can register
|
|
|
|
and deregister it with the exception handling library code. */
|
|
|
|
|
|
|
|
asm (EH_FRAME_SECTION_ASM_OP);
|
|
|
|
#ifdef INIT_SECTION_ASM_OP
|
|
|
|
STATIC
|
|
|
|
#endif
|
|
|
|
char __EH_FRAME_BEGIN__[] = { };
|
|
|
|
#endif /* EH_FRAME_SECTION_ASM_OP */
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif /* defined(CRT_BEGIN) */
|
|
|
|
|
|
|
|
#ifdef CRT_END
|
|
|
|
|
|
|
|
#ifdef INIT_SECTION_ASM_OP
|
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#ifdef OBJECT_FORMAT_ELF
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
static func_ptr __CTOR_END__[];
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_ctors_aux (void)
|
1994-11-19 05:09:58 +01:00
|
|
|
{
|
|
|
|
func_ptr *p;
|
|
|
|
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
|
|
|
|
(*p) ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Stick a call to __do_global_ctors_aux into the .init section. */
|
1996-07-04 00:07:53 +02:00
|
|
|
|
Warning fixes:
* Makefile.in (varasm.o): Depend on dbxout.h.
(cse.o): Depend on toplev.h and output.h.
(gcse.o): Depend on output.h.
* mips.c: Include system.h and toplev.h and remove redundant code.
Include output.h after tree.h so all its prototypes get activated.
* mips.md (table_jump): Remove unused variable `dest'.
* sparc.h: Add prototype for `v8plus_regcmp_op'.
* crtstuff.c (fini_dummy, init_dummy): Mark function definitions
with __attribute__ ((__unused__)).
(__frame_dummy): Provide prototype before use, wrap it with
EH_FRAME_SECTION_ASM_OP.
* cse.c: Move inclusion of <setjmp.h> above local headers.
Include toplev.h and output.h.
* dbxout.h: Add prototype for `dbxout_begin_function'.
* final.c (final_scan_insn): Wrap variable `max_skip' in macro
ASM_OUTPUT_MAX_SKIP_ALIGN.
* gcse.c: Include system.h and output.h.
(dump_cuid_table, dump_rd_table, dump_cprop_data, dump_pre_data):
Make extern instead of static.
(compute_can_copy): Only declare variables `reg' and `insn' when
AVOID_CCMODE_COPIES is not defined.
(record_set_info): Mark parameter `setter' with ATTRIBUTE_UNUSED.
(hash_scan_clobber): Likewise for `x' and `insn'.
(hash_scan_call): Likewise.
(record_last_set_info): Likewise for `setter'.
(mark_call): Likewise for `pat'.
(pre_insert_insn): Wrap variable `note' in macro HAVE_cc0.
* libgcc2.c (__bb_init_prg): Replace bzero with memset and fix the
length parameter so that it multiplies the number of elements by
the sizeof(element).
* output.h: Add prototype for `weak_finish'.
* recog.h: Likewise for `validate_replace_src'.
* rtl.h: Likewise for `optimize_save_area_alloca',
`fix_sched_param', `purge_addressof', `gcse_main',
`regmove_optimize', `dbr_schedule', `branch_prob' and
`end_branch_prob'.
* toplev.h: Likewise for `set_float_handler' and
`output_quoted_string'.
* varasm.c: Include dbxout.h.
From-SVN: r20351
1998-06-08 20:30:27 +02:00
|
|
|
static void __attribute__ ((__unused__))
|
1999-03-23 01:43:51 +01:00
|
|
|
init_dummy (void)
|
1994-11-19 05:09:58 +01:00
|
|
|
{
|
|
|
|
asm (INIT_SECTION_ASM_OP);
|
|
|
|
__do_global_ctors_aux ();
|
|
|
|
#ifdef FORCE_INIT_SECTION_ALIGN
|
|
|
|
FORCE_INIT_SECTION_ALIGN;
|
|
|
|
#endif
|
|
|
|
asm (TEXT_SECTION_ASM_OP);
|
1994-12-08 19:49:36 +01:00
|
|
|
|
1997-12-07 01:31:01 +01:00
|
|
|
/* This is a kludge. The i386 GNU/Linux dynamic linker needs ___brk_addr,
|
1996-06-28 20:08:53 +02:00
|
|
|
__environ and atexit (). We have to make sure they are in the .dynsym
|
|
|
|
section. We accomplish it by making a dummy call here. This
|
1996-07-04 00:07:53 +02:00
|
|
|
code is never reached. */
|
1994-12-08 19:49:36 +01:00
|
|
|
|
1996-06-28 20:08:53 +02:00
|
|
|
#if defined(__linux__) && defined(__PIC__) && defined(__i386__)
|
1994-12-08 19:49:36 +01:00
|
|
|
{
|
|
|
|
extern void *___brk_addr;
|
|
|
|
extern char **__environ;
|
|
|
|
|
|
|
|
___brk_addr = __environ;
|
|
|
|
atexit ();
|
|
|
|
}
|
|
|
|
#endif
|
1994-11-19 05:09:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#else /* OBJECT_FORMAT_ELF */
|
|
|
|
|
|
|
|
/* Stick the real initialization code, followed by a normal sort of
|
|
|
|
function epilogue at the very end of the .init section for this
|
|
|
|
entire root executable file or for this entire shared library file.
|
|
|
|
|
|
|
|
Note that we use some tricks here to get *just* the body and just
|
|
|
|
a function epilogue (but no function prologue) into the .init
|
1995-05-16 14:39:54 +02:00
|
|
|
section of the crtend.o file. Specifically, we switch to the .text
|
1994-11-19 05:09:58 +01:00
|
|
|
section, start to define a function, and then we switch to the .init
|
|
|
|
section just before the body code.
|
|
|
|
|
|
|
|
Earlier on, we put the corresponding function prologue into the .init
|
|
|
|
section of the crtbegin.o file (which will be linked in first).
|
|
|
|
|
|
|
|
Note that we want to invoke all constructors for C++ file-scope static-
|
|
|
|
storage objects AFTER any other possible initialization actions which
|
|
|
|
may be performed by the code in the .init section contributions made by
|
|
|
|
other libraries, etc. That's because those other initializations may
|
|
|
|
include setup operations for very primitive things (e.g. initializing
|
|
|
|
the state of the floating-point coprocessor, etc.) which should be done
|
1996-07-04 00:07:53 +02:00
|
|
|
before we start to execute any of the user's code. */
|
1992-03-07 05:32:07 +01:00
|
|
|
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_ctors_aux (void) /* prologue goes in .text section */
|
1992-03-07 05:32:07 +01:00
|
|
|
{
|
|
|
|
asm (INIT_SECTION_ASM_OP);
|
|
|
|
DO_GLOBAL_CTORS_BODY;
|
1999-09-20 20:59:09 +02:00
|
|
|
atexit (__do_global_dtors);
|
1998-04-04 15:32:39 +02:00
|
|
|
} /* epilogue and body go in .init section */
|
|
|
|
|
1998-01-14 21:57:58 +01:00
|
|
|
#ifdef FORCE_INIT_SECTION_ALIGN
|
1998-04-04 15:32:39 +02:00
|
|
|
FORCE_INIT_SECTION_ALIGN;
|
1998-01-14 21:57:58 +01:00
|
|
|
#endif
|
1998-04-04 15:32:39 +02:00
|
|
|
|
|
|
|
asm (TEXT_SECTION_ASM_OP);
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
#endif /* OBJECT_FORMAT_ELF */
|
|
|
|
|
1996-10-16 22:25:25 +02:00
|
|
|
#else /* defined(INIT_SECTION_ASM_OP) */
|
|
|
|
|
1996-10-31 20:53:37 +01:00
|
|
|
#ifdef HAS_INIT_SECTION
|
1996-10-16 22:25:25 +02:00
|
|
|
/* This case is used by the Irix 6 port, which supports named sections but
|
|
|
|
not an SVR4-style .init section. __do_global_ctors can be non-static
|
1997-09-10 20:00:28 +02:00
|
|
|
in this case because we protect it with -hidden_symbol. */
|
1996-10-16 22:25:25 +02:00
|
|
|
static func_ptr __CTOR_END__[];
|
Warning fixes:
* Makefile.in (varasm.o): Depend on dbxout.h.
(cse.o): Depend on toplev.h and output.h.
(gcse.o): Depend on output.h.
* mips.c: Include system.h and toplev.h and remove redundant code.
Include output.h after tree.h so all its prototypes get activated.
* mips.md (table_jump): Remove unused variable `dest'.
* sparc.h: Add prototype for `v8plus_regcmp_op'.
* crtstuff.c (fini_dummy, init_dummy): Mark function definitions
with __attribute__ ((__unused__)).
(__frame_dummy): Provide prototype before use, wrap it with
EH_FRAME_SECTION_ASM_OP.
* cse.c: Move inclusion of <setjmp.h> above local headers.
Include toplev.h and output.h.
* dbxout.h: Add prototype for `dbxout_begin_function'.
* final.c (final_scan_insn): Wrap variable `max_skip' in macro
ASM_OUTPUT_MAX_SKIP_ALIGN.
* gcse.c: Include system.h and output.h.
(dump_cuid_table, dump_rd_table, dump_cprop_data, dump_pre_data):
Make extern instead of static.
(compute_can_copy): Only declare variables `reg' and `insn' when
AVOID_CCMODE_COPIES is not defined.
(record_set_info): Mark parameter `setter' with ATTRIBUTE_UNUSED.
(hash_scan_clobber): Likewise for `x' and `insn'.
(hash_scan_call): Likewise.
(record_last_set_info): Likewise for `setter'.
(mark_call): Likewise for `pat'.
(pre_insert_insn): Wrap variable `note' in macro HAVE_cc0.
* libgcc2.c (__bb_init_prg): Replace bzero with memset and fix the
length parameter so that it multiplies the number of elements by
the sizeof(element).
* output.h: Add prototype for `weak_finish'.
* recog.h: Likewise for `validate_replace_src'.
* rtl.h: Likewise for `optimize_save_area_alloca',
`fix_sched_param', `purge_addressof', `gcse_main',
`regmove_optimize', `dbr_schedule', `branch_prob' and
`end_branch_prob'.
* toplev.h: Likewise for `set_float_handler' and
`output_quoted_string'.
* varasm.c: Include dbxout.h.
From-SVN: r20351
1998-06-08 20:30:27 +02:00
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
|
|
|
extern void __frame_dummy (void);
|
|
|
|
#endif
|
1996-10-16 22:25:25 +02:00
|
|
|
void
|
1999-03-23 01:43:51 +01:00
|
|
|
__do_global_ctors (void)
|
1996-10-16 22:25:25 +02:00
|
|
|
{
|
|
|
|
func_ptr *p;
|
1997-09-10 20:00:28 +02:00
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
1998-01-02 23:50:23 +01:00
|
|
|
__frame_dummy ();
|
1997-09-10 20:00:28 +02:00
|
|
|
#endif
|
1996-10-16 22:25:25 +02:00
|
|
|
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
|
|
|
|
(*p) ();
|
|
|
|
}
|
1996-10-31 20:53:37 +01:00
|
|
|
#endif
|
1996-10-16 22:25:25 +02:00
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif /* defined(INIT_SECTION_ASM_OP) */
|
|
|
|
|
|
|
|
/* Force cc1 to switch to .data section. */
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1994-11-19 05:09:58 +01:00
|
|
|
/* Put a word containing zero at the end of each of our two lists of function
|
|
|
|
addresses. Note that the words defined here go into the .ctors and .dtors
|
|
|
|
sections of the crtend.o file, and since that file is always linked in
|
|
|
|
last, these words naturally end up at the very ends of the two lists
|
|
|
|
contained in these two sections. */
|
|
|
|
|
1992-03-19 21:41:45 +01:00
|
|
|
#ifdef CTOR_LIST_END
|
|
|
|
CTOR_LIST_END;
|
|
|
|
#else
|
1992-03-07 05:32:07 +01:00
|
|
|
asm (CTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
|
1994-11-19 05:09:58 +01:00
|
|
|
STATIC func_ptr __CTOR_END__[1] = { (func_ptr) 0 };
|
1992-03-19 21:41:45 +01:00
|
|
|
#endif
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1992-03-19 21:41:45 +01:00
|
|
|
#ifdef DTOR_LIST_END
|
|
|
|
DTOR_LIST_END;
|
|
|
|
#else
|
1992-03-07 05:32:07 +01:00
|
|
|
asm (DTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
STATIC func_ptr __DTOR_END__[1] __attribute__ ((__unused__))
|
|
|
|
= { (func_ptr) 0 };
|
1992-03-19 21:41:45 +01:00
|
|
|
#endif
|
1992-03-07 05:32:07 +01:00
|
|
|
|
1997-09-10 20:00:28 +02:00
|
|
|
#ifdef EH_FRAME_SECTION_ASM_OP
|
|
|
|
/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
|
|
|
|
this would be the 'length' field in a real FDE. */
|
|
|
|
|
|
|
|
typedef unsigned int ui32 __attribute__ ((mode (SI)));
|
|
|
|
asm (EH_FRAME_SECTION_ASM_OP);
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
STATIC ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
|
1997-09-10 20:00:28 +02:00
|
|
|
#endif /* EH_FRAME_SECTION */
|
|
|
|
|
1992-03-07 05:32:07 +01:00
|
|
|
#endif /* defined(CRT_END) */
|
1998-09-20 01:01:43 +02:00
|
|
|
|
|
|
|
#else /* OBJECT_FORMAT_MACHO */
|
|
|
|
|
|
|
|
/* For Mach-O format executables, we assume that the system's runtime is
|
|
|
|
smart enough to handle constructors and destructors, but doesn't have
|
|
|
|
an init section (if it can't even handle constructors/destructors
|
|
|
|
you should be using INVOKE__main, not crtstuff). All we need to do
|
|
|
|
is install/deinstall the frame information for exceptions. We do this
|
|
|
|
by putting a constructor in crtbegin.o and a destructor in crtend.o.
|
|
|
|
|
|
|
|
crtend.o also puts in the terminating zero in the frame information
|
|
|
|
segment. */
|
|
|
|
|
|
|
|
/* The crtstuff for other object formats use the symbol __EH_FRAME_BEGIN__
|
|
|
|
to figure out the start of the exception frame, but here we use
|
|
|
|
getsectbynamefromheader to find this value. Either method would work,
|
|
|
|
but this method avoids creating any global symbols, which seems
|
|
|
|
cleaner. */
|
|
|
|
|
|
|
|
#include <mach-o/ldsyms.h>
|
|
|
|
extern const struct section *
|
|
|
|
getsectbynamefromheader (const struct mach_header *,
|
|
|
|
const char *, const char *);
|
|
|
|
|
|
|
|
#ifdef CRT_BEGIN
|
|
|
|
|
|
|
|
static void __reg_frame_ctor () __attribute__ ((constructor));
|
|
|
|
|
|
|
|
static void
|
1999-03-23 01:43:51 +01:00
|
|
|
__reg_frame_ctor (void)
|
1998-09-20 01:01:43 +02:00
|
|
|
{
|
|
|
|
static struct object object;
|
|
|
|
const struct section *eh_frame;
|
|
|
|
|
|
|
|
eh_frame = getsectbynamefromheader (&_mh_execute_header,
|
|
|
|
"__TEXT", "__eh_frame");
|
|
|
|
__register_frame_info ((void *) eh_frame->addr, &object);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CRT_BEGIN */
|
|
|
|
|
|
|
|
#ifdef CRT_END
|
|
|
|
|
|
|
|
static void __dereg_frame_dtor () __attribute__ ((destructor));
|
|
|
|
|
|
|
|
static
|
1999-03-23 01:43:51 +01:00
|
|
|
void
|
|
|
|
__dereg_frame_dtor (void)
|
1998-09-20 01:01:43 +02:00
|
|
|
{
|
|
|
|
const struct section *eh_frame;
|
|
|
|
|
|
|
|
eh_frame = getsectbynamefromheader (&_mh_execute_header,
|
|
|
|
"__TEXT", "__eh_frame");
|
|
|
|
__deregister_frame_info ((void *) eh_frame->addr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Terminate the frame section with a final zero. */
|
|
|
|
|
|
|
|
/* Force cc1 to switch to .data section. */
|
|
|
|
static void * force_to_data[0] __attribute__ ((__unused__)) = { };
|
|
|
|
|
|
|
|
typedef unsigned int ui32 __attribute__ ((mode (SI)));
|
|
|
|
asm (EH_FRAME_SECTION_ASM_OP);
|
|
|
|
static ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
|
|
|
|
|
|
|
|
#endif /* CRT_END */
|
|
|
|
|
|
|
|
#endif /* OBJECT_FORMAT_MACHO */
|
|
|
|
|