diff options
author | Tim Wiederhake <tim.wiederhake@intel.com> | 2017-05-02 11:35:54 +0200 |
---|---|---|
committer | Tim Wiederhake <tim.wiederhake@intel.com> | 2017-05-02 11:35:54 +0200 |
commit | d050f7d7f474c7e3ba26902a9cbb185910921a11 (patch) | |
tree | 68ee8305e83ce6d0cfcf17b91454d98693e01ecd /gdb/python | |
parent | 14f819c8c5f7d080e5eea9256f0ec7453aac750e (diff) | |
download | gdb-d050f7d7f474c7e3ba26902a9cbb185910921a11.zip gdb-d050f7d7f474c7e3ba26902a9cbb185910921a11.tar.gz gdb-d050f7d7f474c7e3ba26902a9cbb185910921a11.tar.bz2 |
Python: Introduce gdb.Instruction class
This adds a generic instruction class to Python and has gdb.RecordInstruction
inherit from it.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-instruction.c | 67 | ||||
-rw-r--r-- | gdb/python/py-instruction.h | 30 | ||||
-rw-r--r-- | gdb/python/py-record.c | 2 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 2 | ||||
-rw-r--r-- | gdb/python/python.c | 1 |
5 files changed, 102 insertions, 0 deletions
diff --git a/gdb/python/py-instruction.c b/gdb/python/py-instruction.c new file mode 100644 index 0000000..a615dcd --- /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 <http://www.gnu.org/licenses/>. */ + +#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 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 <http://www.gnu.org/licenses/>. */ + +#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 d308a94..b7d16a0 100644 --- a/gdb/python/py-record.c +++ b/gdb/python/py-record.c @@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #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 e84c8d2..ebb83f0 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 7e0c507..be92f36 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 |