On Tue, 3 Apr 2012, Eric Botcazou wrote:

> > For the case in question offset is (D.2640_7 + -1) * 20 + 16.  I wonder
> > why DECL_FIELD_OFFSET of the outermost COMPONENT_REF is not added
> > to bitpos by get_inner_reference (that is what get_bit_range assumes ...).
> 
> DECL_FIELD_OFFSET is added to offset and DECL_FIELD_BIT_OFFSET to bitpos.
> 
> > So, how would you make sure this works?  Match the fact that
> > get_inner_reference does _not_ add DECL_FIELD_OFFSET to bitpos,
> > and, if DECL_FIELD_OFFSET is an INTEGER_CST simply subtract that
> > from offset and add it to bitpos?  I suppose that would work.
> 
> Yes, but the amount is simply the negative bitstart (which is a multiple of 
> BITS_PER_UNIT).  This is the same kind of adjustment now done at the end of 
> get_inner_reference to avoid negative bit positions there too.
> 
> > Though doing that in get_inner_reference for DECL_BIT_FIELD_TYPE
> > fields may make sense as well.
> 
> That would be more complicated, as we would need to split the offset into
> variable and fixed part.
> 
> 
> Tentative patch attached, regtested for Ada on x86 and x86-64.  I'll do a 
> full 
> testing cycle if it is approved.

Yes, the patch is ok.

Thanks,
Richard.

> 
>       * expr.c (get_bit_range): Add OFFSET parameter and adjust BITPOS.
>       Change type of BITOFFSET to signed.  Make sure the lower bound of
>       the computed range is non-negative by adjusting OFFSET and BITPOS.
>       (expand_assignment): Adjust call to get_bit_range.

Reply via email to