From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by sourceware.org (Postfix) with ESMTPS id 47AAA3988033 for ; Wed, 16 Jun 2021 07:46:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 47AAA3988033 IronPort-SDR: K6Br/AvsMGbloRqGiYJSwhTZXx7H8ghPoa0q7/4zqKxlyQ8BCOw6DRzJ9RV3ftWjXJxEbDX4s9 jE12N8KNf0lw== X-IronPort-AV: E=McAfee;i="6200,9189,10016"; a="206090743" X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="206090743" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:21 -0700 IronPort-SDR: ivYvTVCtIs5IpabHkR/gAmW0jFJBx4rI4ex7Va6xyHrCpxT6U+cWdD8Cap4q1yEG3EdA7aMlZI 6rNPVtENYOAA== X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="415658534" Received: from mulvlfelix.iul.intel.com (HELO localhost) ([172.28.48.31]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:20 -0700 From: Felix Willgerodt To: markus.t.metzger@intel.com, gdb-patches@sourceware.org Subject: [PATCH v3 05/12] python: Introduce gdb.RecordAuxiliary class. Date: Wed, 16 Jun 2021 09:41:58 +0200 Message-Id: <20210616074205.1129553-6-felix.willgerodt@intel.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20210616074205.1129553-1-felix.willgerodt@intel.com> References: <20210616074205.1129553-1-felix.willgerodt@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Jun 2021 07:46:25 -0000 Auxiliary instructions are no real instructions and get their own object class, similar to gaps. gdb.Record.instruction_history is now possibly a list of gdb.RecordInstruction, gdb.RecordGap or gdb.RecordAuxiliary objects. This patch is in preparation for the new ptwrite feature, which is based on auxiliary instructions. gdb/ChangeLog: 2021-06-14 Felix Willgerodt * py-record-btrace.c (btpy_insn_or_gap_new): Removed. (btpy_item_new): New function. (btpy_list_item): Call btpy_item_new instead of recpy_insn_new. (recpy_bt_replay_position): Call btpy_item_new instead of btpy_insn_or_gap_new. (recpy_bt_begin): Call btpy_item_new instead of btpy_insn_or_gap_new. (recpy_bt_end): Call btpy_item_new instead of btpy_insn_or_gap_new. * py-record.c (recpy_aux_type): New static object. (recpy_aux_object): New typedef. (recpy_aux_new, recpy_aux_number, recpy_aux_data): New function. (recpy_aux_getset): New static object. (gdbpy_initialize_record): Initialize gdb.RecordAuxiliary type. gdb/doc/ChangeLog: 2021-06-14 Felix Willgerodt * python.texi (gdb.RecordAuxiliary): New documentation. --- gdb/doc/python.texi | 13 +++++++ gdb/python/py-record-btrace.c | 33 ++++++++++------ gdb/python/py-record.c | 73 ++++++++++++++++++++++++++++++++++- gdb/python/py-record.h | 3 ++ 4 files changed, 109 insertions(+), 13 deletions(-) diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index ab934a8c012..333732f42f2 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3623,6 +3623,19 @@ the current recording method. A human readable string with the reason for the gap. @end defvar +Some @value{GDBN} features write auxiliary information into the execution +history. This information is represented by a @code{gdb.RecordAuxiliary} object +in the instruction list. It has the following attributes: + +@defvar RecordAuxiliary.number +An integer identifying this auxiliary. @code{number} corresponds to the numbers +seen in @code{record instruction-history} (@pxref{Process Record and Replay}). +@end defvar + +@defvar RecordAuxiliary.data +A string representation of the auxiliary data. +@end defvar + A @code{gdb.RecordFunctionSegment} object has the following attributes: @defvar RecordFunctionSegment.number diff --git a/gdb/python/py-record-btrace.c b/gdb/python/py-record-btrace.c index 1c10a0598da..128dd14dd81 100644 --- a/gdb/python/py-record-btrace.c +++ b/gdb/python/py-record-btrace.c @@ -55,7 +55,8 @@ struct btpy_list_object { /* Stride size. */ Py_ssize_t step; - /* Either &BTPY_CALL_TYPE or &RECPY_INSN_TYPE. */ + /* Either &recpy_func_type, &recpy_insn_type, &recpy_aux_type or + &recpy_gap_type. */ PyTypeObject* element_type; }; @@ -151,10 +152,11 @@ btrace_func_from_recpy_func (const PyObject * const pyobject) } /* Looks at the recorded item with the number NUMBER and create a - gdb.RecordInstruction or gdb.RecordGap object for it accordingly. */ + gdb.RecordInstruction, gdb.RecordGap or gdb.RecordAuxiliary object + for it accordingly. */ static PyObject * -btpy_insn_or_gap_new (thread_info *tinfo, Py_ssize_t number) +btpy_item_new (thread_info *tinfo, Py_ssize_t number) { btrace_insn_iterator iter; int err_code; @@ -173,6 +175,12 @@ btpy_insn_or_gap_new (thread_info *tinfo, Py_ssize_t number) return recpy_gap_new (err_code, err_string, number); } + const struct btrace_insn *insn = btrace_insn_get (&iter); + + if (insn->iclass == BTRACE_INSN_AUX) + return recpy_aux_new (iter.btinfo->aux_data[insn->aux_data_index].c_str (), + number); + return recpy_insn_new (tinfo, RECORD_METHOD_BTRACE, number); } @@ -456,8 +464,10 @@ btpy_list_length (PyObject *self) } /* Implementation of - BtraceList.__getitem__ (self, key) -> BtraceInstruction and - BtraceList.__getitem__ (self, key) -> BtraceFunctionCall. */ + BtraceList.__getitem__ (self, key) -> BtraceInstruction, + BtraceList.__getitem__ (self, key) -> BtraceFunctionCall, + BtraceList.__getitem__ (self, key) -> BtraceAuxilliary and + BtraceList.__getitem__ (self, key) -> BtraceGap. */ static PyObject * btpy_list_item (PyObject *self, Py_ssize_t index) @@ -471,10 +481,10 @@ btpy_list_item (PyObject *self, Py_ssize_t index) number = obj->first + (obj->step * index); - if (obj->element_type == &recpy_insn_type) - return recpy_insn_new (obj->thread, RECORD_METHOD_BTRACE, number); - else + if (obj->element_type == &recpy_func_type) return recpy_func_new (obj->thread, RECORD_METHOD_BTRACE, number); + else + return btpy_item_new (obj->thread, number); } /* Implementation of BtraceList.__getitem__ (self, slice) -> BtraceList. */ @@ -661,8 +671,7 @@ recpy_bt_replay_position (PyObject *self, void *closure) if (tinfo->btrace.replay == NULL) Py_RETURN_NONE; - return btpy_insn_or_gap_new (tinfo, - btrace_insn_number (tinfo->btrace.replay)); + return btpy_item_new (tinfo, btrace_insn_number (tinfo->btrace.replay)); } /* Implementation of @@ -684,7 +693,7 @@ recpy_bt_begin (PyObject *self, void *closure) Py_RETURN_NONE; btrace_insn_begin (&iterator, &tinfo->btrace); - return btpy_insn_or_gap_new (tinfo, btrace_insn_number (&iterator)); + return btpy_item_new (tinfo, btrace_insn_number (&iterator)); } /* Implementation of @@ -706,7 +715,7 @@ recpy_bt_end (PyObject *self, void *closure) Py_RETURN_NONE; btrace_insn_end (&iterator, &tinfo->btrace); - return btpy_insn_or_gap_new (tinfo, btrace_insn_number (&iterator)); + return btpy_item_new (tinfo, btrace_insn_number (&iterator)); } /* Implementation of diff --git a/gdb/python/py-record.c b/gdb/python/py-record.c index 1747f74d7e6..481cd282ba3 100644 --- a/gdb/python/py-record.c +++ b/gdb/python/py-record.c @@ -49,6 +49,12 @@ static PyTypeObject recpy_gap_type = { PyVarObject_HEAD_INIT (NULL, 0) }; +/* Python RecordAuxiliary type. */ + +PyTypeObject recpy_aux_type = { + PyVarObject_HEAD_INIT (NULL, 0) +}; + /* Python RecordGap object. */ struct recpy_gap_object { @@ -64,6 +70,18 @@ struct recpy_gap_object Py_ssize_t number; }; +/* Python RecordAuxiliary object. */ +typedef struct +{ + PyObject_HEAD + + /* Auxiliary data. */ + const char *data; + + /* Element number. */ + Py_ssize_t number; +} recpy_aux_object; + /* Implementation of record.method. */ static PyObject * @@ -477,6 +495,43 @@ recpy_gap_reason_string (PyObject *self, void *closure) return PyString_FromString (obj->reason_string); } +/* Create a new gdb.Auxiliary object. */ + +PyObject * +recpy_aux_new (const char *data, Py_ssize_t number) +{ + recpy_aux_object * const obj = PyObject_New (recpy_aux_object, + &recpy_aux_type); + + if (obj == NULL) + return NULL; + + obj->data = data; + obj->number = number; + + return (PyObject *) obj; +} + +/* Implementation of Auxiliary.number [int]. */ + +static PyObject * +recpy_aux_number (PyObject *self, void *closure) +{ + const recpy_aux_object * const obj = (const recpy_aux_object *) self; + + return gdb_py_object_from_longest (obj->number).release (); +} + +/* Implementation of Auxiliary.data [str]. */ + +static PyObject * +recpy_aux_data (PyObject *self, void *closure) +{ + const recpy_aux_object * const obj = (const recpy_aux_object *) self; + + return PyString_FromString (obj->data); +} + /* Record method list. */ static PyMethodDef recpy_record_methods[] = { @@ -542,6 +597,14 @@ static gdb_PyGetSetDef recpy_gap_getset[] = { { NULL } }; +/* RecordAuxiliary member list. */ + +static gdb_PyGetSetDef recpy_aux_getset[] = { + { "number", recpy_aux_number, NULL, "element number", NULL}, + { "data", recpy_aux_data, NULL, "data", NULL}, + { NULL } +}; + /* Sets up the record API in the gdb module. */ int @@ -581,10 +644,18 @@ gdbpy_initialize_record (void) recpy_gap_type.tp_doc = "GDB recorded gap object"; recpy_gap_type.tp_getset = recpy_gap_getset; + recpy_aux_type.tp_new = PyType_GenericNew; + recpy_aux_type.tp_flags = Py_TPFLAGS_DEFAULT; + recpy_aux_type.tp_basicsize = sizeof (recpy_aux_object); + recpy_aux_type.tp_name = "gdb.RecordAuxiliary"; + recpy_aux_type.tp_doc = "GDB recorded auxiliary object"; + recpy_aux_type.tp_getset = recpy_aux_getset; + if (PyType_Ready (&recpy_record_type) < 0 || PyType_Ready (&recpy_insn_type) < 0 || PyType_Ready (&recpy_func_type) < 0 - || PyType_Ready (&recpy_gap_type) < 0) + || PyType_Ready (&recpy_gap_type) < 0 + || PyType_Ready (&recpy_aux_type) < 0) return -1; else return 0; diff --git a/gdb/python/py-record.h b/gdb/python/py-record.h index c1df6fde6e8..51dbc0ecafb 100644 --- a/gdb/python/py-record.h +++ b/gdb/python/py-record.h @@ -71,4 +71,7 @@ extern PyObject *recpy_func_new (thread_info *thread, enum record_method method, extern PyObject *recpy_gap_new (int reason_code, const char *reason_string, Py_ssize_t number); +/* Create a new gdb.RecordGap object. */ +extern PyObject *recpy_aux_new (const char *data, Py_ssize_t number); + #endif /* PYTHON_PY_RECORD_H */ -- 2.25.4 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, 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