This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v6 2/2] Implement pahole-like 'ptype /o' option


Something broke in v5 -> v6 in the offset and hole computation.

I'm seeing this:

v6:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(top-gdb) ptype/o minimal_symbol
/* offset    |  size */  type = struct minimal_symbol {
/*    0      |    32 */    struct general_symbol_info {
/*    0      |     8 */        const char *name;
/*    8      |     8 */        union {
/*                 8 */            LONGEST ivalue;
/*                 8 */            const block *block;
/*                 8 */            const gdb_byte *bytes;
/*                 8 */            CORE_ADDR address;
/*                 8 */            const common_block *common_block;
/*                 8 */            symbol *chain;

                                   /* total size (bytes):    8 */
                               } value;
/*   24      |     8 */        union {
/*                 8 */            obstack *obstack;
/*                 8 */            const char *demangled_name;

                                   /* total size (bytes):    8 */
                               } language_specific;
/*   48:27   |     4 */        language language : 5;
/*   48:26   |     4 */        unsigned int ada_mangled : 1;
/* XXX  2-bit hole   */
/* XXX  1-byte hole  */
/*   50      |     2 */        short section;

                               /* total size (bytes):   32 */
                           } mginfo;
/*   56      |     8 */    unsigned long size;
/*   64      |     8 */    const char *filename;
/*   72:28   |     4 */    minimal_symbol_type type : 4;
/*   72:27   |     4 */    unsigned int created_by_gdb : 1;
/*   72:26   |     4 */    unsigned int target_flag_1 : 1;
/*   72:25   |     4 */    unsigned int target_flag_2 : 1;
/*   72:24   |     4 */    unsigned int has_size : 1;
/* XXX  7-byte hole  */
/*   80      |     8 */    minimal_symbol *hash_next;
/*   88      |     8 */    minimal_symbol *demangled_hash_next;

                           /* total size (bytes):   72 */
                         }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This says that "language_specific" is at 24, with size 8  => next
byte is at 32.  "language" is at 48.  How come no "XXX hole"
is printed?  Similarly in the "8 + 8 -> 24" jump.

It turns out the byte offsets are wrong.  Here's the actual
byte offset for language_specific is:

 (top-gdb) p /d &((minimal_symbol *) 0) ->mginfo.language_specific
 $1 = 16

while v6 says 24.

v5 seemed to get it right.  Here's what it would show:

(top-gdb) ptype /o minimal_symbol
/* offset    |  size */
type = struct minimal_symbol {
/*    0      |    32 */    struct general_symbol_info {
/*    0      |     8 */        const char *name;
/*    8      |     8 */        union {
/*                 8 */            LONGEST ivalue;
/*                 8 */            const block *block;
/*                 8 */            const gdb_byte *bytes;
/*                 8 */            CORE_ADDR address;
/*                 8 */            const common_block *common_block;
/*                 8 */            symbol *chain;
                               } /* total size:    8 bytes */ value;
/*   16      |     8 */        union {
/*                 8 */            obstack *obstack;
/*                 8 */            const char *demangled_name;
                               } /* total size:    8 bytes */ language_specific;
/*   24:27   |     4 */        language language : 5;
/*   24:26   |     4 */        unsigned int ada_mangled : 1;
/* XXX  2-bit hole   */
/* XXX  1-byte hole  */
/*   26      |     2 */        short section;
                           } /* total size:   32 bytes */ mginfo;
/*   32      |     8 */    unsigned long size;
/*   40      |     8 */    const char *filename;
/*   48:28   |     4 */    minimal_symbol_type type : 4;
/*   48:27   |     4 */    unsigned int created_by_gdb : 1;
/*   48:26   |     4 */    unsigned int target_flag_1 : 1;
/*   48:25   |     4 */    unsigned int target_flag_2 : 1;
/*   48:24   |     4 */    unsigned int has_size : 1;
/* XXX  7-byte hole  */
/*   56      |     8 */    minimal_symbol *hash_next;
/*   64      |     8 */    minimal_symbol *demangled_hash_next;
} /* total size:   72 bytes */
(top-gdb) 

Surprised this wasn't caught by the testcases.

I do like the new output format a lot better.  Thanks much for
implementing the suggestions!

Pedro Alves


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]