diff options
author | Anthony Green <green@moxielogic.com> | 2003-06-06 16:07:57 +0000 |
---|---|---|
committer | Anthony Green <green@moxielogic.com> | 2003-06-06 16:07:57 +0000 |
commit | 045e4d2e0829b6c07ef10171bf5d00ab85cbb497 (patch) | |
tree | 36b49868598b46c77d7edeb97df54c291c5f881e /libgloss/iq2000/_exit.c | |
parent | 75d7d177004358ba5e410a2cd98f2249b6c4e1b3 (diff) | |
download | cygnal-045e4d2e0829b6c07ef10171bf5d00ab85cbb497.tar.gz cygnal-045e4d2e0829b6c07ef10171bf5d00ab85cbb497.tar.bz2 cygnal-045e4d2e0829b6c07ef10171bf5d00ab85cbb497.zip |
iq2000 port.
Diffstat (limited to 'libgloss/iq2000/_exit.c')
-rw-r--r-- | libgloss/iq2000/_exit.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libgloss/iq2000/_exit.c b/libgloss/iq2000/_exit.c new file mode 100644 index 000000000..318984b8b --- /dev/null +++ b/libgloss/iq2000/_exit.c @@ -0,0 +1,35 @@ +#include <_ansi.h> +#include <sys/types.h> +#include <sys/stat.h> +#include "trap.h" + + +static void _do_dtors() +{ + /* The loop variable is static so that if a destructor calls exit, + and we return here, we simply continue with the next destructor. */ + typedef void (*pfunc) (); + extern pfunc __dtors[]; + extern pfunc __dtors_end[]; + static pfunc *p = __dtors; + + while (p < __dtors_end) + (*p++) (); +} + + +void _exit (n) +{ + extern unsigned char __eh_frame_begin[]; + extern void __deregister_frame_info (void *); + + /* Destructors should be done earlier because they need to be done before the + files are closed, but here is better than nowhere (and this balances the + constructors done in crt1.c. */ + _do_dtors(); + + /* Deregister any eh frames. */ + __deregister_frame_info (__eh_frame_begin); + + TRAP0 (SYS_exit, n, 0, 0); +} |