From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17837 invoked by alias); 30 Mar 2011 11:32:19 -0000 Received: (qmail 17827 invoked by uid 22791); 30 Mar 2011 11:32:16 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_BJ,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-vw0-f41.google.com (HELO mail-vw0-f41.google.com) (209.85.212.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 30 Mar 2011 11:32:09 +0000 Received: by vws4 with SMTP id 4so1159137vws.0 for ; Wed, 30 Mar 2011 04:32:08 -0700 (PDT) Received: by 10.52.92.131 with SMTP id cm3mr1339869vdb.112.1301484728276; Wed, 30 Mar 2011 04:32:08 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.200.3 with HTTP; Wed, 30 Mar 2011 04:31:48 -0700 (PDT) In-Reply-To: References: From: Kevin Pouget Date: Wed, 30 Mar 2011 12:15:00 -0000 Message-ID: Subject: Re: [RFC - Python] New ObjFile event To: pmuldoon@redhat.com Cc: Tom Tromey , gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes 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 X-SW-Source: 2011-03/txt/msg01195.txt.bz2 > Really nice patch! thanks :) > This is the ChangeLog for GDB code, so things in gdb/ and python/ code > related files have ChangeLog entries here. > ... > But the entries below belong in the testsuite/ChangeLog and without the > preceding "testsuite" in the log. > ... > I don't see a documentation entry. =A0Similarly documentation entries are > added in the doc/ChangeLog oh, now it makes sense, I couldn't grep any 'gdb.texinfo' modification in gdb/ChangeLog, which was somehow strange, that's why I didn't write anything about this file; that should be fixed now : =46rom 9e219b36244625880b085f853383a8ed2e6f0759 Mon Sep 17 00:00:00 2001 From: Kevin Pouget Date: Wed, 30 Mar 2011 13:23:19 -0400 Subject: [PATCH] Allow Python notification of new object-file loadings Signed-off-by: Kevin Pouget --- gdb/ChangeLog | 21 +++++++++++ gdb/Makefile.in | 10 ++++- gdb/doc/ChangeLog | 6 +++ gdb/doc/gdb.texinfo | 14 +++++-- gdb/python/py-event.h | 1 + gdb/python/py-events.h | 1 + gdb/python/py-evts.c | 3 ++ gdb/python/py-inferior.c | 27 ++++++++++++++ gdb/python/py-newobjfileevent.c | 53 ++++++++++++++++++++++++= ++++ gdb/python/python-internal.h | 2 + gdb/python/python.c | 6 ++- gdb/testsuite/ChangeLog | 9 +++++ gdb/testsuite/gdb.python/py-events-shlib.c | 20 ++++++++++ gdb/testsuite/gdb.python/py-events.c | 3 ++ gdb/testsuite/gdb.python/py-events.exp | 32 ++++++++++++++--- gdb/testsuite/gdb.python/py-events.py | 20 ++++++++++ 16 files changed, 215 insertions(+), 13 deletions(-) create mode 100644 gdb/python/py-newobjfileevent.c create mode 100644 gdb/testsuite/gdb.python/py-events-shlib.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 03885dd..880781a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2011-03-29 Kevin Pouget + + Allow Python notification of new object-file loadings. + * Makefile.in (SUBDIR_PYTHON_SRCS): Add py-newobjfilevent.c. + (SUBDIR_PYTHON_OBS): Add py-newobjfileevent.o. + Add build rule for this file. + * python/py-event.h (emit_new_objfile_event): New prototype. + (newobjfile): New Python event emitter. + * python/py-evts.c (gdbpy_initialize_py_events): Add newobjfile to + Python event registry. + * python/py-inferior.c: Include objfiles.h + (python_new_objfile): New function. + (gdbpy_initialize_inferior): Add python_new_objfile to the new objfile + observers. + * python/py-newobjfileevent.c: New file. + * python-internal.h (gdbpy_initialize_new_objfile_event): New + prototype. + (gdbpy_current_objfile): New global variable. + * python/python.c (gdbpy_current_objfile): Make global. + (_initialize_python): Add gdbpy_initialize_new_objfile_event call. + 2011-03-28 Jan Kratochvil Support resolution of STT_GNU_IFUNC via breakpoints. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 489b1e9..c15b566 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -296,7 +296,8 @@ SUBDIR_PYTHON_OBS =3D \ py-threadevent.o \ py-type.o \ py-utils.o \ - py-value.o + py-value.o \ + py-newobjfileevent.o SUBDIR_PYTHON_SRCS =3D \ python/python.c \ @@ -326,7 +327,8 @@ SUBDIR_PYTHON_SRCS =3D \ python/py-threadevent.c \ python/py-type.c \ python/py-utils.c \ - python/py-value.c + python/py-value.c \ + python/py-newobjfileevent.c SUBDIR_PYTHON_DEPS =3D SUBDIR_PYTHON_LDFLAGS=3D SUBDIR_PYTHON_CFLAGS=3D @@ -2110,6 +2112,10 @@ py-value.o: $(srcdir)/python/py-value.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-value.c $(POSTCOMPILE) +py-newobjfileevent.o: $(srcdir)/python/py-newobjfileevent.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-newobjfileevent.c + $(POSTCOMPILE) + # # Dependency tracking. Most of this is conditional on GNU Make being # found by configure; if GNU Make is not found, we fall back to a diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 08d6c8c..3ea5068 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-29 Kevin Pouget + * gdb.textinfo (Events In Python): Document `gdb.NewObjFileEvent' + events emitter. + (Objfiles In Python): Indicate that `gdb.current_objfile' is also set + during new object-file callbacks. + 2011-03-28 Tom Tromey * gdb.texinfo (Set Tracepoints): Fix typo. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index a4e976f..360ff51 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -22057,6 +22057,12 @@ Emits @code{gdb.SignalEvent} which extends @code{gdb.StopEvent}. This event indicates that the inferior or one of its threads has received = as signal. @code{gdb.SignalEvent} has the following attributes: +@item events.newobjfile +Emits @code{gdb.NewObjFileEvent} which indicates that a new object-file has +been loaded in the inferior. + +During the callback, ``current objfile'' will be set to the new object fil= e. + @table @code @defivar SignalEvent stop_signal A string representing the signal received by the inferior. A list of poss= ible @@ -22699,10 +22705,10 @@ The following objfile-related functions are available in the @findex gdb.current_objfile @defun current_objfile -When auto-loading a Python script (@pxref{Auto-loading}), @value{GDBN} -sets the ``current objfile'' to the corresponding objfile. This -function returns the current objfile. If there is no current objfile, -this function returns @code{None}. +When auto-loading a Python script (@pxref{Auto-loading}) and during new +object-file callbacks, @value{GDBN} sets the ``current objfile'' to the +corresponding objfile. This function returns the current objfile. If +there is no current objfile, this function returns @code{None}. @end defun @findex gdb.objfiles diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index bc95521..9a3ba82 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -105,6 +105,7 @@ typedef struct extern int emit_continue_event (ptid_t ptid); extern int emit_exited_event (LONGEST exit_code); +extern int emit_new_objfile_event (struct objfile *objfile); extern int evpy_emit_event (PyObject *event, eventregistry_object *registry); diff --git a/gdb/python/py-events.h b/gdb/python/py-events.h index 6d4dae5..9c42e39 100644 --- a/gdb/python/py-events.h +++ b/gdb/python/py-events.h @@ -45,6 +45,7 @@ typedef struct eventregistry_object *stop; eventregistry_object *cont; eventregistry_object *exited; + eventregistry_object *newobjfile; PyObject *module; diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c index 50c05f3..ee60560 100644 --- a/gdb/python/py-evts.c +++ b/gdb/python/py-evts.c @@ -57,6 +57,9 @@ gdbpy_initialize_py_events (void) if (add_new_registry (&gdb_py_events.exited, "exited") < 0) goto fail; + + if (add_new_registry (&gdb_py_events.newobjfile, "newobjfile") < 0) + goto fail; Py_INCREF (gdb_py_events.module); if (PyModule_AddObject (gdb_module, diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index b9df394..ebd2a2a 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -22,6 +22,7 @@ #include "gdbcore.h" #include "gdbthread.h" #include "inferior.h" +#include "objfiles.h" #include "observer.h" #include "python-internal.h" #include "arch-utils.h" @@ -129,6 +130,31 @@ python_inferior_exit (struct inferior *inf) do_cleanups (cleanup); } +/* Callback used to notify Python listeners about new objfiles loaded in t= he + inferior. Python global variable 'gdb.current_objfile ()' will be set + during the notifications. + */ + +static void +python_new_objfile (struct objfile *objfile) +{ + struct cleanup *cleanup; + + /* Will be NULL when clearing the symtab. */ + if (objfile) + cleanup =3D ensure_python_env (get_objfile_arch (objfile), current_lan= guage); + else + cleanup =3D ensure_python_env (get_current_arch (), current_language); + + gdbpy_current_objfile =3D objfile; + + if (emit_new_objfile_event (objfile) < 0) + gdbpy_print_stack (); + + do_cleanups (cleanup); + gdbpy_current_objfile =3D NULL; +} + /* Return a borrowed reference to the Python object of type Inferior representing INFERIOR. If the object has already been created, return it, otherwise, create it. Return NULL on failure. */ @@ -669,6 +695,7 @@ gdbpy_initialize_inferior (void) observer_attach_normal_stop (python_on_normal_stop); observer_attach_target_resumed (python_on_resume); observer_attach_inferior_exit (python_inferior_exit); + observer_attach_new_objfile (python_new_objfile); if (PyType_Ready (&membuf_object_type) < 0) return; diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileeven= t.c new file mode 100644 index 0000000..20e2b31 --- /dev/null +++ b/gdb/python/py-newobjfileevent.c @@ -0,0 +1,53 @@ +/* Python interface to new object file loading events. + + Copyright (C) 2011 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 "py-event.h" + +static PyTypeObject new_objfile_event_object_type; + +PyObject * +create_new_objfile_event_object (void) +{ + return create_event_object (&new_objfile_event_object_type); +} + +/* Callback function which notifies observers when a new objfile event occ= urs. + This function will create a new Python new_objfile event object. + Return -1 if emit fails. */ + +int +emit_new_objfile_event (struct objfile *objfile) +{ + PyObject *event; + + if (evregpy_no_listeners_p (gdb_py_events.newobjfile)) + return 0; + + event =3D create_new_objfile_event_object (); + if (event) + return evpy_emit_event (event, gdb_py_events.newobjfile); + return -1; +} + +GDBPY_NEW_EVENT_TYPE (new_objfile, + "gdb.NewObjFileEvent", + "NewObjFileEvent", + "GDB new object file event object", + event_object_type, + static); diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index d3cb788..cc9108f 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -207,6 +207,7 @@ void gdbpy_initialize_breakpoint_event (void); 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); struct cleanup *make_cleanup_py_decref (PyObject *py); @@ -215,6 +216,7 @@ struct cleanup *ensure_python_env (struct gdbarch *gdba= rch, extern struct gdbarch *python_gdbarch; extern const struct language_defn *python_language; +extern struct objfile *gdbpy_current_objfile; /* Use this after a TRY_EXCEPT to throw the appropriate Python exception. */ diff --git a/gdb/python/python.c b/gdb/python/python.c index 90d5dc8..df883ef 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -811,8 +811,9 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2) /* The "current" objfile. This is set when gdb detects that a new objfile has been loaded. It is only set for the duration of a call to - source_python_script_for_objfile; it is NULL at other times. */ -static struct objfile *gdbpy_current_objfile; + source_python_script_for_objfile and new_objfile callbacks; it is NULL = at + other times. */ +struct objfile *gdbpy_current_objfile; /* Set the current objfile to OBJFILE and then read STREAM,FILE as Python code. */ @@ -1074,6 +1075,7 @@ Enables or disables printing of Python stack traces."= ), gdbpy_initialize_continue_event (); gdbpy_initialize_exited_event (); gdbpy_initialize_thread_event (); + gdbpy_initialize_new_objfile_event () ; PyRun_SimpleString ("import gdb"); PyRun_SimpleString ("gdb.pretty_printers =3D []"); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index fa575d0..bc48a56 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2011-03-29 Kevin Pouget + * testsuite/gdb.python/py-events-shlib.c: New file. + * testsuite/gdb.python/py-events.c (do_nothing): New global. + (main): Add call to shared library. + * testsuite/gdb.python/py-events.exp: Link the execfile to a shared + library and check newobjfile event notification. + * testsuite/gdb.python/py-events.py (new_objfile_handler): New Class. + (test_newobj_events): New class. + 2011-03-28 Jan Kratochvil Test STT_GNU_IFUNC support. diff --git a/gdb/testsuite/gdb.python/py-events-shlib.c b/gdb/testsuite/gdb.python/py-events-shlib.c new file mode 100644 index 0000000..2a17bbf --- /dev/null +++ b/gdb/testsuite/gdb.python/py-events-shlib.c @@ -0,0 +1,20 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 Free Software Foundation, Inc. + + 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 . = */ + + +void do_nothing (void) {} + diff --git a/gdb/testsuite/gdb.python/py-events.c b/gdb/testsuite/gdb.python/py-events.c index ceb697e..1cf7cc7 100644 --- a/gdb/testsuite/gdb.python/py-events.c +++ b/gdb/testsuite/gdb.python/py-events.c @@ -16,6 +16,8 @@ along with this program. If not, see . */ +extern void do_nothing (void) ; + int second(){ return 12; } @@ -25,5 +27,6 @@ int first(){ } int main (){ + do_nothing() ; return first(); } diff --git a/gdb/testsuite/gdb.python/py-events.exp b/gdb/testsuite/gdb.python/py-events.exp index e5d6daf..56e8f86 100644 --- a/gdb/testsuite/gdb.python/py-events.exp +++ b/gdb/testsuite/gdb.python/py-events.exp @@ -24,23 +24,45 @@ if $tracelevel then { load_lib gdb-python.exp +set libfile "py-events-shlib" +set libsrc $srcdir/$subdir/$libfile.c +set lib_sl $objdir/$subdir/$libfile.so +set lib_opts debug + set testfile "py-events" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} +set exec_opts [list debug shlib=3D$lib_sl] set pyfile ${srcdir}/${subdir}/${testfile}.py -if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { +if [get_compiler_info ${binfile}] { + return -1 +} + +if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] !=3D "" + || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] !=3D ""} { + untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile= ." return -1 } +# Start with a fresh gdb. + +gdb_exit +gdb_start + if { [skip_python_tests] } { continue } +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + gdb_test_no_output "python execfile ('${pyfile}')" "" -if ![runto_main ] then { - fail "Can't run to main" - return -1 -} +gdb_test "Test_Newobj_Events" "New ObjectFile Event tester registered." + +gdb_breakpoint "main" {temporary} + +gdb_test "run" ".*event type: new_objfile.* +.*new objfile name.*" gdb_test "Test_Events" "Event testers registered." diff --git a/gdb/testsuite/gdb.python/py-events.py b/gdb/testsuite/gdb.python/py-events.py index 9f05b9f..12e36e8 100644 --- a/gdb/testsuite/gdb.python/py-events.py +++ b/gdb/testsuite/gdb.python/py-events.py @@ -48,6 +48,14 @@ def continue_handler (event): if ( event.inferior_thread is not None) : print "thread num: %s" % (event.inferior_thread.num); +def new_objfile_handler (event): + if (isinstance (event, gdb.NewObjFileEvent)): + print "event type: new_objfile" + if (gdb.current_objfile () is not None): + print "new objfile name: %s" % (gdb.current_objfile ().filename) + else: + print "new objfile is None" + class test_events (gdb.Command): """Test events.""" @@ -62,3 +70,15 @@ class test_events (gdb.Command): print "Event testers registered." test_events () + +class test_newobj_events (gdb.Command): + """NewObj events.""" + + def __init__ (self): + gdb.Command.__init__ (self, "test_newobj_events", gdb.COMMAND_STAC= K) + + def invoke (self, arg, from_tty): + gdb.events.newobjfile.connect (new_objfile_handler) + print "New ObjectFile Event tester registered." + +test_newobj_events () --=20 1.7.4