Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Siva Chandra <sivachandra@google.com>
To: gdb-patches@sourceware.org
Subject: [RFC - GDB Python API] New gdb.Architecture class
Date: Mon, 21 Jan 2013 14:08:00 -0000	[thread overview]
Message-ID: <CAGyQ6gwAU-Qj-jkhj7gA7rG=xQOcZbp=g4Km8A3b6bLfsCWMqg@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1023 bytes --]

Per suggestion here,
http://sourceware.org/ml/gdb-patches/2013-01/msg00296.html, the
attached patch adds a new class 'gdb.Architecture' with a single
method 'name'. I will add tests and docs after we are OK with the code
changes.

ChangeLog:

2013-01-21  Siva Chandra Reddy  <sivachandra@google.com>

        Add a new class gdb.Architecture which exposes GDB's
        internal representation of architecture via GDB Python API.

        * Makefile.in: Add entries corresponding to the new file
        python/py-arch.c.
        * python/py-arch.c: Implement gdb.Architecture class.
        * python/py-frame.c (frapy_arch): Implement the method
        gdb.Frame.architecture().
        (frame_object_methods): Add 'architecture' to the method table.
        * python/python-internal.h: Add declarations of new utility
        functions.
        * python/python.c (_initialize_python): Initialize
        gdb.Architecture class.
        (GdbMethods): Add 'current_architecture' to the method table.

Thanks,
Siva Chandra

[-- Attachment #2: gdb_arch_patch_v1.txt --]
[-- Type: text/plain, Size: 10483 bytes --]

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 7305e6d..956963e 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -271,6 +271,7 @@ SUBDIR_TUI_CFLAGS= \
 #
 SUBDIR_PYTHON_OBS = \
 	python.o \
+	py-arch.o \
 	py-auto-load.o \
 	py-block.o \
 	py-bpevent.o \
@@ -304,6 +305,7 @@ SUBDIR_PYTHON_OBS = \
 
 SUBDIR_PYTHON_SRCS = \
 	python/python.c \
+	python/py-arch.c \
 	python/py-auto-load.c \
 	python/py-block.c \
 	python/py-bpevent.c \
@@ -2045,6 +2047,10 @@ python.o: $(srcdir)/python/python.c
 	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python.c
 	$(POSTCOMPILE)
 
+py-arch.o: $(srcdir)/python/py-arch.c
+	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-arch.c
+	$(POSTCOMPILE)
+
 py-auto-load.o: $(srcdir)/python/py-auto-load.c
 	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-auto-load.c
 	$(POSTCOMPILE)
diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c
new file mode 100644
index 0000000..94f89f8
--- /dev/null
+++ b/gdb/python/py-arch.c
@@ -0,0 +1,137 @@
+/* Python interface to architecture
+
+   Copyright (C) 2013 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 "gdbarch.h"
+#include "arch-utils.h"
+#include "python-internal.h"
+
+typedef struct {
+  PyObject_HEAD
+  struct gdbarch *gdbarch;
+} arch_object;
+
+/* Returns the struct gdbarch value corresponding to the given Python
+   architecture object OBJ.  */
+
+struct gdbarch *
+arch_object_to_gdbarch (PyObject *obj)
+{
+  arch_object *py_arch = (arch_object *) obj;
+  return py_arch->gdbarch;
+}
+
+/* Returns the Python architecture object corresponding to GDBARCH.  */
+
+PyObject *
+gdbarch_to_arch_object (struct gdbarch *gdbarch)
+{
+  arch_object *obj = PyObject_New (arch_object, &arch_object_type);
+  if (obj == NULL)
+    {
+      PyErr_SetString (PyExc_MemoryError,
+                       _("Could not allocate architectire object"));
+      return NULL;
+    }
+
+  obj->gdbarch = gdbarch;
+  return (PyObject *) obj;
+}
+
+/* Implementation of gdb.Architecture.name (self) -> String.
+   Returns the name of the architecture as a string value.  */
+
+static PyObject *
+archpy_name (PyObject *self, PyObject *args) {
+  struct gdbarch *gdbarch = arch_object_to_gdbarch (self);
+  const char *name = (gdbarch_bfd_arch_info (gdbarch))->printable_name;
+  PyObject *py_name = Py_BuildValue ("s", name);
+
+  return py_name;
+}
+
+/* Implementation of gdb.current_arch () -> gdb.Architecture.
+   Returns the current architecture as a gdb.Architecture object.  */
+
+PyObject *
+gdbpy_current_arch (PyObject *self, PyObject *args) {
+  struct gdbarch *curr_arch = get_current_arch ();
+  return gdbarch_to_arch_object (curr_arch);
+}
+
+/* Initializes the Architecture class in the gdb module.  */
+
+void
+gdbpy_initialize_arch (void)
+{
+  arch_object_type.tp_new = PyType_GenericNew;
+  if (PyType_Ready (&arch_object_type) < 0)
+    return;
+
+  Py_INCREF (&arch_object_type);
+  PyModule_AddObject (gdb_module, "Architecture",
+                      (PyObject *) &arch_object_type);
+}
+
+static PyMethodDef arch_object_methods [] = {
+  { "name", archpy_name, METH_NOARGS,
+    "name () -> String.\n\
+Return the name of the architecture as a string value." },
+  {NULL}  /* Sentinel */
+};
+
+PyTypeObject arch_object_type = {
+  PyVarObject_HEAD_INIT (NULL, 0)
+  "gdb.Architecture",                 /* tp_name */
+  sizeof (arch_object),               /* tp_basicsize */
+  0,                                  /* tp_itemsize */
+  0,                                  /* tp_dealloc */
+  0,                                  /* tp_print */
+  0,                                  /* tp_getattr */
+  0,                                  /* tp_setattr */
+  0,                                  /* tp_compare */
+  0,                                  /* tp_repr */
+  0,                                  /* tp_as_number */
+  0,                                  /* tp_as_sequence */
+  0,                                  /* tp_as_mapping */
+  0,                                  /* tp_hash  */
+  0,                                  /* tp_call */
+  0,                                  /* tp_str */
+  0,                                  /* tp_getattro */
+  0,                                  /* tp_setattro */
+  0,                                  /* tp_as_buffer */
+  Py_TPFLAGS_DEFAULT,                 /* tp_flags */
+  "GDB architecture object",          /* tp_doc */
+  0,                                  /* tp_traverse */
+  0,                                  /* tp_clear */
+  0,                                  /* tp_richcompare */
+  0,                                  /* tp_weaklistoffset */
+  0,                                  /* tp_iter */
+  0,                                  /* tp_iternext */
+  arch_object_methods,                /* tp_methods */
+  0,                                  /* tp_members */
+  0,                                  /* tp_getset */
+  0,                                  /* tp_base */
+  0,                                  /* tp_dict */
+  0,                                  /* tp_descr_get */
+  0,                                  /* tp_descr_set */
+  0,                                  /* tp_dictoffset */
+  0,                                  /* tp_init */
+  0,                                  /* tp_alloc */
+};
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 4b025db..b409e3d 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -167,6 +167,26 @@ frapy_type (PyObject *self, PyObject *args)
   return PyInt_FromLong (type);
 }
 
+/* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
+   Returns the frame's architecture as a gdb.Architecture object.  */
+
+static PyObject *
+frapy_arch (PyObject *self, PyObject *args)
+{
+  struct frame_info *frame = NULL;    /* Initialize to appease gcc warning.  */
+  frame_object *obj = (frame_object *) self;
+  volatile struct gdb_exception except;
+  enum unwind_stop_reason stop_reason;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      FRAPY_REQUIRE_VALID (self, frame);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
+  return gdbarch_to_arch_object (obj->gdbarch);
+}
+
 /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
    Returns one of the gdb.FRAME_UNWIND_* constants.  */
 
@@ -632,6 +652,9 @@ Return the function name of the frame, or None if it can't be determined." },
   { "type", frapy_type, METH_NOARGS,
     "type () -> Integer.\n\
 Return the type of the frame." },
+  { "architecture", frapy_arch, METH_NOARGS,
+    "architecture () -> gdb.Architecture.\n\
+Return the architecture of the frame." },
   { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS,
     "unwind_stop_reason () -> Integer.\n\
 Return the reason why it's not possible to find frames older than this." },
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 7d52c06..22ffa6a 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -154,6 +154,7 @@ extern PyTypeObject events_object_type;
 extern PyTypeObject stop_event_object_type;
 extern PyTypeObject breakpoint_object_type;
 extern PyTypeObject frame_object_type;
+extern PyTypeObject arch_object_type;
 
 typedef struct breakpoint_object
 {
@@ -231,6 +232,7 @@ PyObject *gdbpy_selected_inferior (PyObject *self, PyObject *args);
 PyObject *gdbpy_string_to_argv (PyObject *self, PyObject *args);
 PyObject *gdbpy_parameter (PyObject *self, PyObject *args);
 PyObject *gdbpy_parameter_value (enum var_types type, void *var);
+PyObject *gdbpy_current_arch (PyObject *self, PyObject *args);
 char *gdbpy_parse_command_name (const char *name,
 				struct cmd_list_element ***base_list,
 				struct cmd_list_element **start_list);
@@ -250,6 +252,8 @@ PyObject *pspy_get_printers (PyObject *, void *);
 PyObject *objfile_to_objfile_object (struct objfile *);
 PyObject *objfpy_get_printers (PyObject *, void *);
 
+PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch);
+
 thread_object *create_thread_object (struct thread_info *tp);
 thread_object *find_thread_object (ptid_t ptid);
 PyObject *find_inferior_object (int pid);
@@ -263,6 +267,7 @@ struct type *type_object_to_type (PyObject *obj);
 struct symtab *symtab_object_to_symtab (PyObject *obj);
 struct symtab_and_line *sal_object_to_symtab_and_line (PyObject *obj);
 struct frame_info *frame_object_to_frame_info (PyObject *frame_obj);
+struct gdbarch *arch_object_to_gdbarch (PyObject *obj);
 
 void gdbpy_initialize_gdb_readline (void);
 void gdbpy_initialize_auto_load (void);
@@ -293,6 +298,7 @@ void gdbpy_initialize_continue_event (void);
 void gdbpy_initialize_exited_event (void);
 void gdbpy_initialize_thread_event (void);
 void gdbpy_initialize_new_objfile_event (void);
+void gdbpy_initialize_arch (void);
 
 struct cleanup *make_cleanup_py_decref (PyObject *py);
 
diff --git a/gdb/python/python.c b/gdb/python/python.c
index b0f71a2..4f50cf8 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -1620,6 +1620,7 @@ message == an error message without a stack will be printed."),
   gdbpy_initialize_exited_event ();
   gdbpy_initialize_thread_event ();
   gdbpy_initialize_new_objfile_event () ;
+  gdbpy_initialize_arch ();
 
   observer_attach_before_prompt (before_prompt_hook);
 
@@ -1822,6 +1823,9 @@ Return the selected thread object." },
   { "selected_inferior", gdbpy_selected_inferior, METH_NOARGS,
     "selected_inferior () -> gdb.Inferior.\n\
 Return the selected inferior object." },
+  { "current_architecture", gdbpy_current_arch, METH_NOARGS,
+    "current_architecture () -> gdb.Architecture.\n\
+Return the current architecture object." },
   { "inferiors", gdbpy_inferiors, METH_NOARGS,
     "inferiors () -> (gdb.Inferior, ...).\n\
 Return a tuple containing all inferiors." },

             reply	other threads:[~2013-01-21 14:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-21 14:08 Siva Chandra [this message]
2013-01-21 17:09 ` Tom Tromey
2013-01-22 20:40   ` Siva Chandra
2013-01-22 21:17     ` Tom Tromey
2013-01-23 13:53       ` Siva Chandra
2013-01-23 15:35         ` Tom Tromey
2013-01-23 15:59         ` Eli Zaretskii
2013-01-23 21:01           ` Siva Chandra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAGyQ6gwAU-Qj-jkhj7gA7rG=xQOcZbp=g4Km8A3b6bLfsCWMqg@mail.gmail.com' \
    --to=sivachandra@google.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox