Message ID | 87eggdu1z4.fsf@e105548-lin.cambridge.arm.com |
---|---|
State | New |
Headers | show |
On 10/29/2015 04:30 PM, Richard Sandiford wrote: > 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. > gcc/ > * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a > SCALAR_FLOAT_MODE_P. I'm assuming that the code you mention has already been fixed so that we don't trigger the abort. Ok. Bernd
On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt <bschmidt@redhat.com> wrote: >On 10/29/2015 04:30 PM, Richard Sandiford wrote: >> 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. > >> gcc/ >> * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a >> SCALAR_FLOAT_MODE_P. > >I'm assuming that the code you mention has already been fixed so that >we >don't trigger the abort. Ok. Rather than the weird macro can't we turn real_mode_format to an inline function? Richard. > >Bernd
Richard Biener <richard.guenther@gmail.com> writes: > On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt > <bschmidt@redhat.com> wrote: >>On 10/29/2015 04:30 PM, Richard Sandiford wrote: >>> 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. >> >>> gcc/ >>> * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a >>> SCALAR_FLOAT_MODE_P. >> >>I'm assuming that the code you mention has already been fixed so that >>we >>don't trigger the abort. Ok. > > Rather than the weird macro can't we turn real_mode_format to an inline > function? It needs to be an lvalue for things like: REAL_MODE_FORMAT (TFmode) = &ibm_extended_format; I suppose we could return a non-const reference, but I'd rather stay clear of returning those :-) Thanks, Richard
On Thu, Oct 29, 2015 at 5:32 PM, Richard Sandiford <richard.sandiford@arm.com> wrote: > Richard Biener <richard.guenther@gmail.com> writes: >> On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt >> <bschmidt@redhat.com> wrote: >>>On 10/29/2015 04:30 PM, Richard Sandiford wrote: >>>> 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. >>> >>>> gcc/ >>>> * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a >>>> SCALAR_FLOAT_MODE_P. >>> >>>I'm assuming that the code you mention has already been fixed so that >>>we >>>don't trigger the abort. Ok. >> >> Rather than the weird macro can't we turn real_mode_format to an inline >> function? > > It needs to be an lvalue for things like: > > REAL_MODE_FORMAT (TFmode) = &ibm_extended_format; > > I suppose we could return a non-const reference, but I'd rather stay > clear of returning those :-) Yes please. But SET_REAL_MODE_FORMAT (TFmode, &ibm_extended_format) would work as well. Richard. > Thanks, > Richard >
diff --git a/gcc/real.h b/gcc/real.h index e65b526..d3b14e5 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -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) \