From d050f7d7f474c7e3ba26902a9cbb185910921a11 Mon Sep 17 00:00:00 2001 From: Tim Wiederhake Date: Tue, 2 May 2017 11:35:54 +0200 Subject: [PATCH] Python: Introduce gdb.Instruction class This adds a generic instruction class to Python and has gdb.RecordInstruction inherit from it. --- gdb/ChangeLog | 13 +++++++ gdb/Makefile.in | 2 ++ gdb/doc/ChangeLog | 5 +++ 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 + 9 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 gdb/python/py-instruction.c create mode 100644 gdb/python/py-instruction.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 041d9ac3ad4..9f24245e373 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2017-05-01 Tim Wiederhake + + * 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. + 2017-05-01 Tim Wiederhake * python/py-record-btrace.c (BTPY_REQUIRE_VALID_CALL, btpy_call_type): diff --git a/gdb/Makefile.in b/gdb/Makefile.in index b865b7c02f6..cc934850901 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/ChangeLog b/gdb/doc/ChangeLog index f916167d438..8afb2e5b443 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2017-05-01 Tim Wiederhake + + * python.texi (Recording in Python): Factor out the documentation of + gdb.RecordInstruction's super class. + 2017-05-01 Tim Wiederhake * python.texi (Recording in Python): Replace gdb.BtraceFunction with diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index da579fc6f30..ee4f7a21d89 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. @code{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 00000000000..a615dcdaee9 --- /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 gdb_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 00000000000..b855fb5e716 --- /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 d308a947691..b7d16a0f41a 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 e84c8d29be7..ebb83f0cba8 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -562,6 +562,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 7e0c507e234..be92f36b6e5 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1626,6 +1626,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.30.2