dwarves_fprintf: Print the bit_offset for inline enum bitfield class members

Before:

  $ pahole examples/myrb_dcdb.o
  struct myrb_dcdb {
	  unsigned int               target:4;             /*     0:28  4 */
	  unsigned int               channel:4;            /*     0:24  4 */

	  /* Bitfield combined with next fields */

	  enum {
		  MYRB_DCDB_XFER_NONE = 0,
		  MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1,
		  MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2,
		  MYRB_DCDB_XFER_ILLEGAL = 3,
	  } data_xfer:2;                                     /*     1     1 */
  <SNIP>

After:

  $ pahole examples/myrb_dcdb.o
  struct myrb_dcdb {
	unsigned int               target:4;             /*     0:28  4 */
	unsigned int               channel:4;            /*     0:24  4 */

	/* Bitfield combined with next fields */

	enum {
		MYRB_DCDB_XFER_NONE = 0,
		MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1,
		MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2,
		MYRB_DCDB_XFER_ILLEGAL = 3,
	} data_xfer:2;                                   /*     1: 6  1 */

  <SNIP>

Look at data_xfer:2, it now shows the bit_offset (6) in addition to the
byte offset (1) and the bit_size (2).

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2019-03-12 16:43:37 -03:00
parent bb8350acf5
commit fa963e1a86
1 changed files with 17 additions and 3 deletions

View File

@ -784,12 +784,26 @@ static size_t class_member__fprintf(struct class_member *member, bool union_memb
if (!sconf.suppress_offset_comment) {
/* Check if this is a anonymous union */
const int slen = cm_name ? (int)strlen(cm_name) : -1;
int size_spacing = 5;
printed += fprintf(fp, sconf.hex_fmt ?
"%*s/* %#5x %#5x */" :
"%*s/* %5u %5u */",
"%*s/* %#5x" :
"%*s/* %5u",
(sconf.type_spacing +
sconf.name_spacing - slen - 3),
" ", offset, size);
" ", offset);
if (member->bitfield_size != 0) {
unsigned int bitfield_offset = member->bitfield_offset;
if (member->bitfield_offset < 0)
bitfield_offset = member->byte_size * 8 + member->bitfield_offset;
printed += fprintf(fp, sconf.hex_fmt ? ":%#2x" : ":%2u", bitfield_offset);
size_spacing -= 3;
}
printed += fprintf(fp, sconf.hex_fmt ? " %#*x */" : " %*u */", size_spacing, size);
}
} else {
int spacing = sconf.type_spacing + sconf.name_spacing - printed;