summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdlib')
-rw-r--r--newlib/libc/stdlib/__atexit.c9
-rw-r--r--newlib/libc/stdlib/__call_atexit.c4
-rw-r--r--newlib/libc/stdlib/cxa_atexit.c3
-rw-r--r--newlib/libc/stdlib/cxa_finalize.c4
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 */