From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7764 invoked by alias); 1 May 2008 13:52:21 -0000 Received: (qmail 7751 invoked by uid 22791); 1 May 2008 13:52:19 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 01 May 2008 13:51:50 +0000 Received: (qmail 13819 invoked from network); 1 May 2008 13:51:48 -0000 Received: from unknown (HELO localhost) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 1 May 2008 13:51:48 -0000 From: Vladimir Prus Date: Thu, 01 May 2008 13:52:00 -0000 Subject: [RFA] Allow to enable run/stop notifications for function calls. To: gdb-patches@sources.redhat.com X-TUID: 3454b2f5ac47b0f7 X-Length: 4770 X-UID: 172 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200805011751.48573.vladimir@codesourcery.com> 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: 2008-05/txt/msg00008.txt.bz2 I've already posted patches to produce more accurate *stopped notifications in MI and introduce *running notification. Those notification are not produced during inferior function calls, as it's very likely than an unprepared frontend will try to refetch everything in response to those *stopped, re-evaluating all expression again, calling functions again, etc. This patch allows a frontend to request the notification for function calls to be still emitted, by using -enable-feature infcall-run-stop-notifications OK? - Volodya * infcall.c (suppress_run_stop_observers_during_infcall): New. (call_function_by_hand): Use suppress_run_stop_observers_during_infcall. * inferior.h (suppress_run_stop_observers_during_infcall): Declare. * mi/mi-cmds.c (mi_cmds): Register "enable-feature". * mi/mi-cmds.h (mi_cmd_enable_feature): Declare. * mi/mi-main.c (mi_cmd_enable_feature): New. (mi_cmd_list_features): Report "infcall-run-stop-notifications". --- gdb/infcall.c | 5 ++++- gdb/inferior.h | 4 ++++ gdb/mi/mi-cmds.c | 1 + gdb/mi/mi-cmds.h | 1 + gdb/mi/mi-main.c | 17 +++++++++++++++++ 5 files changed, 27 insertions(+), 1 deletions(-) diff --git a/gdb/infcall.c b/gdb/infcall.c index 28408ec..95f1292 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -42,6 +42,8 @@ asynchronous inferior function call implementation, and that in turn means restructuring the code so that it is event driven. */ +int suppress_run_stop_observers_during_infcall = 1; + /* How you should pass arguments to a function depends on whether it was defined in K&R style or prototype style. If you define a function using the K&R syntax that takes a `float' argument, then @@ -721,7 +723,8 @@ call_function_by_hand (struct value *function, int nargs, struct value **args) saved_async = target_async_mask (0); old_cleanups2 = make_cleanup_restore_integer - (&suppress_run_stop_observers, 1); + (&suppress_run_stop_observers, + suppress_run_stop_observers_during_infcall); proceed (real_pc, TARGET_SIGNAL_0, 0); do_cleanups (old_cleanups2); diff --git a/gdb/inferior.h b/gdb/inferior.h index 8958aef..9215426 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -402,6 +402,10 @@ void displaced_step_dump_bytes (struct ui_file *file, /* When set, normal_stop will not call the normal_stop observer. */ extern int suppress_run_stop_observers; + +/* Controls if infrun.c should suppress run and stop observers when doing + inferior function call. */ +extern int suppress_run_stop_observers_during_infcall; /* Possible values for gdbarch_call_dummy_location. */ #define ON_STACK 1 diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index e94648b..082c584 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -51,6 +51,7 @@ struct mi_cmd mi_cmds[] = { "data-read-memory", { NULL, 0 }, mi_cmd_data_read_memory}, { "data-write-memory", { NULL, 0 }, mi_cmd_data_write_memory}, { "data-write-register-values", { NULL, 0 }, mi_cmd_data_write_register_values}, + { "enable-feature", { NULL, 0 }, mi_cmd_enable_feature}, { "enable-timings", { NULL, 0 }, mi_cmd_enable_timings}, { "environment-cd", { NULL, 0 }, mi_cmd_env_cd}, { "environment-directory", { NULL, 0 }, mi_cmd_env_dir}, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 087b5e4..8b0bb11 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -62,6 +62,7 @@ extern mi_cmd_argv_ftype mi_cmd_data_list_changed_registers; extern mi_cmd_argv_ftype mi_cmd_data_read_memory; extern mi_cmd_argv_ftype mi_cmd_data_write_memory; extern mi_cmd_argv_ftype mi_cmd_data_write_register_values; +extern mi_cmd_argv_ftype mi_cmd_enable_feature; extern mi_cmd_argv_ftype mi_cmd_enable_timings; extern mi_cmd_argv_ftype mi_cmd_env_cd; extern mi_cmd_argv_ftype mi_cmd_env_dir; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 206b2c9..5281c7f 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -977,6 +977,22 @@ mi_cmd_data_write_memory (char *command, char **argv, int argc) } enum mi_cmd_result +mi_cmd_enable_feature (char *command, char **argv, int argc) +{ + if (argc != 1) + error ("Usage: "); + + if (strcmp (argv[0], "infcall-run-stop-notification") == 0) + { + suppress_run_stop_observers_during_infcall = 0; + } + else + error ("Unknown feature name"); + + return MI_CMD_DONE; +} + +enum mi_cmd_result mi_cmd_enable_timings (char *command, char **argv, int argc) { if (argc == 0) @@ -1011,6 +1027,7 @@ mi_cmd_list_features (char *command, char **argv, int argc) ui_out_field_string (uiout, NULL, "frozen-varobjs"); ui_out_field_string (uiout, NULL, "pending-breakpoints"); ui_out_field_string (uiout, NULL, "thread-info"); + ui_out_field_string (uiout, NULL, "infcall-run-stop-notification"); do_cleanups (cleanup); -- 1.5.3.5