36 def pahole (self, atype, level, name, walk=False, nested=False):
42 kind =
'struct' if atype.code == gdb.TYPE_CODE_STRUCT
else 'union'
44 print (
'/* %4d 0x%04x */ ' % (atype.sizeof, atype.sizeof), end=
"")
45 print (
'%s%s %s {' % (
' ' * (2 * level), kind, tag))
47 for field
in atype.fields():
49 if not hasattr (field, (
'bitpos')):
52 ftype = field.type.strip_typedefs()
55 if endpos < field.bitpos:
56 hole = field.bitpos - endpos
57 print (
'/* XXX %4d */ !!' % (hole // 8), end=
"")
58 print (
' ' * (4 + 2 * level - 2), end=
"")
59 print (
'char [%d] __%d_bit_padding__' % (math.ceil(hole / 8), hole))
63 fieldsize = field.bitsize
65 if (ftype.code == gdb.TYPE_CODE_STRUCT
or ftype.code == gdb.TYPE_CODE_UNION)
and len(ftype.fields()) == 0:
68 fieldsize = 8 * ftype.sizeof
70 print (
'/* %3d 0x%03x %4d */ ' % (field.bitpos // 8, field.bitpos // 8, fieldsize // 8), end=
"")
71 endpos = field.bitpos + fieldsize
74 if walk
and (ftype.code == gdb.TYPE_CODE_STRUCT
or ftype.code == gdb.TYPE_CODE_UNION):
76 self.pahole (ftype, level + 1, field.name, walk=walk, nested=
True)
78 print (
' ' * (4 + 2 * level), end=
"")
79 print (
'%s %s' % (str (ftype), field.name),end=
"")
81 if fieldsize != ftype.sizeof * 8:
82 print (
':%d' % fieldsize)
87 if endpos // 8 < atype.sizeof:
88 hole = 8 * atype.sizeof - endpos
89 print (
'/* XXX %4d */ !!' % hole, end=
"")
90 print (
' ' * (4 + 2 * level - 2), end=
"")
91 print (
'char [%d] __%d_bit_padding__' % (math.ceil(hole / 8), hole))
93 print (
' ' * (14 + 2 * level), end=
"")
94 print (
' } %s' % name)