From a709346f066f6cfdb34c4fe70fa4b3bf81487bb9 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Mon, 7 Jul 2014 07:47:41 +0000 Subject: [PATCH] fpu-387.h, [...]: Use static assertions. * config/fpu-387.h, config/fpu-aix.h, config/fpu-sysv.h, config/fpu-glibc.h: Use static assertions. From-SVN: r212323 --- libgfortran/ChangeLog | 5 +++++ libgfortran/config/fpu-387.h | 13 +++++-------- libgfortran/config/fpu-aix.h | 11 +++++------ libgfortran/config/fpu-glibc.h | 13 +++++-------- libgfortran/config/fpu-sysv.h | 13 +++++-------- 5 files changed, 25 insertions(+), 30 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9f03a5ce368..03f6f2ac60a 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2014-07-07 Francois-Xavier Coudert + + * config/fpu-387.h, config/fpu-aix.h, config/fpu-sysv.h, + config/fpu-glibc.h: Use static assertions. + 2014-07-05 Rainer Orth * configure, config.h.in: Regenerate. diff --git a/libgfortran/config/fpu-387.h b/libgfortran/config/fpu-387.h index 66e2dbeecea..2c5a5fcc6fa 100644 --- a/libgfortran/config/fpu-387.h +++ b/libgfortran/config/fpu-387.h @@ -23,8 +23,6 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ -#include - #ifndef __SSE_MATH__ #include "cpuid.h" #endif @@ -85,6 +83,11 @@ typedef struct my_fenv_t; +/* Check we can actually store the FPU state in the allocated size. */ +_Static_assert (sizeof(my_fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE, + "GFC_FPE_STATE_BUFFER_SIZE is too small"); + + /* Raise the supported floating-point exceptions from EXCEPTS. Other bits in EXCEPTS are ignored. Code originally borrowed from libatomic/config/x86/fenv.c. */ @@ -429,9 +432,6 @@ get_fpu_state (void *state) { my_fenv_t *envp = state; - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(my_fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE); - __asm__ __volatile__ ("fnstenv\t%0" : "=m" (*envp)); /* fnstenv has the side effect of masking all exceptions, so we need @@ -447,9 +447,6 @@ set_fpu_state (void *state) { my_fenv_t *envp = state; - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(my_fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE); - /* glibc sources (sysdeps/x86_64/fpu/fesetenv.c) do something more complex than this, but I think it suffices in our case. */ __asm__ __volatile__ ("fldenv\t%0" : : "m" (*envp)); diff --git a/libgfortran/config/fpu-aix.h b/libgfortran/config/fpu-aix.h index c1079fcc1a3..c2970452bc1 100644 --- a/libgfortran/config/fpu-aix.h +++ b/libgfortran/config/fpu-aix.h @@ -38,6 +38,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif +/* Check we can actually store the FPU state in the allocated size. */ +_Static_assert (sizeof(fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE, + "GFC_FPE_STATE_BUFFER_SIZE is too small"); + + void set_fpu_trap_exceptions (int trap, int notrap) { @@ -403,18 +408,12 @@ support_fpu_rounding_mode (int mode) void get_fpu_state (void *state) { - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fenv_t) <= GFC_FPE_STATE_BUFFER_SIZE); - fegetenv (state); } void set_fpu_state (void *state) { - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fenv_t) <= GFC_FPE_STATE_BUFFER_SIZE); - fesetenv (state); } diff --git a/libgfortran/config/fpu-glibc.h b/libgfortran/config/fpu-glibc.h index d7c9d86da43..b6ea1203a62 100644 --- a/libgfortran/config/fpu-glibc.h +++ b/libgfortran/config/fpu-glibc.h @@ -27,13 +27,16 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see feenableexcept function in fenv.h to set individual exceptions (there's nothing to do that in C99). */ -#include - #ifdef HAVE_FENV_H #include #endif +/* Check we can actually store the FPU state in the allocated size. */ +_Static_assert (sizeof(fenv_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE, + "GFC_FPE_STATE_BUFFER_SIZE is too small"); + + void set_fpu_trap_exceptions (int trap, int notrap) { #ifdef FE_INVALID @@ -416,9 +419,6 @@ support_fpu_rounding_mode (int mode) void get_fpu_state (void *state) { - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fenv_t) <= GFC_FPE_STATE_BUFFER_SIZE); - fegetenv (state); } @@ -426,9 +426,6 @@ get_fpu_state (void *state) void set_fpu_state (void *state) { - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fenv_t) <= GFC_FPE_STATE_BUFFER_SIZE); - fesetenv (state); } diff --git a/libgfortran/config/fpu-sysv.h b/libgfortran/config/fpu-sysv.h index 8d8ff329f1f..97eed2833c6 100644 --- a/libgfortran/config/fpu-sysv.h +++ b/libgfortran/config/fpu-sysv.h @@ -25,8 +25,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* FPU-related code for SysV platforms with fpsetmask(). */ -#include - /* BSD and Solaris systems have slightly different types and functions naming. We deal with these here, to simplify the code below. */ @@ -444,14 +442,16 @@ typedef struct } fpu_state_t; +/* Check we can actually store the FPU state in the allocated size. */ +_Static_assert (sizeof(fpu_state_t) <= (size_t) GFC_FPE_STATE_BUFFER_SIZE, + "GFC_FPE_STATE_BUFFER_SIZE is too small"); + + void get_fpu_state (void *s) { fpu_state_t *state = s; - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fpu_state_t) <= GFC_FPE_STATE_BUFFER_SIZE); - state->mask = fpgetmask (); state->sticky = fpgetsticky (); state->round = fpgetround (); @@ -462,9 +462,6 @@ set_fpu_state (void *s) { fpu_state_t *state = s; - /* Check we can actually store the FPU state in the allocated size. */ - assert (sizeof(fpu_state_t) <= GFC_FPE_STATE_BUFFER_SIZE); - fpsetmask (state->mask); FPSETSTICKY (state->sticky); fpsetround (state->round);