mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-18 08:23:50 +08:00
crtstuff.c: Move list heads before code that uses them.
* crtstuff.c: Move list heads before code that uses them. (__JCR_LIST__): Remove initial null. (frame_dummy, __frame_dummy): Do java registration here ... (__do_global_ctors_aux): ... not here. From-SVN: r45022
This commit is contained in:
parent
6ca3c22fd1
commit
213f974a3a
@ -1,3 +1,10 @@
|
||||
2001-08-18 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* crtstuff.c: Move list heads before code that uses them.
|
||||
(__JCR_LIST__): Remove initial null.
|
||||
(frame_dummy, __frame_dummy): Do java registration here ...
|
||||
(__do_global_ctors_aux): ... not here.
|
||||
|
||||
2001-08-18 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* flow.c (mark_regs_live_at_end): Use regs_invalidated_by_call.
|
||||
|
179
gcc/crtstuff.c
179
gcc/crtstuff.c
@ -98,6 +98,9 @@ extern void *__deregister_frame_info (void *)
|
||||
extern void *__deregister_frame_info_bases (void *)
|
||||
TARGET_ATTRIBUTE_WEAK;
|
||||
|
||||
/* Likewise for _Jv_RegisterClasses. */
|
||||
extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK;
|
||||
|
||||
#ifndef OBJECT_FORMAT_MACHO
|
||||
|
||||
#ifdef OBJECT_FORMAT_ELF
|
||||
@ -118,6 +121,69 @@ typedef void (*func_ptr) (void);
|
||||
|
||||
#ifdef INIT_SECTION_ASM_OP
|
||||
|
||||
/* 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. */
|
||||
|
||||
/* The -1 is a flag to __do_global_[cd]tors indicating that this table
|
||||
does not start with a count of elements. */
|
||||
#ifdef CTOR_LIST_BEGIN
|
||||
CTOR_LIST_BEGIN;
|
||||
#elif defined(CTORS_SECTION_ASM_OP)
|
||||
/* Hack: force cc1 to switch to .data section early, so that assembling
|
||||
__CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
|
||||
static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
|
||||
asm (CTORS_SECTION_ASM_OP);
|
||||
STATIC func_ptr __CTOR_LIST__[1]
|
||||
__attribute__ ((__unused__, aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#else
|
||||
STATIC func_ptr __CTOR_LIST__[1]
|
||||
__attribute__ ((__unused__, section(".ctors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#endif /* __CTOR_LIST__ alternatives */
|
||||
|
||||
#ifdef DTOR_LIST_BEGIN
|
||||
DTOR_LIST_BEGIN;
|
||||
#elif defined(DTORS_SECTION_ASM_OP)
|
||||
asm (DTORS_SECTION_ASM_OP);
|
||||
STATIC func_ptr __DTOR_LIST__[1]
|
||||
__attribute__ ((aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#else
|
||||
STATIC func_ptr __DTOR_LIST__[1]
|
||||
__attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#endif /* __DTOR_LIST__ alternatives */
|
||||
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
/* Stick a label at the beginning of the frame unwind info so we can register
|
||||
and deregister it with the exception handling library code. */
|
||||
#ifdef INIT_SECTION_ASM_OP
|
||||
STATIC
|
||||
#endif
|
||||
char __EH_FRAME_BEGIN__[]
|
||||
__attribute__((section(EH_FRAME_SECTION_NAME), aligned(4)))
|
||||
= { };
|
||||
#endif /* EH_FRAME_SECTION_NAME */
|
||||
|
||||
#ifdef JCR_SECTION_NAME
|
||||
/* Stick a label at the beginning of the java class registration info
|
||||
so we can register them properly. */
|
||||
|
||||
STATIC void *__JCR_LIST__[]
|
||||
__attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*))))
|
||||
= { };
|
||||
#endif /* JCR_SECTION_NAME */
|
||||
|
||||
#ifdef OBJECT_FORMAT_ELF
|
||||
|
||||
/* Declare the __dso_handle variable. It should have a unique value
|
||||
@ -162,8 +228,6 @@ extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
|
||||
the list we left off processing, and we resume at that point,
|
||||
should we be re-invoked. */
|
||||
|
||||
static char __EH_FRAME_BEGIN__[];
|
||||
static func_ptr __DTOR_LIST__[];
|
||||
static void
|
||||
__do_global_dtors_aux (void)
|
||||
{
|
||||
@ -214,7 +278,7 @@ fini_dummy (void)
|
||||
asm (TEXT_SECTION_ASM_OP);
|
||||
}
|
||||
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
|
||||
/* 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. */
|
||||
@ -222,6 +286,7 @@ fini_dummy (void)
|
||||
static void
|
||||
frame_dummy (void)
|
||||
{
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
static struct object object;
|
||||
#if defined(CRT_GET_RFIB_TEXT) || defined(CRT_GET_RFIB_DATA)
|
||||
void *tbase, *dbase;
|
||||
@ -241,6 +306,11 @@ frame_dummy (void)
|
||||
if (__register_frame_info)
|
||||
__register_frame_info (__EH_FRAME_BEGIN__, &object);
|
||||
#endif
|
||||
#endif /* EH_FRAME_SECTION_NAME */
|
||||
#ifdef JCR_SECTION_NAME
|
||||
if (__JCR_LIST__[0] && _Jv_RegisterClasses)
|
||||
_Jv_RegisterClasses (__JCR_LIST__);
|
||||
#endif /* JCR_SECTION_NAME */
|
||||
}
|
||||
|
||||
static void __attribute__ ((__unused__))
|
||||
@ -253,7 +323,7 @@ init_dummy (void)
|
||||
#endif
|
||||
asm (TEXT_SECTION_ASM_OP);
|
||||
}
|
||||
#endif /* EH_FRAME_SECTION_NAME */
|
||||
#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
|
||||
|
||||
#else /* OBJECT_FORMAT_ELF */
|
||||
|
||||
@ -308,15 +378,13 @@ __do_global_ctors_aux (void) /* prologue goes in .init section */
|
||||
|
||||
#endif /* OBJECT_FORMAT_ELF */
|
||||
|
||||
#else /* defined(INIT_SECTION_ASM_OP) */
|
||||
#else /* INIT_SECTION_ASM_OP */
|
||||
|
||||
#ifdef HAS_INIT_SECTION
|
||||
/* 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
|
||||
in this case because we protect it with -hidden_symbol. */
|
||||
|
||||
static char __EH_FRAME_BEGIN__[];
|
||||
static func_ptr __DTOR_LIST__[];
|
||||
void
|
||||
__do_global_dtors (void)
|
||||
{
|
||||
@ -330,88 +398,27 @@ __do_global_dtors (void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
|
||||
/* 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
|
||||
__frame_dummy (void)
|
||||
{
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
static struct object object;
|
||||
if (__register_frame_info)
|
||||
__register_frame_info (__EH_FRAME_BEGIN__, &object);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* defined(INIT_SECTION_ASM_OP) */
|
||||
|
||||
/* 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. */
|
||||
|
||||
/* The -1 is a flag to __do_global_[cd]tors indicating that this table
|
||||
does not start with a count of elements. */
|
||||
#ifdef CTOR_LIST_BEGIN
|
||||
CTOR_LIST_BEGIN;
|
||||
|
||||
#elif defined(CTORS_SECTION_ASM_OP)
|
||||
/* Hack: force cc1 to switch to .data section early, so that assembling
|
||||
__CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
|
||||
static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
|
||||
asm (CTORS_SECTION_ASM_OP);
|
||||
STATIC func_ptr __CTOR_LIST__[1]
|
||||
__attribute__ ((__unused__, aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
|
||||
#else
|
||||
STATIC func_ptr __CTOR_LIST__[1]
|
||||
__attribute__ ((__unused__, section(".ctors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DTOR_LIST_BEGIN
|
||||
DTOR_LIST_BEGIN;
|
||||
#elif defined(DTORS_SECTION_ASM_OP)
|
||||
asm (DTORS_SECTION_ASM_OP);
|
||||
STATIC func_ptr __DTOR_LIST__[1]
|
||||
__attribute__ ((aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#else
|
||||
STATIC func_ptr __DTOR_LIST__[1]
|
||||
__attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (-1) };
|
||||
#endif
|
||||
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
/* Stick a label at the beginning of the frame unwind info so we can register
|
||||
and deregister it with the exception handling library code. */
|
||||
#ifdef INIT_SECTION_ASM_OP
|
||||
STATIC
|
||||
#endif
|
||||
char __EH_FRAME_BEGIN__[]
|
||||
__attribute__((section(EH_FRAME_SECTION_NAME), aligned(4)))
|
||||
= { };
|
||||
#endif /* EH_FRAME_SECTION_NAME */
|
||||
|
||||
#ifdef JCR_SECTION_NAME
|
||||
/* Stick a label at the beginning of the java class registration info
|
||||
so we can register them properly. */
|
||||
|
||||
STATIC void *__JCR_LIST__[]
|
||||
__attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(func_ptr))))
|
||||
= { 0 };
|
||||
#endif /* JCR_SECTION_NAME */
|
||||
if (__JCR_LIST__[0] && _Jv_RegisterClasses)
|
||||
_Jv_RegisterClasses (__JCR_LIST__);
|
||||
#endif
|
||||
}
|
||||
#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
|
||||
|
||||
#endif /* HAS_INIT_SECTION */
|
||||
#endif /* INIT_SECTION_ASM_OP */
|
||||
#endif /* defined(CRT_BEGIN) */
|
||||
|
||||
#ifdef CRT_END
|
||||
@ -420,25 +427,11 @@ STATIC void *__JCR_LIST__[]
|
||||
|
||||
#ifdef OBJECT_FORMAT_ELF
|
||||
|
||||
#ifdef JCR_SECTION_NAME
|
||||
extern void _Jv_RegisterClasses (void *) __attribute__((weak));
|
||||
static void *__JCR_END__[];
|
||||
#endif
|
||||
|
||||
static func_ptr __CTOR_END__[];
|
||||
static void
|
||||
__do_global_ctors_aux (void)
|
||||
{
|
||||
func_ptr *p;
|
||||
#ifdef JCR_SECTION_NAME
|
||||
void **jcr;
|
||||
if (_Jv_RegisterClasses)
|
||||
{
|
||||
for (jcr = __JCR_END__ - 1; *jcr != NULL; jcr--);
|
||||
if (*(jcr + 1))
|
||||
_Jv_RegisterClasses (jcr + 1);
|
||||
}
|
||||
#endif
|
||||
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
|
||||
(*p) ();
|
||||
}
|
||||
@ -505,14 +498,12 @@ asm (TEXT_SECTION_ASM_OP);
|
||||
not an SVR4-style .init section. __do_global_ctors can be non-static
|
||||
in this case because we protect it with -hidden_symbol. */
|
||||
static func_ptr __CTOR_END__[];
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
extern void __frame_dummy (void);
|
||||
#endif
|
||||
void
|
||||
__do_global_ctors (void)
|
||||
{
|
||||
func_ptr *p;
|
||||
#ifdef EH_FRAME_SECTION_NAME
|
||||
#if defind(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
|
||||
__frame_dummy ();
|
||||
#endif
|
||||
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
|
||||
|
Loading…
Reference in New Issue
Block a user