public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: Sergio Durigan Junior <sergiodj@redhat.com>,
	Simon Marchi <simon.marchi@polymtl.ca>
Cc: Simon Marchi <simon.marchi@ericsson.com>,
	GDB Patches <gdb-patches@sourceware.org>,
	Tom Tromey <tom@tromey.com>, Eli Zaretskii <eliz@gnu.org>
Subject: Re: [PATCH v3 2/2] Implement pahole-like 'ptype /o' option
Date: Tue, 12 Dec 2017 18:14:00 -0000	[thread overview]
Message-ID: <d15b3ba6-9a33-32b4-7541-51232279ed0b@redhat.com> (raw)
In-Reply-To: <87indczcw9.fsf@redhat.com>

On 12/12/2017 06:19 AM, Sergio Durigan Junior wrote:

> BTW, a little status update.
> 
> Apparently the patch can't handle bitfields very well.  I've found a few
> cases where the bitfield handling gets confused, printing wrong
> offsets/sizes/holes.  Bitfields can be extremely complex to deal with
> when it comes to offsets...
> 
> I spent hours trying to improve the patch, managed to make some
> progress, but there are still corner cases to fix.  For example, the
> patch doesn't deal well with this case:
> 
> struct aa {                                    
> /*    0      |     1 */    char aa;            
> /*    1: 1   |     1 */    unsigned char a : 7;                                                
> /*    1:15   |     4 */    int b : 10;         
> } /* total size:    4 bytes */                 
> 
> In this case, the bitfield "b" would be combined with the previous
> bitfield "a", like pahole reports:
> 
> struct aa {                                    
>         char                       aa;                   /*     0     1 */                     
>         unsigned char              a:7;                  /*     1: 1  1 */                     
> 
>         /* Bitfield combined with previous fields */                                           
> 
>         int                        b:10;                 /*     0: 7  4 */                     
> }
> 
> Confusing...  I'm not sure why pahole reports b's offset to be 0.

0 seems right to me.  The bitfield's type is int, with size 4,
and it lives at byte offset 0:

 <2><53>: Abbrev Number: 5 (DW_TAG_member)
    <54>   DW_AT_name        : (indirect string, offset: 0x4ae): b
    <58>   DW_AT_decl_file   : 1
    <59>   DW_AT_decl_line   : 7
    <5a>   DW_AT_type        : <0x71>
    <5e>   DW_AT_byte_size   : 4
    <5f>   DW_AT_bit_size    : 10
    <60>   DW_AT_bit_offset  : 7
    <61>   DW_AT_data_member_location: 0     <<<

Replacing the 0 with 1, like:

    int                        b:10;                 /*     1: 7  4 */

would look incorrect to me, because that'd make '(char*)&aa + 1 + 4'
(address of containing object + byte offset + byte size) overshoot the
size of the containing object.

What is that number after ":"  in bitfields supposed to mean in
pahole's output (and I assume that that's what you're trying
to emulate)?  We're missing documentation for that.

It seems like it's supposed to mean the number of bits left in the
containing anonymous object (i.e., in the 4 bytes of the declared
int)?  Then "0:7" seems right, given:

sizeof (int) * 8 - bitsof(aa.a) - bitsof(aa.a) - bits(aa.b)
   => sizeof (int) * 8 - 7 - 10 
   => 7

It took me a while to get to this conclusion (and writing a lot
of text that I ended up deleting... :-P), because I originally
assumed that this was meant to be the field's bit offset.

> 
> Also, the patch doesn't understand cases like this:
> 
> struct tyu
> {
>   unsigned int a1 : 1;
>   unsigned int a2 : 3;
>   unsigned int a9 : 23;
>   /* PROBLEM HAPPENS HERE */
>   unsigned char a0 : 2;
>   uint64_t a3;
>   unsigned int a4 : 5;
>   uint64_t a5 : 3;
> };
> 
> In this case, we're switching types in the middle of the bitfield.  The
> bitfield "unsigned char a0" would be combined with the bitfields above
> it, but the patch doesn't know that:
> 
> struct tyu {
> /*    0:31   |     4 */    unsigned int a1 : 1;
> /*    0:28   |     4 */    unsigned int a2 : 3;
> /*    0: 5   |     4 */    unsigned int a9 : 23;
> /*    3: 6   |     1 */    unsigned char a0 : 2;
> /* XXX  3-bit hole   */
> /* XXX  4-byte hole  */
> /*    8      |     8 */    uint64_t a3;
> /*   16:27   |     4 */    unsigned int a4 : 5;
> /*   16:56   |     8 */    uint64_t a5 : 3;
> } /* total size:   24 bytes */
> 
> Whereas pahole reports:
> 
> struct tyu {
>         unsigned int               a1:1;                 /*     0:31  4 */
>         unsigned int               a2:3;                 /*     0:28  4 */
>         unsigned int               a9:23;                /*     0: 5  4 */
> 
>         /* XXX 253 bits hole, try to pack */
>         /* Bitfield combined with next fields */
> 
>         unsigned char              a0:2;                 /*     3: 3  1 */
> 
>         /* XXX 6 bits hole, try to pack */
>         /* XXX 4 bytes hole, try to pack */
> 
>         uint64_t                   a3;                   /*     8     8 */
>         unsigned int               a4:5;                 /*    16:27  4 */
>         uint64_t                   a5:3;                 /*    16:56  8 */
> };
> 
> Hm, TBH pahole itself seems a bit confused here, saying there is a
> 253-bit hole...

A 253-bit hole does look odd.

> 
> 
> Anyway, long story short, this is much more complex that I thought it
> would be (TM).  I am extremely tired right now and can't continue, but I
> intend to resume work tomorrow morning.  But I'd like to leave a few
> options on the table:
> 
> 1) Remove the patch from the 8.1 wishlist, which will unblock the
> branching.
> 
> 2) Remove the bitfield handling from the patch, leaving it
> feature-incomplete, but working.
> 
> 3) Push the patch with these known limitations, document them, mark them
> as KFAIL in the testcase, and open a bug to fix them (I personally
> wouldn't like this).
> 
> 4) Wait more time until these issues are resolved.
> 

Joel said that we'd re-evaluate Wednesday, so there's still some time.

Thanks,
Pedro Alves

  reply	other threads:[~2017-12-12 18:14 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-21 16:07 [PATCH] " Sergio Durigan Junior
2017-11-21 16:16 ` Sergio Durigan Junior
2017-11-21 16:50 ` Eli Zaretskii
2017-11-21 17:00   ` Sergio Durigan Junior
2017-11-21 19:14     ` Eli Zaretskii
2017-11-26 19:27 ` Tom Tromey
2017-11-27 19:54   ` Sergio Durigan Junior
2017-11-27 22:20     ` Tom Tromey
2017-11-28  0:39       ` Sergio Durigan Junior
2017-11-28 21:21 ` [PATCH v2] " Sergio Durigan Junior
2017-11-29  3:28   ` Eli Zaretskii
2017-12-04 15:03   ` Sergio Durigan Junior
2017-12-04 15:41     ` Eli Zaretskii
2017-12-04 16:47       ` Sergio Durigan Junior
2017-12-08 21:32     ` Sergio Durigan Junior
2017-12-11 15:43   ` Simon Marchi
2017-12-11 18:59     ` Sergio Durigan Junior
2017-12-11 20:45       ` Simon Marchi
2017-12-11 21:07         ` Sergio Durigan Junior
2017-12-11 22:42           ` Pedro Alves
2017-12-11 22:50             ` Sergio Durigan Junior
2017-12-11 23:46               ` Pedro Alves
2017-12-12  0:25                 ` Sergio Durigan Junior
2017-12-12  0:52                   ` Pedro Alves
2017-12-12  1:25                     ` Simon Marchi
2017-12-12 15:50                       ` John Baldwin
2017-12-12 17:04                         ` Sergio Durigan Junior
2017-12-11 19:58 ` [PATCH v3 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior
2017-12-11 19:58   ` [PATCH v3 1/2] Reorganize code to handle TYPE_CODE_{STRUCT,UNION} on 'c_type_print_base' Sergio Durigan Junior
2017-12-11 20:55     ` Simon Marchi
2017-12-11 23:05       ` Sergio Durigan Junior
2017-12-11 19:58   ` [PATCH v3 2/2] Implement pahole-like 'ptype /o' option Sergio Durigan Junior
2017-12-11 21:50     ` Simon Marchi
2017-12-11 23:24       ` Sergio Durigan Junior
2017-12-12  1:32         ` Simon Marchi
2017-12-12  6:19           ` Sergio Durigan Junior
2017-12-12 18:14             ` Pedro Alves [this message]
2017-12-12 18:40               ` Sergio Durigan Junior
2017-12-12 20:12                 ` Pedro Alves
2017-12-11 23:43 ` [PATCH v4 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior
2017-12-11 23:44   ` [PATCH v4 2/2] Implement pahole-like 'ptype /o' option Sergio Durigan Junior
2017-12-12  0:27     ` Sergio Durigan Junior
2017-12-12  0:29       ` Sergio Durigan Junior
2017-12-12  1:59     ` Simon Marchi
2017-12-12  3:39     ` Eli Zaretskii
2017-12-11 23:44   ` [PATCH v4 1/2] Reorganize code to handle TYPE_CODE_{STRUCT,UNION} on 'c_type_print_base' Sergio Durigan Junior
2017-12-13  3:17 ` [PATCH v5 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior
2017-12-13  3:17   ` [PATCH v5 2/2] Implement pahole-like 'ptype /o' option Sergio Durigan Junior
2017-12-13  4:50     ` Simon Marchi
2017-12-13 16:42       ` Sergio Durigan Junior
2017-12-13 16:17     ` Eli Zaretskii
2017-12-13 17:14       ` Sergio Durigan Junior
2017-12-13 16:19     ` Pedro Alves
2017-12-13 17:13       ` Sergio Durigan Junior
2017-12-13 20:36         ` Sergio Durigan Junior
2017-12-13 21:22           ` Pedro Alves
2017-12-13 21:30             ` Pedro Alves
2017-12-13 21:34             ` Sergio Durigan Junior
2017-12-13 16:20     ` Pedro Alves
2017-12-13 17:41       ` Sergio Durigan Junior
2017-12-13  3:17   ` [PATCH v5 1/2] Reorganize code to handle TYPE_CODE_{STRUCT,UNION} on 'c_type_print_base' Sergio Durigan Junior
2017-12-14  2:48 ` [PATCH v6 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior
2017-12-14  2:48   ` [PATCH v6 1/2] Reorganize code to handle TYPE_CODE_{STRUCT,UNION} on 'c_type_print_base' Sergio Durigan Junior
2017-12-14  2:48   ` [PATCH v6 2/2] Implement pahole-like 'ptype /o' option Sergio Durigan Junior
2017-12-14 14:19     ` Pedro Alves
2017-12-14 20:31       ` Sergio Durigan Junior
2017-12-14 14:50     ` Pedro Alves
2017-12-14 20:29       ` Sergio Durigan Junior
2017-12-14 16:30     ` Eli Zaretskii
2017-12-15  1:12 ` [PATCH v7 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior
2017-12-15  1:12   ` [PATCH v7 1/2] Reorganize code to handle TYPE_CODE_{STRUCT,UNION} on 'c_type_print_base' Sergio Durigan Junior
2017-12-15  1:13   ` [PATCH v7 2/2] Implement pahole-like 'ptype /o' option Sergio Durigan Junior
2017-12-15 17:24     ` Pedro Alves
2017-12-15 20:04       ` Sergio Durigan Junior
2017-12-15 20:11   ` [PATCH v7 0/2] Implement pahole-like 'ptype /o' option (and do some code reorg) Sergio Durigan Junior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d15b3ba6-9a33-32b4-7541-51232279ed0b@redhat.com \
    --to=palves@redhat.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=sergiodj@redhat.com \
    --cc=simon.marchi@ericsson.com \
    --cc=simon.marchi@polymtl.ca \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).