diff options
Diffstat (limited to 'libc/sysdeps/powerpc/nofpu/sim-full.c')
-rw-r--r-- | libc/sysdeps/powerpc/nofpu/sim-full.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/libc/sysdeps/powerpc/nofpu/sim-full.c b/libc/sysdeps/powerpc/nofpu/sim-full.c index e16703323..59e79c910 100644 --- a/libc/sysdeps/powerpc/nofpu/sim-full.c +++ b/libc/sysdeps/powerpc/nofpu/sim-full.c @@ -1,5 +1,5 @@ /* Software floating-point exception handling emulation. - Copyright (C) 2002-2013 Free Software Foundation, Inc. + Copyright (C) 2002-2014 Free Software Foundation, Inc. Contributed by Aldy Hernandez <aldyh@redhat.com>, 2002. This file is part of the GNU C Library. @@ -21,26 +21,37 @@ #include "soft-fp.h" #include "soft-supp.h" -/* FIXME: these variables should be thread specific (see bugzilla bug - 15483) and ideally preserved across signal handlers, like hardware - FP status words, but the latter is quite difficult to accomplish in - userland. */ - -/* Global to store sticky exceptions. */ -int __sim_exceptions __attribute__ ((nocommon)); -libc_hidden_data_def (__sim_exceptions); +/* Thread-local to store sticky exceptions. */ +__thread int __sim_exceptions_thread __attribute__ ((nocommon)); +libc_hidden_data_def (__sim_exceptions_thread); /* By default, no exceptions should trap. */ -int __sim_disabled_exceptions = 0xffffffff; -libc_hidden_data_def (__sim_disabled_exceptions); +__thread int __sim_disabled_exceptions_thread = 0xffffffff; +libc_hidden_data_def (__sim_disabled_exceptions_thread); + +__thread int __sim_round_mode_thread __attribute__ ((nocommon)); +libc_hidden_data_def (__sim_round_mode_thread); + +#if SIM_GLOBAL_COMPAT +int __sim_exceptions_global __attribute__ ((nocommon)); +libc_hidden_data_def (__sim_exceptions_global); +SIM_COMPAT_SYMBOL (__sim_exceptions_global, __sim_exceptions); + +int __sim_disabled_exceptions_global = 0xffffffff; +libc_hidden_data_def (__sim_disabled_exceptions_global); +SIM_COMPAT_SYMBOL (__sim_disabled_exceptions_global, + __sim_disabled_exceptions); -int __sim_round_mode __attribute__ ((nocommon)); -libc_hidden_data_def (__sim_round_mode); +int __sim_round_mode_global __attribute__ ((nocommon)); +libc_hidden_data_def (__sim_round_mode_global); +SIM_COMPAT_SYMBOL (__sim_round_mode_global, __sim_round_mode); +#endif void __simulate_exceptions (int x) { - __sim_exceptions |= x; - if (x & ~__sim_disabled_exceptions) + __sim_exceptions_thread |= x; + SIM_SET_GLOBAL (__sim_exceptions_global, __sim_exceptions_thread); + if (x & ~__sim_disabled_exceptions_thread) raise (SIGFPE); } |