Mike Stump <mikest...@comcast.net> writes: > On Nov 2, 2015, at 8:29 AM, Richard Sandiford <richard.sandif...@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