diff options
Diffstat (limited to 'newlib/libc/stdlib')
-rw-r--r-- | newlib/libc/stdlib/__atexit.c | 9 | ||||
-rw-r--r-- | newlib/libc/stdlib/__call_atexit.c | 4 | ||||
-rw-r--r-- | newlib/libc/stdlib/cxa_atexit.c | 3 | ||||
-rw-r--r-- | newlib/libc/stdlib/cxa_finalize.c | 4 |
4 files changed, 19 insertions, 1 deletions
diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c index 0c843ade6..310b69174 100644 --- a/newlib/libc/stdlib/__atexit.c +++ b/newlib/libc/stdlib/__atexit.c @@ -8,6 +8,7 @@ #include <sys/lock.h> #include "atexit.h" + /* * Register a function to be performed at exit or on shared library unload. */ @@ -47,8 +48,10 @@ _DEFUN (__register_exitproc, _GLOBAL_REENT->_atexit = p; #ifndef _REENT_SMALL p->_on_exit_args._fntypes = 0; +#ifdef __REENT_HAS_CXA_SUPPORT p->_on_exit_args._is_cxa = 0; #endif +#endif } if (type != __et_atexit) @@ -67,16 +70,20 @@ _DEFUN (__register_exitproc, } args->_fntypes = 0; args->_is_cxa = 0; +#ifdef __REENT_HAS_CXA_SUPPORT p->_on_exit_args_ptr = args; +#endif } #else args = &p->_on_exit_args; #endif args->_fnargs[p->_ind] = arg; - args->_dso_handle[p->_ind] = d; args->_fntypes |= (1 << p->_ind); +#ifdef __REENT_HAS_CXA_SUPPORT + args->_dso_handle[p->_ind] = d; if (type == __et_cxa) args->_is_cxa |= (1 << p->_ind); +#endif } p->_fns[p->_ind++] = fn; #ifndef __SINGLE_THREAD__ diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c index cea569ff4..8e91770c2 100644 --- a/newlib/libc/stdlib/__call_atexit.c +++ b/newlib/libc/stdlib/__call_atexit.c @@ -36,9 +36,11 @@ _DEFUN (__call_exitprocs, (code, d), { i = 1 << n; +#ifdef __REENT_HAS_CXA_SUPPORT /* Skip functions not from this dso. */ if (d && (!args || args->_dso_handle[n] != d)) continue; +#endif /* Remove the function now to protect against the function calling exit recursively. */ @@ -55,8 +57,10 @@ _DEFUN (__call_exitprocs, (code, d), /* Call the function. */ if (!args || (args->_fntypes & i) == 0) fn (); +#ifdef __REENT_HAS_CXA_SUPPORT else if ((args->_is_cxa & i) == 0) (*((void (*)(int, _PTR)) fn))(code, args->_fnargs[n]); +#endif else (*((void (*)(_PTR)) fn))(args->_fnargs[n]); } diff --git a/newlib/libc/stdlib/cxa_atexit.c b/newlib/libc/stdlib/cxa_atexit.c index 8c39236de..9b73372d6 100644 --- a/newlib/libc/stdlib/cxa_atexit.c +++ b/newlib/libc/stdlib/cxa_atexit.c @@ -8,6 +8,7 @@ #include <sys/lock.h> #include "atexit.h" +#ifdef __REENT_HAS_CXA_SUPPORT /* * Register a function to be performed at exit or DSO unload. */ @@ -21,3 +22,5 @@ _DEFUN (__cxa_atexit, { return __register_exitproc (__et_cxa, (void (*)(void)) fn, arg, d); } + +#endif /* __REENT_HAS_CXA_SUPPORT */ diff --git a/newlib/libc/stdlib/cxa_finalize.c b/newlib/libc/stdlib/cxa_finalize.c index 17d0526a7..9bdbed7af 100644 --- a/newlib/libc/stdlib/cxa_finalize.c +++ b/newlib/libc/stdlib/cxa_finalize.c @@ -7,6 +7,8 @@ #include <reent.h> #include "atexit.h" +#ifdef __REENT_HAS_CXA_SUPPORT + /* * Call registered exit handlers. If D is null then all handlers are called, * otherwise only the handlers from that DSO are called. @@ -18,3 +20,5 @@ _DEFUN (__cxa_finalize, (d), { __call_exitprocs (0, d); } + +#endif /* __REENT_HAS_CXA_SUPPORT */ |