https://gcc.gnu.org/g:5020f8ea80af90d8a08eff9fdef3276056df98f5
commit r15-3322-g5020f8ea80af90d8a08eff9fdef3276056df98f5 Author: Alex Coplan <alex.cop...@arm.com> Date: Fri Aug 30 15:29:34 2024 +0100 gdbhooks: Fix printing of vec with vl_ptr layout As it stands, the pretty printing of GCC's vecs by gdbhooks.py only handles vectors with vl_embed layout. As such, when encountering a vec with vl_ptr layout, GDB would print a diagnostic like: gdb.error: There is no member or method named m_vecpfx. when (e.g.) any such vec occurred in a backtrace. This patch extends VecPrinter.children to also handle vl_ptr vectors. gcc/ChangeLog: * gdbhooks.py (VEC_KIND_EMBED): New. (VEC_KIND_PTR): New. (get_vec_kind): New. (VecPrinter.children): Also handle vectors with vl_ptr layout. Diff: --- gcc/gdbhooks.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py index 7a64c03b8acb..904ee28423a9 100644 --- a/gcc/gdbhooks.py +++ b/gcc/gdbhooks.py @@ -453,6 +453,25 @@ class PassPrinter: ###################################################################### +VEC_KIND_EMBED = 0 +VEC_KIND_PTR = 1 + +""" +Given a vec or pointer to vec, return its layout (embedded or space +efficient). +""" +def get_vec_kind(val): + typ = val.type + if typ.code == gdb.TYPE_CODE_PTR: + typ = typ.target() + kind = typ.template_argument(2).name + if kind == "vl_embed": + return VEC_KIND_EMBED + elif kind == "vl_ptr": + return VEC_KIND_PTR + else: + assert False, f"unexpected vec kind {kind}" + class VecPrinter: # -ex "up" -ex "p bb->preds" def __init__(self, gdbval): @@ -467,11 +486,16 @@ class VecPrinter: return '0x%x' % intptr(self.gdbval) def children (self): - if intptr(self.gdbval) == 0: + val = self.gdbval + if intptr(val) != 0 and get_vec_kind(val) == VEC_KIND_PTR: + val = val['m_vec'] + + if intptr(val) == 0: return - m_vecpfx = self.gdbval['m_vecpfx'] + + assert get_vec_kind(val) == VEC_KIND_EMBED + m_vecpfx = val['m_vecpfx'] m_num = m_vecpfx['m_num'] - val = self.gdbval typ = val.type if typ.code == gdb.TYPE_CODE_PTR: typ = typ.target()