On Fri, Jul 20, 2018 at 1:57 PM, Martin Sebor wrote:
> On 07/19/2018 04:31 PM, Jeff Law wrote:
>>
>> On 06/24/2018 03:05 PM, Martin Sebor wrote:
>>>
>>> Storing integer command line option arguments in type int
>>> limits options such as -Wlarger-than= or -Walloca-larger-than
>>> to at most INT_MAX (see bug 71905). Larger values wrap around
>>> zero. The value zero is considered to disable the option,
>>> making it impossible to specify a zero limit.
>>>
>>> To get around these limitations, the -Walloc-size-larger-than=
>>> option accepts a string argument that it then parses itself
>>> and interprets as HOST_WIDE_INT. The option also accepts byte
>>> size suffixes like KB, MB, GiB, etc. to make it convenient to
>>> specify very large limits.
>>>
>>> The int limitation is obviously less than ideal in a 64-bit
>>> world. The treatment of zero as a toggle is just a minor wart.
>>> The special treatment to make it work for just a single option
>>> makes option handling inconsistent. It should be possible for
>>> any option that takes an integer argument to use the same logic.
>>>
>>> The attached patch enhances GCC option processing to do that.
>>> It changes the storage type of option arguments from int to
>>> HOST_WIDE_INT and extends the existing (although undocumented)
>>> option property Host_Wide_Int to specify wide option arguments.
>>> It also introduces the ByteSize property for options for which
>>> specifying the byte-size suffix makes sense.
>>>
>>> To make it possible to consider zero as a meaningful argument
>>> value rather than a flag indicating that an option is disabled
>>> the patch also adds a CLVC_SIZE enumerator to the cl_var_type
>>> enumeration, and modifies how options of the kind are handled.
>>>
>>> Warning options that take large byte-size arguments can be
>>> disabled by specifying a value equal to or greater than
>>> HOST_WIDE_INT_M1U. For convenience, aliases in the form of
>>> -Wno-xxx-larger-than have been provided for all the affected
>>> options.
>>>
>>> In the patch all the existing -larger-than options are set
>>> to PTRDIFF_MAX. This makes them effectively enabled, but
>>> because the setting is exceedingly permissive, and because
>>> some of the existing warnings are already set to the same
>>> value and some other checks detect and reject such exceedingly
>>> large values with errors, this change shouldn't noticeably
>>> affect what constructs are diagnosed.
>>>
>>> Although all the options are set to PTRDIFF_MAX, I think it
>>> would make sense to consider setting some of them lower, say
>>> to PTRDIFF_MAX / 2. I'd like to propose that in a followup
>>> patch.
>>>
>>> To minimize observable changes the -Walloca-larger-than and
>>> -Wvla-larger-than warnings required more extensive work to
>>> make of the new mechanism because of the "unbounded" argument
>>> handling (the warnings trigger for arguments that are not
>>> visibly constrained), and because of the zero handling
>>> (the warnings also trigger
>>>
>>>
>>> Martin
>>>
>>>
>>> gcc-82063.diff
>>>
>>>
>>> PR middle-end/82063 - issues with arguments enabled by -Wall
>>>
>>> gcc/ada/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * gcc-interface/misc.c (gnat_handle_option): Change function
>>> argument
>>> to HOST_WIDE_INT.
>>>
>>> gcc/brig/ChangeLog:
>>> * brig/brig-lang.c (brig_langhook_handle_option): Change function
>>> argument to HOST_WIDE_INT.
>>>
>>> gcc/c-family/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * c-common.h (c_common_handle_option): Change function argument
>>> to HOST_WIDE_INT.
>>> * c-opts.c (c_common_init_options): Same.
>>> (c_common_handle_option): Same. Remove special handling of
>>> OPT_Walloca_larger_than_ and OPT_Wvla_larger_than_.
>>> * c.opt (-Walloc-size-larger-than, -Walloca-larger-than): Change
>>> options to take a HOST_WIDE_INT argument and accept a byte-size
>>> suffix. Initialize.
>>> (-Wvla-larger-than): Same.
>>> (-Wno-alloc-size-larger-than, -Wno-alloca-larger-than): New.
>>> (-Wno-vla-larger-than): Same.
>>>
>>>
>>> gcc/fortran/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * gfortran.h (gfc_handle_option): Change function argument
>>> to HOST_WIDE_INT.
>>> * options.c (gfc_handle_option): Same.
>>>
>>> gcc/go/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * go-lang.c (go_langhook_handle_option): Change function argument
>>> to HOST_WIDE_INT.
>>>
>>> gcc/lto/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * lto-lang.c (lto_handle_option): Change function argument
>>> to HOST_WIDE_INT.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>> PR middle-end/82063
>>> * gcc.dg/Walloc-size-larger-than-16.c: Adjust.
>>> * gcc.dg/Walloca-larger-than.c: New test.
>>> * gcc.dg/Wframe-larger-than-2.c: New test.
>>> * gcc.dg/Wlarger-than3.c: New test.
>>>