static void metrowerks_step (CORE_ADDR range_start, CORE_ADDR range_stop, int step_into) { struct frame_info *frame = NULL; CORE_ADDR pc = 0; /* When single stepping in assembly, the plugin passes (start + 1) as the stop address. Round the stop address up to the next valid instruction */ if ((range_stop & ~0x3) != range_stop) range_stop = ((range_stop + 4) & ~0x3); pc = read_pc(); if (range_start >= range_stop) error ("invalid step range (the stop address must be greater than the start address)"); if (pc < range_start) error ("invalid step range ($pc is 0x%lx, less than the stop address of 0x%lx)", (unsigned long) pc, (unsigned long) range_start); if (pc == range_stop) error ("invalid step range ($pc is 0x%lx, equal to the stop address of 0x%lx)", (unsigned long) pc, (unsigned long) range_stop); if (pc > range_stop) error ("invalid step range ($pc is 0x%lx, greater than the stop address of 0x%lx)", (unsigned long) pc, (unsigned long) range_stop); clear_proceed_status (); frame = get_current_frame (); if (frame == NULL) error ("No current frame"); step_frame_address = FRAME_FP (frame); step_sp = read_sp (); step_range_start = range_start; step_range_end = range_stop; step_over_calls = step_into ? STEP_OVER_NONE : STEP_OVER_ALL; step_multi = 0; metrowerks_stepping = 1; proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1); make_exec_cleanup (metrowerks_stepping_cleanup, NULL); }
enum mi_cmd_result mi_execute_async_cli_command (char *mi, char *args, int from_tty) { struct cleanup *old_cleanups; char *run; char *async_args; if (target_can_async_p ()) { async_args = (char *) xmalloc (strlen (args) + 2); make_exec_cleanup (free, async_args); strcpy (async_args, args); strcat (async_args, "&"); run = xstrprintf ("%s %s", mi, async_args); make_exec_cleanup (free, run); add_continuation (mi_exec_async_cli_cmd_continuation, NULL); old_cleanups = NULL; } else { run = xstrprintf ("%s %s", mi, args); old_cleanups = make_cleanup (xfree, run); } if (!target_can_async_p ()) { /* 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); fputs_unfiltered ("^running\n", raw_stdout); fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); } else { /* FIXME: cagney/1999-11-29: Printing this message before 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); fputs_unfiltered ("^running\n", raw_stdout); } execute_command ( /*ui */ run, 0 /*from_tty */ ); if (!target_can_async_p ()) { /* Do this before doing any printing. It would appear that some print code leaves garbage around in the buffer. */ 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); fputs_unfiltered ("\n", raw_stdout); return MI_CMD_QUIET; } return MI_CMD_DONE; }
static enum mi_cmd_result 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")) { fputs_unfiltered (parse->token, raw_stdout); fputs_unfiltered ("^error,msg=\"", raw_stdout); fputs_unfiltered ("Cannot execute command ", raw_stdout); fputstr_unfiltered (parse->command, '"', raw_stdout); fputs_unfiltered (" while target running", raw_stdout); fputs_unfiltered ("\"\n", raw_stdout); return MI_CMD_ERROR; } } last_async_command = xstrdup (parse->token); make_exec_cleanup (free_current_contents, &last_async_command); /* FIXME: DELETE THIS! */ if (parse->cmd->args_func != NULL) return parse->cmd->args_func (parse->args, 0 /*from_tty */ ); return parse->cmd->argv_func (parse->command, parse->argv, parse->argc); } else if (parse->cmd->cli.cmd != 0) { /* FIXME: DELETE THIS. */ /* The operation is still implemented by a cli command */ /* Must be a synchronous one */ mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p, parse->args); return MI_CMD_DONE; } else { /* FIXME: DELETE THIS. */ fputs_unfiltered (parse->token, raw_stdout); fputs_unfiltered ("^error,msg=\"", raw_stdout); fputs_unfiltered ("Undefined mi command: ", raw_stdout); fputstr_unfiltered (parse->command, '"', raw_stdout); fputs_unfiltered (" (missing implementation)", raw_stdout); fputs_unfiltered ("\"\n", raw_stdout); return MI_CMD_ERROR; } }