36 def pahole (self, atype, level, name, walk=False, nested=False):
37 if name is None:
38 name = ''
39 tag = atype.tag
40 if tag is None:
41 tag = ''
42 kind = 'struct' if atype.code == gdb.TYPE_CODE_STRUCT else 'union'
43 if not nested:
44 print ('/* %4d 0x%04x */ ' % (atype.sizeof, atype.sizeof), end="")
45 print ('%s%s %s {' % ( ' ' * (2 * level), kind, tag))
46 endpos = 0
47 for field in atype.fields():
48
49 if not hasattr (field, ('bitpos')):
50 continue
51
52 ftype = field.type.strip_typedefs()
53
54
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))
60
61
62 if field.bitsize > 0:
63 fieldsize = field.bitsize
64 else:
65 if (ftype.code == gdb.TYPE_CODE_STRUCT or ftype.code == gdb.TYPE_CODE_UNION) and len(ftype.fields()) == 0:
66 fieldsize = 0
67 else:
68 fieldsize = 8 * ftype.sizeof
69
70 print ('/* %3d 0x%03x %4d */ ' % (field.bitpos // 8, field.bitpos // 8, fieldsize // 8), end="")
71 endpos = field.bitpos + fieldsize
72
73
74 if walk and (ftype.code == gdb.TYPE_CODE_STRUCT or ftype.code == gdb.TYPE_CODE_UNION):
75 print (' ', end="")
76 self.pahole (ftype, level + 1, field.name, walk=walk, nested=True)
77 else:
78 print (' ' * (4 + 2 * level), end="")
79 print ('%s %s' % (str (ftype), field.name),end="")
80
81 if fieldsize != ftype.sizeof * 8:
82 print (':%d' % fieldsize)
83 else:
84 print ('')
85
86
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))
92
93 print (' ' * (14 + 2 * level), end="")
94 print (' } %s' % name)
95