[v8,06/10] python: Add clear() to gdb.Record.
Commit Message
This function allows to clear the trace data from python, forcing to
re-decode the trace for successive commands.
---
gdb/doc/python.texi | 5 +++++
gdb/python/py-record-btrace.c | 13 +++++++++++++
gdb/python/py-record-btrace.h | 3 +++
gdb/python/py-record.c | 16 ++++++++++++++++
gdb/testsuite/gdb.python/py-record-btrace.exp | 6 +++++-
5 files changed, 42 insertions(+), 1 deletion(-)
Comments
On 3/21/23 11:46, Felix Willgerodt via Gdb-patches wrote:
> This function allows to clear the trace data from python, forcing to
> re-decode the trace for successive commands.
Can you describe the use case for this? When would the data associated
to a recording be stale and need to be re-decoded?
Simon
> -----Original Message-----
> From: Simon Marchi <simark@simark.ca>
> Sent: Freitag, 24. März 2023 15:37
> To: Willgerodt, Felix <felix.willgerodt@intel.com>; gdb-
> patches@sourceware.org
> Subject: Re: [PATCH v8 06/10] python: Add clear() to gdb.Record.
>
> On 3/21/23 11:46, Felix Willgerodt via Gdb-patches wrote:
> > This function allows to clear the trace data from python, forcing to
> > re-decode the trace for successive commands.
>
> Can you describe the use case for this? When would the data associated
> to a recording be stale and need to be re-decoded?
>
We only need it right now when the ptwrite filter function is changing.
In the future there might be other "auxiliary functionality" that could use this.
But with the commands right now there isn't really any other scenario I think.
Note that there is also "maint btrace clear" in CLI, which is equivalent, but
a maintenance command of course.
I will add a sentence to the commit-msg, that this will be used by the future
ptwrite patches.
Felix
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
@@ -3858,6 +3858,11 @@ A @code{gdb.Record} object has the following methods:
Move the replay position to the given @var{instruction}.
@end defun
+@defun Record.clear ()
+Clear the trace data of the current recording. This forces re-decoding of the
+trace for successive commands.
+@end defun
+
The common @code{gdb.Instruction} class that recording method specific
instruction objects inherit from, has the following attributes:
@@ -802,6 +802,19 @@ recpy_bt_goto (PyObject *self, PyObject *args)
Py_RETURN_NONE;
}
+/* Implementation of BtraceRecord.clear (self) -> None. */
+
+PyObject *
+recpy_bt_clear (PyObject *self, PyObject *args)
+{
+ const recpy_record_object * const record = (recpy_record_object *) self;
+ thread_info *const tinfo = record->thread;
+
+ btrace_clear (tinfo);
+
+ Py_RETURN_NONE;
+}
+
/* BtraceList methods. */
static PyMethodDef btpy_list_methods[] =
@@ -31,6 +31,9 @@ extern PyObject *recpy_bt_format (PyObject *self, void *closure);
/* Implementation of record.goto (instruction) -> None. */
extern PyObject *recpy_bt_goto (PyObject *self, PyObject *value);
+/* Implementation of BtraceRecord.clear (self) -> None. */
+extern PyObject *recpy_bt_clear (PyObject *self, PyObject *args);
+
/* Implementation of record.instruction_history [list]. */
extern PyObject *recpy_bt_instruction_history (PyObject *self, void *closure);
@@ -127,6 +127,19 @@ recpy_goto (PyObject *self, PyObject *value)
return PyErr_Format (PyExc_NotImplementedError, _("Not implemented."));
}
+/* Implementation of record.clear () -> None. */
+
+static PyObject *
+recpy_clear (PyObject *self, PyObject *value)
+{
+ const recpy_record_object * const obj = (recpy_record_object *) self;
+
+ if (obj->method == RECORD_METHOD_BTRACE)
+ return recpy_bt_clear (self, value);
+
+ return PyErr_Format (PyExc_NotImplementedError, _("Not implemented."));
+}
+
/* Implementation of record.replay_position [instruction] */
static PyObject *
@@ -538,6 +551,9 @@ static PyMethodDef recpy_record_methods[] = {
{ "goto", recpy_goto, METH_VARARGS,
"goto (instruction|function_call) -> None.\n\
Rewind to given location."},
+ { "clear", recpy_clear, METH_VARARGS,
+ "clear () -> None.\n\
+Clears the trace."},
{ NULL }
};
@@ -143,7 +143,11 @@ with_test_prefix "instruction " {
gdb_test "python print(repr(i.data))" "<memory at $hex>"
gdb_test "python print(i.decoded)" ".*"
gdb_test "python print(i.size)" "$decimal"
- gdb_test "python print(i.is_speculative)" "False"
+ gdb_test "python print(i.is_speculative)" "False"
+ gdb_test_no_output "python r.clear()"
+ gdb_test "python insn = r.instruction_history"
+ gdb_test_no_output "python i = insn\[0\]"
+ gdb_test "python print(i.size)" "$decimal"
}
with_test_prefix "function call" {