This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [ping] Fix PR debug/66728
- From: Richard Sandiford <richard dot sandiford at arm dot com>
- To: Mike Stump <mikestump at comcast dot net>
- Cc: Bernd Schmidt <bschmidt at redhat dot com>, Ulrich Weigand <uweigand at de dot ibm dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 02 Nov 2015 20:55:14 +0000
- Subject: Re: [ping] Fix PR debug/66728
- Authentication-results: sourceware.org; auth=none
- References: <20151028115839 dot 1E7C85C3D at oc7340732750 dot ibm dot com> <87ziz3ta4t dot fsf at e105548-lin dot cambridge dot arm dot com> <5630D8AE dot 1090608 at redhat dot com> <87h9l4v2pi dot fsf at e105548-lin dot cambridge dot arm dot com> <87611kuzz4 dot fsf at e105548-lin dot cambridge dot arm dot com> <D9850ADD-F2B9-4B3E-8DD9-DF8FEB2E9C36 at comcast dot net>
Mike Stump <mikestump@comcast.net> writes:
> On Nov 2, 2015, at 8:29 AM, Richard Sandiford <richard.sandiford@arm.com> wrote:
>> switch (GET_CODE (rtl))
>> {
>> case CONST_INT:
>> - {
>> - HOST_WIDE_INT val = INTVAL (rtl);
>> + if (mode != BLKmode)
>
> This changes BLKmode for CONST_INT, but I didnât see this discussed. I
> didnât see a test case? Iâd like to think that BLKmode things here
> would be fine. I think they would be use for 1024 bit things that are
> representable in 20 bits, for example.
This was:
... Sometimes structure decls
have BLKmode but are assigned an integer-mode rtl (e.g. when passing
3-byte structures by value to functions).
[...]
loc_descriptor refuses to use CONST_INT for BLKmode decls (which aren't
actually integers at the source level). That seems like the right
behaviour, so this patch does that for add_const_value_attribute too.
It asserts that the mode is otherwise sensible for both CONST_INT
and CONST_WIDE_INT. Asserting for CONST_INT isn't strictly necessary
but means that the assumption will get much more coverage than asserting
only for CONST_WIDE_INT does.
Integer types always have an integer mode, not BLKmode. E.g.
layout_type has:
case BOOLEAN_TYPE:
case INTEGER_TYPE:
case ENUMERAL_TYPE:
SET_TYPE_MODE (type,
smallest_mode_for_size (TYPE_PRECISION (type), MODE_INT));
where the smallest_mode_for_size is guaranteed to return something
that isn't BLKmode (or VOIDmode).
The BLKmodes are for non-integer things that nevertheless get passed
as integers. I don't think debuggers would be expecting an integer
DIE to be used for them. (loc_descriptor already punts in that case.)
> A value that is 1 (representable
> in 20 bits) can be trivially communicated the debugger. The existing
> add_AT_unsigned I think can represent them, no? Similarly for wide-int
> BLKmode support. I think the real problem is simply the precision 0
> part. In the CONST_INT and CONST_DOUBLE there is no code that handled
> precision 0, and there is no code in the wide-int case either. From
> wide-int.h:
>
> The precision and length of a wide_int are always greater than 0.
>
> If is was 0, then we have failed. When that bug is fixed, then the
> precision wonât be 0 and the existing code will work. Where is the 0
> first generated, and from what?
It's generated from:
case CONST_WIDE_INT:
add_AT_wide (die, DW_AT_const_value,
std::make_pair (rtl, GET_MODE (rtl)));
return true;
where the precision is evaluated as:
inline unsigned int
wi::int_traits <rtx_mode_t>::get_precision (const rtx_mode_t &x)
{
return GET_MODE_PRECISION (x.second);
}
GET_MODE (rtl) is always VOIDmode and the precision of VOIDmode is 0,
so the precision of the wide_int passed to add_AT_wide is always 0.
Like CONST_INT, the "real" mode of a CONST_WIDE_INT is determined by
context rather than being stored in the rtx itself. The point of the
patch is to use that mode instead of VOIDmode in the make_pair.
Thanks,
Richard