On December 19, 2016 11:25:49 PM GMT+01:00, Jeff Law <l...@redhat.com> wrote:
>On 12/14/2016 03:44 AM, Richard Biener wrote:
>>
>> The following implements Jasons suggestion of using a langhook to
>> return the size of an aggregate without tail padding that might
>> be re-used when it is inherited from.
>>
>> Using this langhook we can fix the size of the representative for the
>> bitfield properly and thus generate correct code for the testcase.
>> Previously on x86_64 it was
>>
>> main:
>>         movl    c+4(%rip), %eax
>>         andl    $-258049, %eax
>>         orb     $16, %ah
>>         movl    %eax, c+4(%rip)
>>         movb    $2, c+7(%rip)
>>         xorl    %eax, %eax
>>         ret
>>
>> while after the patch we see
>>
>> main:
>>         movzbl  c+5(%rip), %eax
>>         andb    $-4, c+6(%rip)
>>         movb    $2, c+7(%rip)
>>         andl    $15, %eax
>>         orl     $16, %eax
>>         movb    %al, c+5(%rip)
>>         xorl    %eax, %eax
>>         ret
>>
>> in particular the store to C::B::d is now properly using a byte
>store.
>>
>> Bootstrap and regtest in progress on x86_64-unknown-linux-gnu, ok for
>> trunk?
>>
>> Thanks,
>> Richard.
>>
>> 2016-12-14  Richard Biener  <rguent...@suse.de>
>>
>>      PR c++/71694
>>      * langhooks-def.h (lhd_unit_size_without_reusable_padding): Declare.
>>      (LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING): Define.
>>      (LANG_HOOKS_FOR_TYPES_INITIALIZER): Adjust.
>>      * langhooks.h (struct lang_hooks_for_types): Add
>>      unit_size_without_reusable_padding.
>>      * langhooks.c (lhd_unit_size_without_reusable_padding): New.
>>      * stor-layout.c (finish_bitfield_representative): Use
>>      unit_size_without_reusable_padding langhook to decide on the
>>      last representatives size.
>>
>>      cp/
>>      * cp-objcp-common.h (cp_unit_size_without_reusable_padding):
>Declare.
>>      (LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING): Define.
>>      * cp-objcp-common.c (cp_unit_size_without_reusable_padding): New.
>>
>>      * g++.dg/pr71694.C: New testcase.
>>
>> Index: gcc/stor-layout.c
>> ===================================================================
>> *** gcc/stor-layout.c        (revision 243632)
>> --- gcc/stor-layout.c        (working copy)
>> *************** finish_bitfield_representative (tree rep
>> *** 1864,1876 ****
>>       }
>>     else
>>       {
>> !       /* ???  If you consider that tail-padding of this struct
>might be
>> !          re-used when deriving from it we cannot really do the
>following
>> !     and thus need to set maxsize to bitsize?  Also we cannot
>> !     generally rely on maxsize to fold to an integer constant, so
>> !     use bitsize as fallback for this case.  */
>> !       tree maxsize = size_diffop (TYPE_SIZE_UNIT (DECL_CONTEXT
>(field)),
>> !                              DECL_FIELD_OFFSET (repr));
>>         if (tree_fits_uhwi_p (maxsize))
>>      maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT
>>                    - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
>> --- 1864,1877 ----
>>       }
>>     else
>>       {
>> !       /* Note that if the C++ FE sets up tail-padding to be re-used
>it
>> !          creates a as-base variant of the type with TYPE_SIZE
>adjusted
>> !     accordingly.  So it is safe to include tail-padding here.  */
>> !       tree aggsize =
>lang_hooks.types.unit_size_without_reusable_padding
>> !                                                    (DECL_CONTEXT (field));
>> !       tree maxsize = size_diffop (aggsize, DECL_FIELD_OFFSET
>(repr));
>> !       /* We cannot generally rely on maxsize to fold to an integer
>constant,
>> !     so use bitsize as fallback for this case.  */
>>         if (tree_fits_uhwi_p (maxsize))
>>      maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT
>>                    - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
>Looks reasonable, formatting nit in the comment above the assignment to
>
>AGGSIZE (looks like it was mucked up in the old version too).  I think 
>the second line is using spaces when it should have used a tab.
>
>Do we document langhooks anywhere?

Didn't find anything.  Applied already after Jason's OK.

Richard.

>Jeff


Reply via email to