Robustify REAL_MODE_FORMAT
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 30 Oct 2015 13:42:27 +0000 (13:42 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 30 Oct 2015 13:42:27 +0000 (13:42 +0000)
Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid mode,
rather than stepping beyond the bounds of an array.  It turned out that
some code was passing non-float modes to the real.h routines.

Tested on x86_64-linux-gnu, arm-linux-gnueabi and aarch64-linux-gnu.

gcc/
* real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
SCALAR_FLOAT_MODE_P.

From-SVN: r229579

gcc/ChangeLog
gcc/real.h

index 7178c5aeec33ea7df6822ebc8b4759754a30a7c2..26f9a3752572742739229258a59210e8da7305ee 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-30  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
+       SCALAR_FLOAT_MODE_P.
+
 2015-10-30  Alan Lawrence  <alan.lawrence@arm.com>
 
        * tree-sra.c (scalarizable_type_p): Comment variable-length arrays.
index e65b5263e11add52d08ddfd936abf1e3a459d698..d3b14e5b4f85e7c1a57fbbb67d01023b21a1c454 100644 (file)
@@ -167,7 +167,9 @@ extern const struct real_format *
   (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE)                    \
                        ? (((MODE) - MIN_MODE_DECIMAL_FLOAT)            \
                           + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1))     \
-                       : ((MODE) - MIN_MODE_FLOAT)])
+                       : GET_MODE_CLASS (MODE) == MODE_FLOAT           \
+                       ? ((MODE) - MIN_MODE_FLOAT)                     \
+                       : (gcc_unreachable (), 0)])
 
 #define FLOAT_MODE_FORMAT(MODE) \
   (REAL_MODE_FORMAT (SCALAR_FLOAT_MODE_P (MODE)? (MODE) \