From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 73333 invoked by alias); 21 Apr 2017 10:50:11 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 73101 invoked by uid 89); 21 Apr 2017 10:50:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=classes, 4537 X-HELO: mga06.intel.com Received: from mga06.intel.com (HELO mga06.intel.com) (134.134.136.31) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 21 Apr 2017 10:50:07 +0000 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP; 21 Apr 2017 03:50:08 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga004.fm.intel.com with ESMTP; 21 Apr 2017 03:50:06 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id v3LAo6UF023799; Fri, 21 Apr 2017 11:50:06 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id v3LAo5XT026685; Fri, 21 Apr 2017 12:50:05 +0200 Received: (from twiederh@localhost) by ulvlx001.iul.intel.com with œ id v3LAo5pI026681; Fri, 21 Apr 2017 12:50:05 +0200 From: Tim Wiederhake To: gdb-patches@sourceware.org Cc: markus.t.metzger@intel.com, brobecker@adacore.com, qiyaoltc@gmail.com Subject: [PATCH v2 8/8] Python: Introduce gdb.Instruction class Date: Fri, 21 Apr 2017 10:50:00 -0000 Message-Id: <1492771786-26372-9-git-send-email-tim.wiederhake@intel.com> In-Reply-To: <1492771786-26372-1-git-send-email-tim.wiederhake@intel.com> References: <1492771786-26372-1-git-send-email-tim.wiederhake@intel.com> X-IsSubscribed: yes X-SW-Source: 2017-04/txt/msg00600.txt.bz2 This adds a generic instruction class to Python and has gdb.RecordInstruction inherit from it. 2017-04-21 Tim Wiederhake gdb/ChangeLog: * Makefile.in (SUBDIR_PYTHON_OBS): Add py-instruction.o. (SUBDIR_PYTHON_SRCS): Add py-instruction.c. * python/py-instruction.c, python/py-instruction.h: New file. * python/py-record.c: Add py-instruction.h include. (gdbpy_initialize_record): Make gdb.Instruction a super class of gdb.RecordInstruction. * python/python-internal.h: Add gdbpy_initialize_instruction declaration. * python/python.c (do_start_initialization): Add gdbpy_initialize_instruction. gdb/doc/ChangeLog: * python.texi (Recording in Python): Factor out the documentation of gdb.RecordInstruction's super class. --- gdb/Makefile.in | 2 ++ gdb/doc/python.texi | 40 +++++++++++++------------- gdb/python/py-instruction.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ gdb/python/py-instruction.h | 30 ++++++++++++++++++++ gdb/python/py-record.c | 2 ++ gdb/python/python-internal.h | 2 ++ gdb/python/python.c | 1 + 7 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 gdb/python/py-instruction.c create mode 100644 gdb/python/py-instruction.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 479d273..7af63a8 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -453,6 +453,7 @@ SUBDIR_PYTHON_OBS = \ py-inferior.o \ py-infevents.o \ py-infthread.o \ + py-instruction.o \ py-lazy-string.o \ py-linetable.o \ py-newobjfileevent.o \ @@ -496,6 +497,7 @@ SUBDIR_PYTHON_SRCS = \ python/py-inferior.c \ python/py-infevents.c \ python/py-infthread.c \ + python/py-instruction.c \ python/py-lazy-string.c \ python/py-linetable.c \ python/py-newobjfileevent.c \ diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 1231521..d4f93ce 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3149,40 +3149,42 @@ A @code{gdb.Record} object has the following methods: Move the replay position to the given @var{instruction}. @end defun -A @code{gdb.RecordInstruction} object has the following attributes: +The common @code{gdb.Instruction} class that recording method specific +instruction objects inherit from, has the following attributes: -@defvar RecordInstruction.number -An integer identifying this instruction. @var{number} corresponds to -the numbers seen in @code{record instruction-history} -(@pxref{Process Record and Replay}). -@end defvar - -@defvar RecordInstruction.sal -A @code{gdb.Symtab_and_line} object representing the associated symtab -and line of this instruction. May be @code{None} if no debug information is -available. -@end defvar - -@defvar RecordInstruction.pc +@defvar Instruction.pc An integer representing this instruction's address. @end defvar -@defvar RecordInstruction.data +@defvar Instruction.data A buffer with the raw instruction data. In Python 3, the return value is a @code{memoryview} object. @end defvar -@defvar RecordInstruction.decoded +@defvar Instruction.decoded A human readable string with the disassembled instruction. @end defvar -@defvar RecordInstruction.size +@defvar Instruction.size The size of the instruction in bytes. @end defvar +Additionally @code{gdb.RecordInstruction} has the following attributes: + +@defvar RecordInstruction.number +An integer identifying this instruction. @var{number} corresponds to +the numbers seen in @code{record instruction-history} +(@pxref{Process Record and Replay}). +@end defvar + +@defvar RecordInstruction.sal +A @code{gdb.Symtab_and_line} object representing the associated symtab +and line of this instruction. May be @code{None} if no debug information is +available. +@end defvar + @defvar RecordInstruction.is_speculative -A boolean indicating whether the instruction was executed -speculatively. +A boolean indicating whether the instruction was executed speculatively. @end defvar If an error occured during recording or decoding a recording, this error is diff --git a/gdb/python/py-instruction.c b/gdb/python/py-instruction.c new file mode 100644 index 0000000..da0a3c5 --- /dev/null +++ b/gdb/python/py-instruction.c @@ -0,0 +1,67 @@ +/* Python interface to instruction objects. + + Copyright 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "py-instruction.h" + +/* See py-instruction.h. */ + +PyTypeObject py_insn_type = { + PyVarObject_HEAD_INIT (NULL, 0) +}; + +/* Python instruction object. */ + +typedef struct { + PyObject_HEAD +} py_insn_obj; + +/* Getter function for gdb.Instruction attributes. */ + +static PyObject * +py_insn_getter (PyObject *self, void *closure) +{ + return PyErr_Format (PyExc_NotImplementedError, _("Not implemented.")); +} + +/* Instruction members. */ + +static PyGetSetDef py_insn_getset[] = +{ + { "pc", py_insn_getter, NULL, "instruction address", NULL}, + { "data", py_insn_getter, NULL, "instruction memory", NULL}, + { "decoded", py_insn_getter, NULL, "decoded instruction", NULL}, + { "size", py_insn_getter, NULL, "instruction size in bytes", NULL}, + {NULL} +}; + +/* Sets up the gdb.Instruction type. */ + +int +gdbpy_initialize_instruction (void) +{ + py_insn_type.tp_new = PyType_GenericNew; + py_insn_type.tp_flags = Py_TPFLAGS_DEFAULT; + py_insn_type.tp_basicsize = sizeof (py_insn_obj); + py_insn_type.tp_name = "gdb.Instruction"; + py_insn_type.tp_doc = "GDB instruction object"; + py_insn_type.tp_getset = py_insn_getset; + + return PyType_Ready (&py_insn_type); +} diff --git a/gdb/python/py-instruction.h b/gdb/python/py-instruction.h new file mode 100644 index 0000000..b855fb5 --- /dev/null +++ b/gdb/python/py-instruction.h @@ -0,0 +1,30 @@ +/* Python interface to instruction objects. + + Copyright 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GDB_PY_INSTRUCTION_H +#define GDB_PY_INSTRUCTION_H + +#include "python-internal.h" + +/* Python type object for the abstract gdb.Instruction class. This class + contains getters for four elements: "pc" (int), "data" (buffer), "decode" + (str) and "size" (int) that must be overriden by sub classes. */ +extern PyTypeObject py_insn_type; + +#endif /* GDB_PY_INSTRUCTION_H */ diff --git a/gdb/python/py-record.c b/gdb/python/py-record.c index bd74e43..c83a3e8 100644 --- a/gdb/python/py-record.c +++ b/gdb/python/py-record.c @@ -18,6 +18,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "py-instruction.h" #include "py-record.h" #include "py-record-btrace.h" #include "py-record-full.h" @@ -561,6 +562,7 @@ gdbpy_initialize_record (void) recpy_insn_type.tp_getset = recpy_insn_getset; recpy_insn_type.tp_richcompare = recpy_element_richcompare; recpy_insn_type.tp_hash = recpy_element_hash; + recpy_insn_type.tp_base = &py_insn_type; recpy_func_type.tp_new = PyType_GenericNew; recpy_func_type.tp_flags = Py_TPFLAGS_DEFAULT; diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 4dd413d..376d70c 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -441,6 +441,8 @@ int gdbpy_initialize_values (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_frames (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; +int gdbpy_initialize_instruction (void) + CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_btrace (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_record (void) diff --git a/gdb/python/python.c b/gdb/python/python.c index a7aff53..1de7c3d 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1633,6 +1633,7 @@ do_start_initialization () || gdbpy_initialize_values () < 0 || gdbpy_initialize_frames () < 0 || gdbpy_initialize_commands () < 0 + || gdbpy_initialize_instruction () < 0 || gdbpy_initialize_record () < 0 || gdbpy_initialize_btrace () < 0 || gdbpy_initialize_symbols () < 0 -- 2.7.4