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 . */ + +#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." },