From: Matthieu Longo <matthieu.longo@arm.com>
To: <gdb-patches@sourceware.org>, Tom Tromey <tom@tromey.com>
Cc: Andrew Burgess <aburgess@redhat.com>,
Matthieu Longo <matthieu.longo@arm.com>
Subject: [PATCH v1] gdb/python: fix memory leak in gdb_py_tp_name
Date: Tue, 26 May 2026 17:04:59 +0100 [thread overview]
Message-ID: <20260526160459.270322-1-matthieu.longo@arm.com> (raw)
The current implementation of gdb_py_tp_name() leaks a reference to the
object returned by PyType_GetFullyQualifiedName() for Python >= 3.13, and
PyType_GetQualName() for Python >= 3.11.
Managing the strong reference on the returned PyObject* with a gdbpy_ref<>
fixes the reference count, but also causes the temporary object to be
deallocated on function exit. As a consequence, the 'const char *' returned
by PyUnicode_AsUTF8AndSize() becomes dangling and can no longer safely be
returned.
The proposed approach consists in changing gdb_py_tp_name() to return a
std::string, and forcing a copy of the 'const char *' value, statically
or dynamically allocated, stored in a temporary or non-temporary PyObject,
depending on the version of Python it was compiled with.
A unfortunate side effect of this fix is that every call sites where the
tp_name is printed, must now use `.c_str()' because PyErr_Format()
and its siblings cannot handle std::string.
---
gdb/python/py-arch.c | 2 +-
gdb/python/py-block.c | 2 +-
gdb/python/py-breakpoint.c | 6 +++---
gdb/python/py-connection.c | 2 +-
gdb/python/py-corefile.c | 2 +-
gdb/python/py-disasm.c | 14 +++++++-------
gdb/python/py-frame.c | 4 ++--
gdb/python/py-infthread.c | 2 +-
gdb/python/py-mi.c | 2 +-
gdb/python/py-micmd.c | 4 +++-
gdb/python/py-obj-type.c | 12 ++++++------
gdb/python/py-obj-type.h | 4 ++--
gdb/python/py-style.c | 14 +++++++-------
gdb/python/py-symbol.c | 2 +-
gdb/python/py-type.c | 2 +-
gdb/python/py-unwind.c | 8 ++++----
gdb/python/py-utils.c | 5 +++--
gdb/python/python-internal.h | 13 ++++++++-----
gdb/python/python.c | 2 +-
19 files changed, 54 insertions(+), 48 deletions(-)
diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c
index 7a0cb0a2a59..5b3cfbdc876 100644
--- a/gdb/python/py-arch.c
+++ b/gdb/python/py-arch.c
@@ -343,7 +343,7 @@ archpy_repr (PyObject *self)
auto arch_info = gdbarch_bfd_arch_info (gdbarch);
return PyUnicode_FromFormat ("<%s arch_name=%s printable_name=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
arch_info->arch_name,
arch_info->printable_name);
}
diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c
index 903f800683a..99c487bc875 100644
--- a/gdb/python/py-block.c
+++ b/gdb/python/py-block.c
@@ -527,7 +527,7 @@ blpy_repr (PyObject *self)
str += ", ";
}
return PyUnicode_FromFormat ("<%s %s {%s}>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
name, str.c_str ());
}
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index d1fec6a7700..30d5ea471c2 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -1067,7 +1067,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
static PyObject *
bppy_repr (PyObject *self)
{
- const char *tp_name = gdbpy_py_obj_tp_name (self);
+ const auto &tp_name = gdbpy_py_obj_tp_name (self);
const auto bp = (struct gdbpy_breakpoint_object*) self;
if (bp->bp == nullptr)
@@ -1083,7 +1083,7 @@ bppy_repr (PyObject *self)
str.pop_back ();
return PyUnicode_FromFormat ("<%s%s number=%d hits=%d%s>",
- tp_name,
+ tp_name.c_str (),
(bp->bp->enable_state == bp_enabled
? "" : " disabled"), bp->bp->number,
bp->bp->hit_count, str.c_str ());
@@ -1776,7 +1776,7 @@ bplocpy_repr (PyObject *py_self)
}
return PyUnicode_FromFormat ("<%s %s>",
- gdbpy_py_obj_tp_name (py_self),
+ gdbpy_py_obj_tp_name (py_self).c_str (),
str.c_str ());
}
diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c
index 02330b28068..bc738669b79 100644
--- a/gdb/python/py-connection.c
+++ b/gdb/python/py-connection.c
@@ -203,7 +203,7 @@ connpy_repr (PyObject *obj)
return gdb_py_invalid_object_repr (obj);
return PyUnicode_FromFormat ("<%s num=%d, what=\"%s\">",
- gdbpy_py_obj_tp_name (obj),
+ gdbpy_py_obj_tp_name (obj).c_str (),
target->connection_number,
make_target_connection_string (target).c_str ());
}
diff --git a/gdb/python/py-corefile.c b/gdb/python/py-corefile.c
index fbefbd267f4..fc5b4889fdc 100644
--- a/gdb/python/py-corefile.c
+++ b/gdb/python/py-corefile.c
@@ -400,7 +400,7 @@ cfpy_repr (PyObject *self)
bfd *core_bfd = get_inferior_core_bfd (obj->inferior);
gdb_assert (core_bfd != nullptr);
return PyUnicode_FromFormat ("<%s inferior=%d filename='%s'>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
obj->inferior->num,
bfd_get_filename (core_bfd));
}
diff --git a/gdb/python/py-disasm.c b/gdb/python/py-disasm.c
index e5d7174b7d6..a2abf37a605 100644
--- a/gdb/python/py-disasm.c
+++ b/gdb/python/py-disasm.c
@@ -312,7 +312,7 @@ disasmpy_info_repr (PyObject *self)
const char *arch_name
= (gdbarch_bfd_arch_info (obj->gdbarch))->printable_name;
return PyUnicode_FromFormat ("<%s address=%s architecture=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
core_addr_to_string_nz (obj->address),
arch_name);
}
@@ -1003,7 +1003,7 @@ disasmpy_result_init (PyObject *self, PyObject *args, PyObject *kwargs)
{
PyErr_Format (PyExc_ValueError,
_("Cannot use 'string' and 'parts' when creating %s."),
- gdbpy_py_obj_tp_name (self));
+ gdbpy_py_obj_tp_name (self).c_str ());
return -1;
}
@@ -1087,7 +1087,7 @@ disasmpy_result_repr (PyObject *self)
gdb_assert (obj->parts != nullptr);
return PyUnicode_FromFormat ("<%s length=%d string=\"%U\">",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
obj->length,
disasmpy_result_str (self));
}
@@ -1302,7 +1302,7 @@ gdbpy_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
PyErr_Format
(PyExc_TypeError,
_("Result from Disassembler must be gdb.DisassemblerResult, not %s."),
- gdbpy_py_obj_tp_name (result.get ()));
+ gdbpy_py_obj_tp_name (result.get ()).c_str ());
gdbpy_print_stack ();
return std::optional<int> (-1);
}
@@ -1391,7 +1391,7 @@ disasmpy_part_init (PyObject *self, PyObject *args, PyObject *kwargs)
{
PyErr_Format (PyExc_RuntimeError,
_("Cannot create instances of %s."),
- gdbpy_py_obj_tp_name (self));
+ gdbpy_py_obj_tp_name (self).c_str ());
return -1;
}
@@ -1428,7 +1428,7 @@ disasmpy_text_part_repr (PyObject *self)
gdb_assert (obj->string != nullptr);
return PyUnicode_FromFormat ("<%s string='%s', style='%s'>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
obj->string->c_str (),
get_style_name (obj->style));
}
@@ -1471,7 +1471,7 @@ disasmpy_addr_part_repr (PyObject *self)
disasm_addr_part_object *obj = (disasm_addr_part_object *) self;
return PyUnicode_FromFormat ("<%s address='%s'>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
core_addr_to_string_nz (obj->address));
}
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 0a1a0dffbf9..859b8bdbb6e 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -97,7 +97,7 @@ frapy_repr (PyObject *self)
const frame_id &fid = frame_obj->frame_id;
return PyUnicode_FromFormat ("<%s level=%d frame-id=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
frame_relative_level (f_info),
fid.to_string ().c_str ());
}
@@ -545,7 +545,7 @@ frapy_read_var (PyObject *self, PyObject *args, PyObject *kw)
{
PyErr_Format (PyExc_TypeError,
_("argument 1 must be gdb.Symbol or str, not %s"),
- gdbpy_py_obj_tp_name (sym_obj));
+ gdbpy_py_obj_tp_name (sym_obj).c_str ());
return NULL;
}
diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
index ddb67a284ac..96c736495a8 100644
--- a/gdb/python/py-infthread.c
+++ b/gdb/python/py-infthread.c
@@ -354,7 +354,7 @@ thpy_repr (PyObject *self)
thread_info *thr = thread_obj->thread;
return PyUnicode_FromFormat ("<%s id=%s target-id=\"%s\">",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
print_full_thread_id (thr),
target_pid_to_str (thr->ptid).c_str ());
}
diff --git a/gdb/python/py-mi.c b/gdb/python/py-mi.c
index 1bcb276da8a..73daefecb20 100644
--- a/gdb/python/py-mi.c
+++ b/gdb/python/py-mi.c
@@ -379,7 +379,7 @@ gdbpy_notify_mi (PyObject *self, PyObject *args, PyObject *kwargs)
PyErr_Format
(PyExc_ValueError,
_("MI notification data must be either None or a dictionary, not %s"),
- gdbpy_py_obj_tp_name (data));
+ gdbpy_py_obj_tp_name (data).c_str ());
return nullptr;
}
diff --git a/gdb/python/py-micmd.c b/gdb/python/py-micmd.c
index 9ae7fc51bee..9f6e664a5f2 100644
--- a/gdb/python/py-micmd.c
+++ b/gdb/python/py-micmd.c
@@ -511,7 +511,9 @@ micmdpy_set_installed (PyObject *self, PyObject *newvalue, void *closure)
{
PyErr_Format (PyExc_TypeError,
_("gdb.MICommand.installed must be set to a bool, not %s"),
- newvalue == Py_None ? "None" : gdbpy_py_obj_tp_name (newvalue));
+ (newvalue == Py_None
+ ? "None"
+ : gdbpy_py_obj_tp_name (newvalue).c_str ()));
return -1;
}
diff --git a/gdb/python/py-obj-type.c b/gdb/python/py-obj-type.c
index ea0b59a8447..6d428b355b8 100644
--- a/gdb/python/py-obj-type.c
+++ b/gdb/python/py-obj-type.c
@@ -21,17 +21,17 @@
#include "py-obj-type.h"
/* Return the type's fully qualified name from a PyTypeObject. */
-const char *
+std::string
gdb_py_tp_name (PyTypeObject *py_type) noexcept
{
#if PY_VERSION_HEX >= 0x030d0000
/* Note: PyType_GetFullyQualifiedName() was added in version 3.13, and is
part of the stable ABI since version 3.13. */
- PyObject *fully_qualified_name = PyType_GetFullyQualifiedName (py_type);
+ gdbpy_ref<> fully_qualified_name (PyType_GetFullyQualifiedName (py_type));
if (fully_qualified_name == nullptr)
return nullptr;
- return PyUnicode_AsUTF8AndSize (fully_qualified_name, nullptr);
+ return PyUnicode_AsUTF8AndSize (fully_qualified_name.get (), nullptr);
#else /* PY_VERSION_HEX < 0x030d0000 && ! defined (Py_LIMITED_API) */
/* For non-heap types, the fully qualified name corresponds to tp_name. */
@@ -44,11 +44,11 @@ gdb_py_tp_name (PyTypeObject *py_type) noexcept
# if PY_VERSION_HEX >= 0x030b0000
/* Note: PyType_GetQualName() was added in version 3.11. */
- PyObject *qualname = PyType_GetQualName (py_type);
+ gdbpy_ref<> qualname (PyType_GetQualName (py_type));
if (qualname == nullptr)
return nullptr;
- return PyUnicode_AsUTF8AndSize (qualname, nullptr);
+ return PyUnicode_AsUTF8AndSize (qualname.get (), nullptr);
# else
/* In the absence of PyType_GetQualName(), fallback on using PyHeapTypeObject
@@ -66,7 +66,7 @@ gdb_py_tp_name (PyTypeObject *py_type) noexcept
}
/* Return the type's fully qualified name from a PyObject. */
-const char *
+std::string
gdbpy_py_obj_tp_name (PyObject *self) noexcept
{
/* Note: Py_TYPE () is part of the stable ABI since version 3.14. */
diff --git a/gdb/python/py-obj-type.h b/gdb/python/py-obj-type.h
index 293647fabfb..ac6c6aa3296 100644
--- a/gdb/python/py-obj-type.h
+++ b/gdb/python/py-obj-type.h
@@ -21,9 +21,9 @@
#define GDB_PYTHON_PY_OBJ_TYPE_H
/* Return the type's fully qualified name from a PyTypeObject. */
-extern const char *gdb_py_tp_name (PyTypeObject *py_type) noexcept;
+extern std::string gdb_py_tp_name (PyTypeObject *py_type) noexcept;
/* Return the type's fully qualified name from a PyObject. */
-extern const char *gdbpy_py_obj_tp_name (PyObject *self) noexcept;
+extern std::string gdbpy_py_obj_tp_name (PyObject *self) noexcept;
#endif /* GDB_PYTHON_PY_OBJ_TYPE_H */
diff --git a/gdb/python/py-style.c b/gdb/python/py-style.c
index c45eba60867..a27a1ab75a7 100644
--- a/gdb/python/py-style.c
+++ b/gdb/python/py-style.c
@@ -269,7 +269,7 @@ stylepy_init_from_parts (PyObject *self, PyObject *fg, PyObject *bg,
PyErr_Format
(PyExc_TypeError,
_("'foreground' argument must be gdb.Color or None, not %s."),
- gdbpy_py_obj_tp_name (fg));
+ gdbpy_py_obj_tp_name (fg).c_str ());
return -1;
}
@@ -278,7 +278,7 @@ stylepy_init_from_parts (PyObject *self, PyObject *fg, PyObject *bg,
PyErr_Format
(PyExc_TypeError,
_("'background' argument must be gdb.Color or None, not %s."),
- gdbpy_py_obj_tp_name (bg));
+ gdbpy_py_obj_tp_name (bg).c_str ());
return -1;
}
@@ -485,7 +485,7 @@ stylepy_set_foreground (PyObject *self, PyObject *newvalue, void *closure)
if (!gdbpy_is_color (newvalue))
{
PyErr_Format (PyExc_TypeError, _("value must be gdb.Color, not %s"),
- gdbpy_py_obj_tp_name (newvalue));
+ gdbpy_py_obj_tp_name (newvalue).c_str ());
return -1;
}
@@ -543,7 +543,7 @@ stylepy_set_background (PyObject *self, PyObject *newvalue, void *closure)
if (!gdbpy_is_color (newvalue))
{
PyErr_Format (PyExc_TypeError, _("value must be gdb.Color, not %s"),
- gdbpy_py_obj_tp_name (newvalue));
+ gdbpy_py_obj_tp_name (newvalue).c_str ());
return -1;
}
@@ -625,7 +625,7 @@ stylepy_set_intensity (PyObject *self, PyObject *newvalue, void *closure)
PyErr_Format
(PyExc_TypeError,
_("value must be a Long (a gdb.INTENSITY constant), not %s"),
- gdbpy_py_obj_tp_name (newvalue));
+ gdbpy_py_obj_tp_name (newvalue).c_str ());
return -1;
}
@@ -735,12 +735,12 @@ stylepy_repr (PyObject *self)
if (style_obj->style_name == nullptr)
return PyUnicode_FromFormat ("<%s fg=%s, bg=%s, intensity=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
fg_str.get (), bg_str.get (),
intensity_str);
else
return PyUnicode_FromFormat ("<%s name='%s', fg=%s, bg=%s, intensity=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
style_obj->style_name, fg_str.get (),
bg_str.get (), intensity_str);
}
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index 5b1d843a36f..5840a3f5720 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -384,7 +384,7 @@ sympy_repr (PyObject *self)
return gdb_py_invalid_object_repr (self);
return PyUnicode_FromFormat ("<%s print_name=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
symbol->print_name ());
}
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index c002d97d0c6..7831e838481 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -1086,7 +1086,7 @@ typy_repr (PyObject *self)
host_charset (), NULL);
return PyUnicode_FromFormat ("<%s code=%s name=%U>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
code, py_typename);
}
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index 7ec87367d0a..13eced4cecb 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -252,7 +252,7 @@ unwind_infopy_repr (PyObject *self)
if (pending_frame->frame_info == nullptr)
return PyUnicode_FromFormat ("<%s for an invalid frame>",
- gdbpy_py_obj_tp_name (self));
+ gdbpy_py_obj_tp_name (self).c_str ());
std::string saved_reg_names;
struct gdbarch *gdbarch = pending_frame->gdbarch;
@@ -268,7 +268,7 @@ unwind_infopy_repr (PyObject *self)
const frame_info_ptr &frame (*pending_frame->frame_info);
return PyUnicode_FromFormat ("<%s frame #%d, saved_regs=(%s)>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
frame_relative_level (frame),
saved_reg_names.c_str ());
}
@@ -464,7 +464,7 @@ pending_framepy_repr (PyObject *self)
}
return PyUnicode_FromFormat ("<%s level=%d, sp=%s, pc=%s>",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
frame_relative_level (frame),
sp_str,
pc_str);
@@ -939,7 +939,7 @@ frame_unwind_python::sniff (const frame_info_ptr &this_frame,
gdb_assert (pyo_unwind_info != nullptr);
if (!PyObject_TypeCheck (pyo_unwind_info, &unwind_info_object_type))
error (_("an Unwinder should return gdb.UnwindInfo, not %s."),
- gdbpy_py_obj_tp_name (pyo_unwind_info));
+ gdbpy_py_obj_tp_name (pyo_unwind_info).c_str ());
{
unwind_info_object *unwind_info =
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
index 96f1cb1ee31..a831b96eb38 100644
--- a/gdb/python/py-utils.c
+++ b/gdb/python/py-utils.c
@@ -362,7 +362,7 @@ gdb_py_generic_getattro (PyObject *self, PyObject *attr)
Therefore, we must explicitly raise an AttributeError in this case. */
PyErr_Format (PyExc_AttributeError,
"'%s' object has no attribute '%s'",
- gdbpy_py_obj_tp_name (self),
+ gdbpy_py_obj_tp_name (self).c_str (),
PyUnicode_AsUTF8AndSize (attr, nullptr));
return nullptr;
}
@@ -700,5 +700,6 @@ gdbpy_fix_doc_string_indentation (gdb::unique_xmalloc_ptr<char> doc)
PyObject *
gdb_py_invalid_object_repr (PyObject *self)
{
- return PyUnicode_FromFormat ("<%s (invalid)>", gdbpy_py_obj_tp_name (self));
+ return PyUnicode_FromFormat ("<%s (invalid)>",
+ gdbpy_py_obj_tp_name (self).c_str ());
}
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 10c984bad4b..0cc5fc4ac06 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -1132,15 +1132,18 @@ gdbpy_type_ready (PyTypeObject *type, PyObject *mod = nullptr)
{
if (PyType_Ready (type) < 0)
return -1;
- const char *tp_name = gdb_py_tp_name (type);
+ const auto &tp_name = gdb_py_tp_name (type);
+ std::string_view tp_name_s = tp_name;
if (mod == nullptr)
{
- gdb_assert (startswith (tp_name, "gdb."));
+ gdb_assert (startswith (tp_name_s, "gdb."));
mod = gdb_module;
}
- const char *dot = strrchr (tp_name, '.');
- gdb_assert (dot != nullptr);
- return gdb_pymodule_addobject (mod, dot + 1, (PyObject *) type);
+ const auto pos_dot = tp_name_s.find_last_of ('.');
+ gdb_assert (pos_dot != tp_name_s.npos);
+ return gdb_pymodule_addobject (mod,
+ tp_name_s.substr (pos_dot + 1).data (),
+ (PyObject *) type);
}
/* Poison PyType_Ready. Only gdbpy_type_ready should be used, to
diff --git a/gdb/python/python.c b/gdb/python/python.c
index e6d58f2f16a..2131c4a0648 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -1581,7 +1581,7 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw)
PyErr_Format
(PyExc_TypeError,
_("'style' argument must be gdb.Style or None, not %s."),
- gdbpy_py_obj_tp_name (style_obj));
+ gdbpy_py_obj_tp_name (style_obj).c_str ());
return nullptr;
}
--
2.54.0
next reply other threads:[~2026-05-26 16:07 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-26 16:04 Matthieu Longo [this message]
2026-05-26 16:35 ` Tom Tromey
2026-05-28 12:46 ` Matthieu Longo
2026-05-28 16:43 ` Tom Tromey
2026-05-28 17:08 ` Matthieu Longo
2026-05-28 19:00 ` Tom Tromey
2026-05-29 10:08 ` Matthieu Longo
2026-05-29 10:52 ` Andrew Burgess
2026-05-29 13:09 ` Tom Tromey
2026-06-01 9:57 ` Matthieu Longo
2026-06-02 9:36 ` Andrew Burgess
2026-06-02 14:22 ` Tom Tromey
2026-06-03 16:30 ` Matthieu Longo
2026-06-04 9:30 ` Andrew Burgess
2026-06-05 20:49 ` Tom Tromey
2026-06-08 10:31 ` Matthieu Longo
2026-06-08 18:51 ` Andrew Burgess
2026-06-05 10:06 ` Tom de Vries
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260526160459.270322-1-matthieu.longo@arm.com \
--to=matthieu.longo@arm.com \
--cc=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox