- Reimplemented the constructor/destructor invocation code for GCC.

Both the 68k and PowerPC platform now invoke them in the same order
  and the 68k code uses the designated invocation priorities. The
  PowerPC destructor function now sets up the exit() jmp_buf before
  the destructor functions are called.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14874 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
Olaf Barthel
2005-03-10 09:55:03 +00:00
parent 91f12dd8f0
commit db8710d2ae
8 changed files with 140 additions and 231 deletions
+19 -78
View File
@@ -1,11 +1,15 @@
/*
* $Id: crtbegin.c,v 1.5 2005-03-09 21:07:25 obarthel Exp $
* $Id: crtbegin.c,v 1.6 2005-03-10 09:55:03 obarthel Exp $
*
* :ts=4
*
* Handles global constructors and destructors.
* Handles global constructors and destructors for the OS4 GCC build.
*/
#if defined(__amigaos4__)
/****************************************************************************/
#include <exec/types.h>
/****************************************************************************/
@@ -15,10 +19,6 @@
/****************************************************************************/
#if defined(__amigaos4__)
/****************************************************************************/
/*
* Dummy constructor and destructor array. The linker script will put these at the
* very beginning of section ".ctors" and ".dtors". crtend.o contains a similar entry
@@ -30,8 +30,8 @@ static void (*__DTOR_LIST__[1]) (void) __attribute__(( used, section(".dtors"),
/****************************************************************************/
STATIC VOID
_do_ctors(void)
void
_init(void)
{
int num_ctors;
int i;
@@ -47,85 +47,26 @@ _do_ctors(void)
/****************************************************************************/
STATIC VOID
_do_dtors(void)
void
_fini(void)
{
int num_dtors;
int i;
num_dtors = 0;
for(i = 1 ; __DTOR_LIST__[i] != NULL ; i++)
num_dtors++;
for(i = 0 ; i < num_dtors ; i++)
__DTOR_LIST__[i+1]();
}
/****************************************************************************/
#else
/****************************************************************************/
typedef void (*func_ptr)(void);
/****************************************************************************/
STATIC VOID
_do_ctors(void)
{
extern func_ptr __CTOR_LIST__[];
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
ULONG i;
for(i = nptrs ; i > 0 ; i--)
__CTOR_LIST__[i]();
}
/****************************************************************************/
STATIC VOID
_do_dtors(void)
{
extern func_ptr __DTOR_LIST__[];
extern jmp_buf __exit_jmp_buf;
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
static ULONG i;
int num_dtors,j;
static int i;
/* If one of the destructors drops into
* exit(), processing will continue with
* the next following destructor.
*/
exit(), processing will continue with
the next following destructor. */
(void)setjmp(__exit_jmp_buf);
while(i++ < nptrs)
for(i = j, num_dtors = 0 ; __DTOR_LIST__[j] != NULL ; j++)
num_dtors++;
while(i++ < num_dtors)
__DTOR_LIST__[i]();
}
/****************************************************************************/
#endif /*__amigaos4__ */
/****************************************************************************/
/* FIXME: Do we need to put these in .init/.fini sections? */
//void _init(void) __attribute__((section(".init")));
//void _fini(void) __attribute__((section(".fini")));
/****************************************************************************/
void
_init(void)
{
_do_ctors();
}
/****************************************************************************/
void
_fini(void)
{
_do_dtors();
}