diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 96199bd..93cbc71 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -451,7 +451,7 @@ gnat_init_gcc_fp (void) /* Assume that FP operations can trap if S'Machine_Overflow is true, but don't override the user if not. */ if (Machine_Overflows_On_Target) - flag_trapping_math = 1; + flag_trapping_math = TRAPPING_MATH_DEFAULT; else if (!global_options_set.x_flag_trapping_math) flag_trapping_math = 0; } diff --git a/gcc/common.opt b/gcc/common.opt index b921f5e..314f9a7 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2750,7 +2750,7 @@ generate them instead of using descriptors. ; (user-visible) trap. This is the case, for example, in nonstop ; IEEE 754 arithmetic. ftrapping-math -Common Var(flag_trapping_math) Init(1) Optimization SetByCombined +Common Var(flag_trapping_math) Init(TRAPPING_MATH_DEFAULT) Optimization SetByCombined UInteger Assume floating-point operations can trap. ftrapv diff --git a/gcc/flag-types.h b/gcc/flag-types.h index 5bd1f77..98b9ff0 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -481,6 +481,33 @@ enum openacc_privatization OPENACC_PRIVATIZATION_NOISY }; +/* Trapping math exception classes. */ +enum trapping_math_model +{ + TRAPPING_MATH_NONE = 0, + TRAPPING_MATH_QNANOP = 1UL << 0, + TRAPPING_MATH_SNANOP = 1UL << 1, + TRAPPING_MATH_QNANCMP = 1UL << 2, + TRAPPING_MATH_SNANCMP = 1UL << 3, + TRAPPING_MATH_INTCONV = 1UL << 4, + TRAPPING_MATH_SQRTNEG = 1UL << 5, + TRAPPING_MATH_LIBMFUN = 1UL << 6, + TRAPPING_MATH_FDIVZERO = 1UL << 7, + TRAPPING_MATH_IDIVZERO = 1UL << 8, + TRAPPING_MATH_FPDENORM = 1UL << 9, + TRAPPING_MATH_OVERFLOW = 1UL << 10, + TRAPPING_MATH_UNDERFLOW = 1UL << 11, + TRAPPING_MATH_INFDIVINF = 1UL << 12, + TRAPPING_MATH_INFSUBINF = 1UL << 13, + TRAPPING_MATH_INFMULZERO = 1UL << 14, + TRAPPING_MATH_ZERODIVZERO = 1UL << 15, + + TRAPPING_MATH_DEFAULT = (1UL << 16) - 1, + + TRAPPING_MATH_INEXACT = 1UL << 16, + TRAPPING_MATH_TRAPV = 1UL << 17 +}; + #endif #endif /* ! GCC_FLAG_TYPES_H */ diff --git a/gcc/toplev.c b/gcc/toplev.c index 14d1335..6cd71cc 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1664,7 +1664,7 @@ process_options (void) /* The presence of IEEE signaling NaNs, implies all math can trap. */ if (flag_signaling_nans) - flag_trapping_math = 1; + flag_trapping_math = TRAPPING_MATH_DEFAULT; /* We cannot reassociate if we want traps or signed zeros. */ if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))