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()

Reply via email to