aboutsummaryrefslogtreecommitdiff
path: root/gcc/gdbhooks.py
diff options
context:
space:
mode:
authorAlex Coplan <alex.coplan@arm.com>2024-08-30 15:29:34 +0100
committerAlex Coplan <alex.coplan@arm.com>2024-08-30 15:29:34 +0100
commit5020f8ea80af90d8a08eff9fdef3276056df98f5 (patch)
tree40501c10fd8c43d9af3e733510b31aaebe5da5c3 /gcc/gdbhooks.py
parent3fb90724cec7e76b60fb910fa98b4ebec9912a31 (diff)
downloadgcc-5020f8ea80af90d8a08eff9fdef3276056df98f5.zip
gcc-5020f8ea80af90d8a08eff9fdef3276056df98f5.tar.gz
gcc-5020f8ea80af90d8a08eff9fdef3276056df98f5.tar.bz2
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.
Diffstat (limited to 'gcc/gdbhooks.py')
-rw-r--r--gcc/gdbhooks.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py
index 7a64c03..904ee28 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()