From 721c02def4f29758e8e63baf1276719e1b56d988 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Thu, 24 Apr 2008 12:09:49 +0000 Subject: [PATCH] * mi/mi-main.c (last_async_command): Rename to current_token. (previous_async_command): Remove. (mi_cmd_gdb_exit): Adjust. (mi_cmd_exec_interrupt): Don't dance with previous_async_command. (mi_cmd_target_select): Adjust. (mi_cmd_execute): Don't set previous_async_command. Free token here even in async mode. (mi_execute_async_cli_command): Adjust. (mi_exec_async_cli_cmd_continuation): Adjust. Do not free the token. (mi_load_progress): Adjust. --- gdb/ChangeLog | 14 +++++ gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 11 ++-- gdb/mi/mi-main.c | 74 +++++++------------------- gdb/testsuite/ChangeLog | 6 +++ gdb/testsuite/gdb.mi/mi-syn-frame.exp | 4 +- gdb/testsuite/gdb.mi/mi2-syn-frame.exp | 4 +- gdb/testsuite/lib/mi-support.exp | 8 +-- 8 files changed, 58 insertions(+), 68 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 936f9d17f9..cb717d661b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2008-04-24 Vladimir Prus + + * mi/mi-main.c (last_async_command): Rename to current_token. + (previous_async_command): Remove. + (mi_cmd_gdb_exit): Adjust. + (mi_cmd_exec_interrupt): Don't dance with previous_async_command. + (mi_cmd_target_select): Adjust. + (mi_cmd_execute): Don't set previous_async_command. Free token + here even in async mode. + (mi_execute_async_cli_command): Adjust. + (mi_exec_async_cli_cmd_continuation): Adjust. Do not free the + token. + (mi_load_progress): Adjust. + 2008-04-24 Vladimir Prus * infcmd.c (step_1_continuation): Always disable longjmp diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index fa94e40c9d..9cdf5d9809 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2008-04-24 Vladimir Prus + + * doc/gdb.texinfo (GDB/MI Output Syntax): Clarify that async + output does not necessary include any tokens. + 2008-04-22 Corinna Vinschen * gdb.texinfo (Set SH Calling convention): New @item. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index e422d44b53..46d5904ad7 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -17914,10 +17914,13 @@ Notes: All output sequences end in a single line containing a period. @item -The @code{@var{token}} is from the corresponding request. If an execution -command is interrupted by the @samp{-exec-interrupt} command, the -@var{token} associated with the @samp{*stopped} message is the one of the -original execution command, not the one of the interrupt command. +The @code{@var{token}} is from the corresponding request. Note that +for all async output, while the token is allowed by the grammar and +may be output by future versions of @value{GDBN} for select async +output messages, it is generally omitted. Frontends should treat +all async output as reporting general changes in the state of the +target and there should be no need to associate async output to any +prior command. @item @cindex status output in @sc{gdb/mi} diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 76e12f30ea..dc5e0faf97 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -93,9 +93,7 @@ static struct mi_timestamp *current_command_ts; static int do_timings = 0; -/* The token of the last asynchronous command. */ -static char *last_async_command; -static char *previous_async_command; +static char *current_token; extern void _initialize_mi_main (void); static enum mi_cmd_result mi_cmd_execute (struct mi_parse *parse); @@ -124,8 +122,8 @@ enum mi_cmd_result mi_cmd_gdb_exit (char *command, char **argv, int argc) { /* We have to print everything right here because we never return. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("^exit\n", raw_stdout); mi_out_put (uiout, raw_stdout); /* FIXME: The function called is not yet a formal libgdb function. */ @@ -222,14 +220,9 @@ mi_cmd_exec_interrupt (char *args, int from_tty) error ("mi_cmd_exec_interrupt: Inferior not executing."); interrupt_target_command (args, from_tty); - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("^done", raw_stdout); - xfree (last_async_command); - if (previous_async_command) - last_async_command = xstrdup (previous_async_command); - xfree (previous_async_command); - previous_async_command = NULL; mi_out_put (uiout, raw_stdout); mi_out_rewind (uiout); fputs_unfiltered ("\n", raw_stdout); @@ -679,8 +672,8 @@ mi_cmd_target_select (char *args, int from_tty) do_cleanups (old_cleanups); /* Issue the completion message here. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("^connected", raw_stdout); mi_out_put (uiout, raw_stdout); mi_out_rewind (uiout); @@ -1191,25 +1184,8 @@ mi_cmd_execute (struct mi_parse *parse) if (parse->cmd->argv_func != NULL || parse->cmd->args_func != NULL) { - /* FIXME: We need to save the token because the command executed - may be asynchronous and need to print the token again. - In the future we can pass the token down to the func - and get rid of the last_async_command. */ - /* The problem here is to keep the token around when we launch - the target, and we want to interrupt it later on. The - interrupt command will have its own token, but when the - target stops, we must display the token corresponding to the - last execution command given. So we have another string where - we copy the token (previous_async_command), if this was - indeed the token of an execution command, and when we stop we - print that one. This is possible because the interrupt - command, when over, will copy that token back into the - default token string (last_async_command). */ - if (target_executing) { - if (!previous_async_command) - previous_async_command = xstrdup (last_async_command); if (strcmp (parse->command, "exec-interrupt")) { struct ui_file *stb; @@ -1223,19 +1199,14 @@ mi_cmd_execute (struct mi_parse *parse) error_stream (stb); } } - last_async_command = xstrdup (parse->token); - cleanup = make_cleanup (free_current_contents, &last_async_command); + current_token = xstrdup (parse->token); + cleanup = make_cleanup (free_current_contents, ¤t_token); /* FIXME: DELETE THIS! */ if (parse->cmd->args_func != NULL) r = parse->cmd->args_func (parse->args, 0 /*from_tty */ ); else r = parse->cmd->argv_func (parse->command, parse->argv, parse->argc); - if (target_can_async_p () && target_executing) - /* last_async_command will be freed by continuation that - all execution command set. */ - discard_cleanups (cleanup); - else - do_cleanups (cleanup); + do_cleanups (cleanup); return r; } else if (parse->cmd->cli.cmd != 0) @@ -1309,8 +1280,8 @@ mi_execute_async_cli_command (char *mi, char *args, int from_tty) /* NOTE: For synchronous targets asynchronous behavour is faked by printing out the GDB prompt before we even try to execute the command. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("^running\n", raw_stdout); fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); @@ -1321,8 +1292,8 @@ mi_execute_async_cli_command (char *mi, char *args, int from_tty) calling execute_command is wrong. It should only be printed once gdb has confirmed that it really has managed to send a run command to the target. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("^running\n", raw_stdout); /* Ideally, we should be intalling continuation only when @@ -1348,8 +1319,6 @@ mi_execute_async_cli_command (char *mi, char *args, int from_tty) do_cleanups (old_cleanups); /* If the target was doing the operation synchronously we fake the stopped message. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); fputs_unfiltered ("*stopped", raw_stdout); mi_out_put (uiout, raw_stdout); mi_out_rewind (uiout); @@ -1365,18 +1334,11 @@ void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg, int error_p) { /* Assume 'error' means that target is stopped, too. */ - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); fputs_unfiltered ("*stopped", raw_stdout); mi_out_put (uiout, raw_stdout); fputs_unfiltered ("\n", raw_stdout); fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); - if (last_async_command) - { - free (last_async_command); - last_async_command = NULL; - } } void @@ -1428,8 +1390,8 @@ mi_load_progress (const char *section_name, xfree (previous_sect_name); previous_sect_name = xstrdup (section_name); - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("+download", raw_stdout); cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "section", section_name); @@ -1447,8 +1409,8 @@ mi_load_progress (const char *section_name, struct cleanup *cleanup_tuple; last_update.tv_sec = time_now.tv_sec; last_update.tv_usec = time_now.tv_usec; - if (last_async_command) - fputs_unfiltered (last_async_command, raw_stdout); + if (current_token) + fputs_unfiltered (current_token, raw_stdout); fputs_unfiltered ("+download", raw_stdout); cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "section", section_name); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index eb5023869e..1942198d53 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-04-24 Vladimir Prus + + * gdb.mi/mi-syn-frame.exp: Adjust for token disappearance. + * gdb.mi/mi2-syn-frame.exp: Likewise. + * lib/mi-support.exp: Likewise. + 2008-04-24 Vladimir Prus * lib/gdb.exp (gdb_continue_to_breakpoint): Allow the caller diff --git a/gdb/testsuite/gdb.mi/mi-syn-frame.exp b/gdb/testsuite/gdb.mi/mi-syn-frame.exp index 7b993f40da..2f2ca02671 100644 --- a/gdb/testsuite/gdb.mi/mi-syn-frame.exp +++ b/gdb/testsuite/gdb.mi/mi-syn-frame.exp @@ -60,7 +60,7 @@ mi_gdb_test "403-exec-continue" \ # Presently, the *stopped notification for this case does not include # any information. This can be considered a bug. -mi_gdb_test "" "403\\*stopped" "finished exec continue" +mi_gdb_test "" "\\*stopped" "finished exec continue" mi_gdb_test "404-stack-list-frames 0 0" \ "404\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"main\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\"\}.*\\\]" \ @@ -88,7 +88,7 @@ mi_gdb_test "407-stack-list-frames" \ mi_gdb_test "408-exec-continue" "408\\^running" -mi_gdb_test "" "408\\*stopped.*" "finished exec continue" +mi_gdb_test "" ".*\\*stopped.*" "finished exec continue" mi_gdb_test "409-stack-list-frames 0 0" \ "409\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"main\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\"\}.*\\\]" \ diff --git a/gdb/testsuite/gdb.mi/mi2-syn-frame.exp b/gdb/testsuite/gdb.mi/mi2-syn-frame.exp index 1e814026e0..c4474047b5 100644 --- a/gdb/testsuite/gdb.mi/mi2-syn-frame.exp +++ b/gdb/testsuite/gdb.mi/mi2-syn-frame.exp @@ -58,7 +58,7 @@ mi_gdb_test "402-stack-list-frames" "402\\^done,stack=\\\[frame=\{level=\"0\",ad send_gdb "403-exec-continue\n" gdb_expect { - -re "403\\^running\[\r\n\]+${my_mi_gdb_prompt}403\\\*stopped\[\r\n\]+${my_mi_gdb_prompt}$" { + -re "403\\^running\[\r\n\]+${my_mi_gdb_prompt}.*\\\*stopped\[\r\n\]+${my_mi_gdb_prompt}$" { pass "403-exec-continue" } timeout { @@ -92,7 +92,7 @@ mi_gdb_test "407-stack-list-frames" \ send_gdb "408-exec-continue\n" gdb_expect { - -re "408\\^running\[\r\n\]+${my_mi_gdb_prompt}408\\\*stopped\[\r\n\]+${my_mi_gdb_prompt}$" { + -re "408\\^running\[\r\n\]+${my_mi_gdb_prompt}.*\\\*stopped\[\r\n\]+${my_mi_gdb_prompt}$" { pass "408-exec-continue" } timeout { diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index 2fd6b6c83a..1f4c3dddbb 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -947,7 +947,7 @@ proc mi_expect_stop { reason func args file line extra test } { if { $reason == "exited-normally" } { gdb_expect { - -re "220\\*stopped,reason=\"exited-normally\"\r\n$mi_gdb_prompt$" { + -re "\\*stopped,reason=\"exited-normally\"\r\n$mi_gdb_prompt$" { pass "$test" } -re ".*$mi_gdb_prompt$" {fail "continue to end (2)"} @@ -973,13 +973,13 @@ proc mi_expect_stop { reason func args file line extra test } { set a $after_reason - verbose -log "mi_expect_stop: expecting: .*220\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\".*$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped\r\n$mi_gdb_prompt$" + verbose -log "mi_expect_stop: expecting: .*\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\".*$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped\r\n$mi_gdb_prompt$" gdb_expect { - -re ".*220\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\".*$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped\r\n$mi_gdb_prompt$" { + -re ".*\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\".*$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped\r\n$mi_gdb_prompt$" { pass "$test" return $expect_out(2,string) } - -re ".*220\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\".*\",args=\[\\\[\{\].*\[\\\]\}\],file=\".*\",fullname=\"${fullname_syntax}.*\",line=\"\[0-9\]*\"\}.*\r\n$mi_gdb_prompt$" { + -re ".*\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",frame=\{addr=\"$hex\",func=\".*\",args=\[\\\[\{\].*\[\\\]\}\],file=\".*\",fullname=\"${fullname_syntax}.*\",line=\"\[0-9\]*\"\}.*\r\n$mi_gdb_prompt$" { fail "$test (stopped at wrong place)" return -1 } -- 2.34.1