| OLD | NEW |
| 1 /* MI Command Set. | 1 /* MI Command Set. |
| 2 | 2 |
| 3 Copyright (C) 2000-2005, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2000-2005, 2007-2012 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 Contributed by Cygnus Solutions (a Red Hat company). | 5 Contributed by Cygnus Solutions (a Red Hat company). |
| 6 | 6 |
| 7 This file is part of GDB. | 7 This file is part of GDB. |
| 8 | 8 |
| 9 This program is free software; you can redistribute it and/or modify | 9 This program is free software; you can redistribute it and/or modify |
| 10 it under the terms of the GNU General Public License as published by | 10 it under the terms of the GNU General Public License as published by |
| 11 the Free Software Foundation; either version 3 of the License, or | 11 the Free Software Foundation; either version 3 of the License, or |
| 12 (at your option) any later version. | 12 (at your option) any later version. |
| 13 | 13 |
| 14 This program is distributed in the hope that it will be useful, | 14 This program is distributed in the hope that it will be useful, |
| 15 but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 GNU General Public License for more details. | 17 GNU General Public License for more details. |
| 18 | 18 |
| 19 You should have received a copy of the GNU General Public License | 19 You should have received a copy of the GNU General Public License |
| 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 21 | 21 |
| 22 /* Work in progress. */ | |
| 23 | |
| 24 #include "defs.h" | 22 #include "defs.h" |
| 25 #include "arch-utils.h" | 23 #include "arch-utils.h" |
| 26 #include "target.h" | 24 #include "target.h" |
| 27 #include "inferior.h" | 25 #include "inferior.h" |
| 28 #include "gdb_string.h" | 26 #include "gdb_string.h" |
| 29 #include "exceptions.h" | 27 #include "exceptions.h" |
| 30 #include "top.h" | 28 #include "top.h" |
| 31 #include "gdbthread.h" | 29 #include "gdbthread.h" |
| 32 #include "mi-cmds.h" | 30 #include "mi-cmds.h" |
| 33 #include "mi-parse.h" | 31 #include "mi-parse.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 64 #ifdef HAVE_GETRUSAGE | 62 #ifdef HAVE_GETRUSAGE |
| 65 struct rusage rusage; | 63 struct rusage rusage; |
| 66 #endif | 64 #endif |
| 67 | 65 |
| 68 enum | 66 enum |
| 69 { | 67 { |
| 70 FROM_TTY = 0 | 68 FROM_TTY = 0 |
| 71 }; | 69 }; |
| 72 | 70 |
| 73 int mi_debug_p; | 71 int mi_debug_p; |
| 72 |
| 74 struct ui_file *raw_stdout; | 73 struct ui_file *raw_stdout; |
| 75 | 74 |
| 76 /* This is used to pass the current command timestamp | 75 /* This is used to pass the current command timestamp down to |
| 77 down to continuation routines. */ | 76 continuation routines. */ |
| 78 static struct mi_timestamp *current_command_ts; | 77 static struct mi_timestamp *current_command_ts; |
| 79 | 78 |
| 80 static int do_timings = 0; | 79 static int do_timings = 0; |
| 81 | 80 |
| 82 char *current_token; | 81 char *current_token; |
| 83 /* Few commands would like to know if options like --thread-group | 82 /* Few commands would like to know if options like --thread-group were |
| 84 were explicitly specified. This variable keeps the current | 83 explicitly specified. This variable keeps the current parsed |
| 85 parsed command including all option, and make it possible. */ | 84 command including all option, and make it possible. */ |
| 86 static struct mi_parse *current_context; | 85 static struct mi_parse *current_context; |
| 87 | 86 |
| 88 int running_result_record_printed = 1; | 87 int running_result_record_printed = 1; |
| 89 | 88 |
| 90 /* Flag indicating that the target has proceeded since the last | 89 /* Flag indicating that the target has proceeded since the last |
| 91 command was issued. */ | 90 command was issued. */ |
| 92 int mi_proceeded; | 91 int mi_proceeded; |
| 93 | 92 |
| 94 extern void _initialize_mi_main (void); | 93 extern void _initialize_mi_main (void); |
| 95 static void mi_cmd_execute (struct mi_parse *parse); | 94 static void mi_cmd_execute (struct mi_parse *parse); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 if (argc > 0 && strcmp(argv[0], "--reverse") == 0) | 170 if (argc > 0 && strcmp(argv[0], "--reverse") == 0) |
| 172 mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1); | 171 mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1); |
| 173 else | 172 else |
| 174 mi_execute_async_cli_command ("finish", argv, argc); | 173 mi_execute_async_cli_command ("finish", argv, argc); |
| 175 } | 174 } |
| 176 | 175 |
| 177 void | 176 void |
| 178 mi_cmd_exec_return (char *command, char **argv, int argc) | 177 mi_cmd_exec_return (char *command, char **argv, int argc) |
| 179 { | 178 { |
| 180 /* This command doesn't really execute the target, it just pops the | 179 /* This command doesn't really execute the target, it just pops the |
| 181 specified number of frames. */ | 180 specified number of frames. */ |
| 182 if (argc) | 181 if (argc) |
| 183 /* Call return_command with from_tty argument equal to 0 so as to | 182 /* Call return_command with from_tty argument equal to 0 so as to |
| 184 avoid being queried. */ | 183 avoid being queried. */ |
| 185 return_command (*argv, 0); | 184 return_command (*argv, 0); |
| 186 else | 185 else |
| 187 /* Call return_command with from_tty argument equal to 0 so as to | 186 /* Call return_command with from_tty argument equal to 0 so as to |
| 188 avoid being queried. */ | 187 avoid being queried. */ |
| 189 return_command (NULL, 0); | 188 return_command (NULL, 0); |
| 190 | 189 |
| 191 /* Because we have called return_command with from_tty = 0, we need | 190 /* Because we have called return_command with from_tty = 0, we need |
| (...skipping 12 matching lines...) Expand all Loading... |
| 204 proceed_thread (struct thread_info *thread, int pid) | 203 proceed_thread (struct thread_info *thread, int pid) |
| 205 { | 204 { |
| 206 if (!is_stopped (thread->ptid)) | 205 if (!is_stopped (thread->ptid)) |
| 207 return; | 206 return; |
| 208 | 207 |
| 209 if (pid != 0 && PIDGET (thread->ptid) != pid) | 208 if (pid != 0 && PIDGET (thread->ptid) != pid) |
| 210 return; | 209 return; |
| 211 | 210 |
| 212 switch_to_thread (thread->ptid); | 211 switch_to_thread (thread->ptid); |
| 213 clear_proceed_status (); | 212 clear_proceed_status (); |
| 214 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); | 213 proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 0); |
| 215 } | 214 } |
| 216 | 215 |
| 217 | |
| 218 static int | 216 static int |
| 219 proceed_thread_callback (struct thread_info *thread, void *arg) | 217 proceed_thread_callback (struct thread_info *thread, void *arg) |
| 220 { | 218 { |
| 221 int pid = *(int *)arg; | 219 int pid = *(int *)arg; |
| 222 | 220 |
| 223 proceed_thread (thread, pid); | 221 proceed_thread (thread, pid); |
| 224 return 0; | 222 return 0; |
| 225 } | 223 } |
| 226 | 224 |
| 227 static void | 225 static void |
| 228 exec_continue (char **argv, int argc) | 226 exec_continue (char **argv, int argc) |
| 229 { | 227 { |
| 230 if (non_stop) | 228 if (non_stop) |
| 231 { | 229 { |
| 232 /* In non-stop mode, 'resume' always resumes a single thread. Therefore, | 230 /* In non-stop mode, 'resume' always resumes a single thread. |
| 233 » to resume all threads of the current inferior, or all threads in all | 231 » Therefore, to resume all threads of the current inferior, or |
| 234 » inferiors, we need to iterate over threads. | 232 » all threads in all inferiors, we need to iterate over |
| 233 » threads. |
| 235 | 234 |
| 236 See comment on infcmd.c:proceed_thread_callback for rationale. */ | 235 See comment on infcmd.c:proceed_thread_callback for rationale. */ |
| 237 if (current_context->all || current_context->thread_group != -1) | 236 if (current_context->all || current_context->thread_group != -1) |
| 238 { | 237 { |
| 239 int pid = 0; | 238 int pid = 0; |
| 240 struct cleanup *back_to = make_cleanup_restore_current_thread (); | 239 struct cleanup *back_to = make_cleanup_restore_current_thread (); |
| 241 | 240 |
| 242 if (!current_context->all) | 241 if (!current_context->all) |
| 243 { | 242 { |
| 244 struct inferior *inf | 243 struct inferior *inf |
| (...skipping 13 matching lines...) Expand all Loading... |
| 258 { | 257 { |
| 259 struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi); | 258 struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi); |
| 260 | 259 |
| 261 if (current_context->all) | 260 if (current_context->all) |
| 262 { | 261 { |
| 263 sched_multi = 1; | 262 sched_multi = 1; |
| 264 continue_1 (0); | 263 continue_1 (0); |
| 265 } | 264 } |
| 266 else | 265 else |
| 267 { | 266 { |
| 268 » /* In all-stop mode, -exec-continue traditionally resumed either | 267 » /* In all-stop mode, -exec-continue traditionally resumed |
| 269 » all threads, or one thread, depending on the 'scheduler-locking' | 268 » either all threads, or one thread, depending on the |
| 270 » variable. Let's continue to do the same. */ | 269 » 'scheduler-locking' variable. Let's continue to do the |
| 270 » same. */ |
| 271 continue_1 (1); | 271 continue_1 (1); |
| 272 } | 272 } |
| 273 do_cleanups (back_to); | 273 do_cleanups (back_to); |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 | 276 |
| 277 static void | 277 static void |
| 278 exec_direction_forward (void *notused) | 278 exec_direction_forward (void *notused) |
| 279 { | 279 { |
| 280 execution_direction = EXEC_FORWARD; | 280 execution_direction = EXEC_FORWARD; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 if (!is_running (thread->ptid)) | 315 if (!is_running (thread->ptid)) |
| 316 return 0; | 316 return 0; |
| 317 | 317 |
| 318 if (PIDGET (thread->ptid) != pid) | 318 if (PIDGET (thread->ptid) != pid) |
| 319 return 0; | 319 return 0; |
| 320 | 320 |
| 321 target_stop (thread->ptid); | 321 target_stop (thread->ptid); |
| 322 return 0; | 322 return 0; |
| 323 } | 323 } |
| 324 | 324 |
| 325 /* Interrupt the execution of the target. Note how we must play around | 325 /* Interrupt the execution of the target. Note how we must play |
| 326 with the token variables, in order to display the current token in | 326 around with the token variables, in order to display the current |
| 327 the result of the interrupt command, and the previous execution | 327 token in the result of the interrupt command, and the previous |
| 328 token when the target finally stops. See comments in | 328 execution token when the target finally stops. See comments in |
| 329 mi_cmd_execute. */ | 329 mi_cmd_execute. */ |
| 330 |
| 330 void | 331 void |
| 331 mi_cmd_exec_interrupt (char *command, char **argv, int argc) | 332 mi_cmd_exec_interrupt (char *command, char **argv, int argc) |
| 332 { | 333 { |
| 333 /* In all-stop mode, everything stops, so we don't need to try | 334 /* In all-stop mode, everything stops, so we don't need to try |
| 334 anything specific. */ | 335 anything specific. */ |
| 335 if (!non_stop) | 336 if (!non_stop) |
| 336 { | 337 { |
| 337 interrupt_target_1 (0); | 338 interrupt_target_1 (0); |
| 338 return; | 339 return; |
| 339 } | 340 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 | 501 |
| 501 void | 502 void |
| 502 mi_cmd_thread_info (char *command, char **argv, int argc) | 503 mi_cmd_thread_info (char *command, char **argv, int argc) |
| 503 { | 504 { |
| 504 if (argc != 0 && argc != 1) | 505 if (argc != 0 && argc != 1) |
| 505 error (_("Invalid MI command")); | 506 error (_("Invalid MI command")); |
| 506 | 507 |
| 507 print_thread_info (current_uiout, argv[0], -1); | 508 print_thread_info (current_uiout, argv[0], -1); |
| 508 } | 509 } |
| 509 | 510 |
| 511 DEF_VEC_I(int); |
| 512 |
| 510 struct collect_cores_data | 513 struct collect_cores_data |
| 511 { | 514 { |
| 512 int pid; | 515 int pid; |
| 513 | 516 |
| 514 VEC (int) *cores; | 517 VEC (int) *cores; |
| 515 }; | 518 }; |
| 516 | 519 |
| 517 static int | 520 static int |
| 518 collect_cores (struct thread_info *ti, void *xdata) | 521 collect_cores (struct thread_info *ti, void *xdata) |
| 519 { | 522 { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 | 605 |
| 603 if (top_data->recurse) | 606 if (top_data->recurse) |
| 604 print_thread_info (uiout, NULL, inferior->pid); | 607 print_thread_info (uiout, NULL, inferior->pid); |
| 605 | 608 |
| 606 do_cleanups (back_to); | 609 do_cleanups (back_to); |
| 607 } | 610 } |
| 608 | 611 |
| 609 return 0; | 612 return 0; |
| 610 } | 613 } |
| 611 | 614 |
| 612 /* Output a field named 'cores' with a list as the value. The elements of | 615 /* Output a field named 'cores' with a list as the value. The |
| 613 the list are obtained by splitting 'cores' on comma. */ | 616 elements of the list are obtained by splitting 'cores' on |
| 617 comma. */ |
| 614 | 618 |
| 615 static void | 619 static void |
| 616 output_cores (struct ui_out *uiout, const char *field_name, const char *xcores) | 620 output_cores (struct ui_out *uiout, const char *field_name, const char *xcores) |
| 617 { | 621 { |
| 618 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout, | 622 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout, |
| 619 field_name); | 623 field_name); |
| 620 char *cores = xstrdup (xcores); | 624 char *cores = xstrdup (xcores); |
| 621 char *p = cores; | 625 char *p = cores; |
| 622 | 626 |
| 623 make_cleanup (xfree, cores); | 627 make_cleanup (xfree, cores); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 void | 794 void |
| 791 mi_cmd_list_thread_groups (char *command, char **argv, int argc) | 795 mi_cmd_list_thread_groups (char *command, char **argv, int argc) |
| 792 { | 796 { |
| 793 struct ui_out *uiout = current_uiout; | 797 struct ui_out *uiout = current_uiout; |
| 794 struct cleanup *back_to; | 798 struct cleanup *back_to; |
| 795 int available = 0; | 799 int available = 0; |
| 796 int recurse = 0; | 800 int recurse = 0; |
| 797 VEC (int) *ids = 0; | 801 VEC (int) *ids = 0; |
| 798 | 802 |
| 799 enum opt | 803 enum opt |
| 804 { |
| 805 AVAILABLE_OPT, RECURSE_OPT |
| 806 }; |
| 807 static const struct mi_opt opts[] = |
| 800 { | 808 { |
| 801 AVAILABLE_OPT, RECURSE_OPT | 809 {"-available", AVAILABLE_OPT, 0}, |
| 810 {"-recurse", RECURSE_OPT, 1}, |
| 811 { 0, 0, 0 } |
| 802 }; | 812 }; |
| 803 static const struct mi_opt opts[] = | |
| 804 { | |
| 805 {"-available", AVAILABLE_OPT, 0}, | |
| 806 {"-recurse", RECURSE_OPT, 1}, | |
| 807 { 0, 0, 0 } | |
| 808 }; | |
| 809 | 813 |
| 810 int optind = 0; | 814 int oind = 0; |
| 811 char *optarg; | 815 char *oarg; |
| 812 | 816 |
| 813 while (1) | 817 while (1) |
| 814 { | 818 { |
| 815 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts, | 819 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts, |
| 816 » » » &optind, &optarg); | 820 » » » &oind, &oarg); |
| 817 | 821 |
| 818 if (opt < 0) | 822 if (opt < 0) |
| 819 break; | 823 break; |
| 820 switch ((enum opt) opt) | 824 switch ((enum opt) opt) |
| 821 { | 825 { |
| 822 case AVAILABLE_OPT: | 826 case AVAILABLE_OPT: |
| 823 available = 1; | 827 available = 1; |
| 824 break; | 828 break; |
| 825 case RECURSE_OPT: | 829 case RECURSE_OPT: |
| 826 » if (strcmp (optarg, "0") == 0) | 830 » if (strcmp (oarg, "0") == 0) |
| 827 ; | 831 ; |
| 828 » else if (strcmp (optarg, "1") == 0) | 832 » else if (strcmp (oarg, "1") == 0) |
| 829 recurse = 1; | 833 recurse = 1; |
| 830 else | 834 else |
| 831 error (_("only '0' and '1' are valid values " | 835 error (_("only '0' and '1' are valid values " |
| 832 "for the '--recurse' option")); | 836 "for the '--recurse' option")); |
| 833 break; | 837 break; |
| 834 } | 838 } |
| 835 } | 839 } |
| 836 | 840 |
| 837 for (; optind < argc; ++optind) | 841 for (; oind < argc; ++oind) |
| 838 { | 842 { |
| 839 char *end; | 843 char *end; |
| 840 int inf; | 844 int inf; |
| 841 | 845 |
| 842 if (*(argv[optind]) != 'i') | 846 if (*(argv[oind]) != 'i') |
| 843 » error (_("invalid syntax of group id '%s'"), argv[optind]); | 847 » error (_("invalid syntax of group id '%s'"), argv[oind]); |
| 844 | 848 |
| 845 inf = strtoul (argv[optind] + 1, &end, 0); | 849 inf = strtoul (argv[oind] + 1, &end, 0); |
| 846 | 850 |
| 847 if (*end != '\0') | 851 if (*end != '\0') |
| 848 » error (_("invalid syntax of group id '%s'"), argv[optind]); | 852 » error (_("invalid syntax of group id '%s'"), argv[oind]); |
| 849 VEC_safe_push (int, ids, inf); | 853 VEC_safe_push (int, ids, inf); |
| 850 } | 854 } |
| 851 if (VEC_length (int, ids) > 1) | 855 if (VEC_length (int, ids) > 1) |
| 852 qsort (VEC_address (int, ids), | 856 qsort (VEC_address (int, ids), |
| 853 VEC_length (int, ids), | 857 VEC_length (int, ids), |
| 854 sizeof (int), compare_positive_ints); | 858 sizeof (int), compare_positive_ints); |
| 855 | 859 |
| 856 back_to = make_cleanup (free_vector_of_ints, &ids); | 860 back_to = make_cleanup (free_vector_of_ints, &ids); |
| 857 | 861 |
| 858 if (available) | 862 if (available) |
| 859 { | 863 { |
| 860 list_available_thread_groups (ids, recurse); | 864 list_available_thread_groups (ids, recurse); |
| 861 } | 865 } |
| 862 else if (VEC_length (int, ids) == 1) | 866 else if (VEC_length (int, ids) == 1) |
| 863 { | 867 { |
| 864 /* Local thread groups, single id. */ | 868 /* Local thread groups, single id. */ |
| 865 int id = *VEC_address (int, ids); | 869 int id = *VEC_address (int, ids); |
| 866 struct inferior *inf = find_inferior_id (id); | 870 struct inferior *inf = find_inferior_id (id); |
| 867 | 871 |
| 868 if (!inf) | 872 if (!inf) |
| 869 error (_("Non-existent thread group id '%d'"), id); | 873 error (_("Non-existent thread group id '%d'"), id); |
| 870 | 874 |
| 871 print_thread_info (uiout, NULL, inf->pid); | 875 print_thread_info (uiout, NULL, inf->pid); |
| 872 } | 876 } |
| 873 else | 877 else |
| 874 { | 878 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 892 void | 896 void |
| 893 mi_cmd_data_list_register_names (char *command, char **argv, int argc) | 897 mi_cmd_data_list_register_names (char *command, char **argv, int argc) |
| 894 { | 898 { |
| 895 struct gdbarch *gdbarch; | 899 struct gdbarch *gdbarch; |
| 896 struct ui_out *uiout = current_uiout; | 900 struct ui_out *uiout = current_uiout; |
| 897 int regnum, numregs; | 901 int regnum, numregs; |
| 898 int i; | 902 int i; |
| 899 struct cleanup *cleanup; | 903 struct cleanup *cleanup; |
| 900 | 904 |
| 901 /* Note that the test for a valid register must include checking the | 905 /* Note that the test for a valid register must include checking the |
| 902 gdbarch_register_name because gdbarch_num_regs may be allocated for | 906 gdbarch_register_name because gdbarch_num_regs may be allocated |
| 903 the union of the register sets within a family of related processors. | 907 for the union of the register sets within a family of related |
| 904 In this case, some entries of gdbarch_register_name will change depending | 908 processors. In this case, some entries of gdbarch_register_name |
| 905 upon the particular processor being debugged. */ | 909 will change depending upon the particular processor being |
| 910 debugged. */ |
| 906 | 911 |
| 907 gdbarch = get_current_arch (); | 912 gdbarch = get_current_arch (); |
| 908 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); | 913 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); |
| 909 | 914 |
| 910 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names"); | 915 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names"); |
| 911 | 916 |
| 912 if (argc == 0) /* No args, just do all the regs. */ | 917 if (argc == 0) /* No args, just do all the regs. */ |
| 913 { | 918 { |
| 914 for (regnum = 0; | 919 for (regnum = 0; |
| 915 regnum < numregs; | 920 regnum < numregs; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 945 mi_cmd_data_list_changed_registers (char *command, char **argv, int argc) | 950 mi_cmd_data_list_changed_registers (char *command, char **argv, int argc) |
| 946 { | 951 { |
| 947 static struct regcache *this_regs = NULL; | 952 static struct regcache *this_regs = NULL; |
| 948 struct ui_out *uiout = current_uiout; | 953 struct ui_out *uiout = current_uiout; |
| 949 struct regcache *prev_regs; | 954 struct regcache *prev_regs; |
| 950 struct gdbarch *gdbarch; | 955 struct gdbarch *gdbarch; |
| 951 int regnum, numregs, changed; | 956 int regnum, numregs, changed; |
| 952 int i; | 957 int i; |
| 953 struct cleanup *cleanup; | 958 struct cleanup *cleanup; |
| 954 | 959 |
| 955 /* The last time we visited this function, the current frame's register | 960 /* The last time we visited this function, the current frame's |
| 956 contents were saved in THIS_REGS. Move THIS_REGS over to PREV_REGS, | 961 register contents were saved in THIS_REGS. Move THIS_REGS over |
| 957 and refresh THIS_REGS with the now-current register contents. */ | 962 to PREV_REGS, and refresh THIS_REGS with the now-current register |
| 963 contents. */ |
| 958 | 964 |
| 959 prev_regs = this_regs; | 965 prev_regs = this_regs; |
| 960 this_regs = frame_save_as_regcache (get_selected_frame (NULL)); | 966 this_regs = frame_save_as_regcache (get_selected_frame (NULL)); |
| 961 cleanup = make_cleanup_regcache_xfree (prev_regs); | 967 cleanup = make_cleanup_regcache_xfree (prev_regs); |
| 962 | 968 |
| 963 /* Note that the test for a valid register must include checking the | 969 /* Note that the test for a valid register must include checking the |
| 964 gdbarch_register_name because gdbarch_num_regs may be allocated for | 970 gdbarch_register_name because gdbarch_num_regs may be allocated |
| 965 the union of the register sets within a family of related processors. | 971 for the union of the register sets within a family of related |
| 966 In this case, some entries of gdbarch_register_name will change depending | 972 processors. In this case, some entries of gdbarch_register_name |
| 967 upon the particular processor being debugged. */ | 973 will change depending upon the particular processor being |
| 974 debugged. */ |
| 968 | 975 |
| 969 gdbarch = get_regcache_arch (this_regs); | 976 gdbarch = get_regcache_arch (this_regs); |
| 970 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); | 977 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); |
| 971 | 978 |
| 972 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers"); | 979 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers"); |
| 973 | 980 |
| 974 if (argc == 0)» » /* No args, just do all the regs. */ | 981 if (argc == 0) |
| 975 { | 982 { |
| 983 /* No args, just do all the regs. */ |
| 976 for (regnum = 0; | 984 for (regnum = 0; |
| 977 regnum < numregs; | 985 regnum < numregs; |
| 978 regnum++) | 986 regnum++) |
| 979 { | 987 { |
| 980 if (gdbarch_register_name (gdbarch, regnum) == NULL | 988 if (gdbarch_register_name (gdbarch, regnum) == NULL |
| 981 || *(gdbarch_register_name (gdbarch, regnum)) == '\0') | 989 || *(gdbarch_register_name (gdbarch, regnum)) == '\0') |
| 982 continue; | 990 continue; |
| 983 changed = register_changed_p (regnum, prev_regs, this_regs); | 991 changed = register_changed_p (regnum, prev_regs, this_regs); |
| 984 if (changed < 0) | 992 if (changed < 0) |
| 985 error (_("-data-list-changed-registers: " | 993 error (_("-data-list-changed-registers: " |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 return 1; | 1043 return 1; |
| 1036 else if (this_status == REG_VALID) | 1044 else if (this_status == REG_VALID) |
| 1037 return memcmp (prev_buffer, this_buffer, | 1045 return memcmp (prev_buffer, this_buffer, |
| 1038 register_size (gdbarch, regnum)) != 0; | 1046 register_size (gdbarch, regnum)) != 0; |
| 1039 else | 1047 else |
| 1040 return 0; | 1048 return 0; |
| 1041 } | 1049 } |
| 1042 | 1050 |
| 1043 /* Return a list of register number and value pairs. The valid | 1051 /* Return a list of register number and value pairs. The valid |
| 1044 arguments expected are: a letter indicating the format in which to | 1052 arguments expected are: a letter indicating the format in which to |
| 1045 display the registers contents. This can be one of: x (hexadecimal), d | 1053 display the registers contents. This can be one of: x |
| 1046 (decimal), N (natural), t (binary), o (octal), r (raw). After the | 1054 (hexadecimal), d (decimal), N (natural), t (binary), o (octal), r |
| 1047 format argumetn there can be a sequence of numbers, indicating which | 1055 (raw). After the format argument there can be a sequence of |
| 1048 registers to fetch the content of. If the format is the only argument, | 1056 numbers, indicating which registers to fetch the content of. If |
| 1049 a list of all the registers with their values is returned. */ | 1057 the format is the only argument, a list of all the registers with |
| 1058 their values is returned. */ |
| 1059 |
| 1050 void | 1060 void |
| 1051 mi_cmd_data_list_register_values (char *command, char **argv, int argc) | 1061 mi_cmd_data_list_register_values (char *command, char **argv, int argc) |
| 1052 { | 1062 { |
| 1053 struct ui_out *uiout = current_uiout; | 1063 struct ui_out *uiout = current_uiout; |
| 1054 struct frame_info *frame; | 1064 struct frame_info *frame; |
| 1055 struct gdbarch *gdbarch; | 1065 struct gdbarch *gdbarch; |
| 1056 int regnum, numregs, format; | 1066 int regnum, numregs, format; |
| 1057 int i; | 1067 int i; |
| 1058 struct cleanup *list_cleanup, *tuple_cleanup; | 1068 struct cleanup *list_cleanup, *tuple_cleanup; |
| 1059 | 1069 |
| 1060 /* Note that the test for a valid register must include checking the | 1070 /* Note that the test for a valid register must include checking the |
| 1061 gdbarch_register_name because gdbarch_num_regs may be allocated for | 1071 gdbarch_register_name because gdbarch_num_regs may be allocated |
| 1062 the union of the register sets within a family of related processors. | 1072 for the union of the register sets within a family of related |
| 1063 In this case, some entries of gdbarch_register_name will change depending | 1073 processors. In this case, some entries of gdbarch_register_name |
| 1064 upon the particular processor being debugged. */ | 1074 will change depending upon the particular processor being |
| 1075 debugged. */ |
| 1065 | 1076 |
| 1066 if (argc == 0) | 1077 if (argc == 0) |
| 1067 error (_("-data-list-register-values: Usage: " | 1078 error (_("-data-list-register-values: Usage: " |
| 1068 "-data-list-register-values <format> [<regnum1>...<regnumN>]")); | 1079 "-data-list-register-values <format> [<regnum1>...<regnumN>]")); |
| 1069 | 1080 |
| 1070 format = (int) argv[0][0]; | 1081 format = (int) argv[0][0]; |
| 1071 | 1082 |
| 1072 frame = get_selected_frame (NULL); | 1083 frame = get_selected_frame (NULL); |
| 1073 gdbarch = get_frame_arch (frame); | 1084 gdbarch = get_frame_arch (frame); |
| 1074 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); | 1085 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); |
| 1075 | 1086 |
| 1076 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values"); | 1087 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values"); |
| 1077 | 1088 |
| 1078 if (argc == 1)» /* No args, beside the format: do all the regs. */ | 1089 if (argc == 1) |
| 1079 { | 1090 { |
| 1091 /* No args, beside the format: do all the regs. */ |
| 1080 for (regnum = 0; | 1092 for (regnum = 0; |
| 1081 regnum < numregs; | 1093 regnum < numregs; |
| 1082 regnum++) | 1094 regnum++) |
| 1083 { | 1095 { |
| 1084 if (gdbarch_register_name (gdbarch, regnum) == NULL | 1096 if (gdbarch_register_name (gdbarch, regnum) == NULL |
| 1085 || *(gdbarch_register_name (gdbarch, regnum)) == '\0') | 1097 || *(gdbarch_register_name (gdbarch, regnum)) == '\0') |
| 1086 continue; | 1098 continue; |
| 1087 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); | 1099 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); |
| 1088 ui_out_field_int (uiout, "number", regnum); | 1100 ui_out_field_int (uiout, "number", regnum); |
| 1089 get_register (frame, regnum, format); | 1101 get_register (frame, regnum, format); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1106 get_register (frame, regnum, format); | 1118 get_register (frame, regnum, format); |
| 1107 do_cleanups (tuple_cleanup); | 1119 do_cleanups (tuple_cleanup); |
| 1108 } | 1120 } |
| 1109 else | 1121 else |
| 1110 error (_("bad register number")); | 1122 error (_("bad register number")); |
| 1111 } | 1123 } |
| 1112 do_cleanups (list_cleanup); | 1124 do_cleanups (list_cleanup); |
| 1113 } | 1125 } |
| 1114 | 1126 |
| 1115 /* Output one register's contents in the desired format. */ | 1127 /* Output one register's contents in the desired format. */ |
| 1128 |
| 1116 static void | 1129 static void |
| 1117 get_register (struct frame_info *frame, int regnum, int format) | 1130 get_register (struct frame_info *frame, int regnum, int format) |
| 1118 { | 1131 { |
| 1119 struct gdbarch *gdbarch = get_frame_arch (frame); | 1132 struct gdbarch *gdbarch = get_frame_arch (frame); |
| 1120 struct ui_out *uiout = current_uiout; | 1133 struct ui_out *uiout = current_uiout; |
| 1121 CORE_ADDR addr; | |
| 1122 enum lval_type lval; | |
| 1123 struct ui_stream *stb; | |
| 1124 struct value *val; | 1134 struct value *val; |
| 1125 | 1135 |
| 1126 stb = ui_out_stream_new (uiout); | |
| 1127 | |
| 1128 if (format == 'N') | 1136 if (format == 'N') |
| 1129 format = 0; | 1137 format = 0; |
| 1130 | 1138 |
| 1131 val = get_frame_register_value (frame, regnum); | 1139 val = get_frame_register_value (frame, regnum); |
| 1132 | 1140 |
| 1133 if (value_optimized_out (val)) | 1141 if (value_optimized_out (val)) |
| 1134 error (_("Optimized out")); | 1142 error (_("Optimized out")); |
| 1135 | 1143 |
| 1136 if (format == 'r') | 1144 if (format == 'r') |
| 1137 { | 1145 { |
| 1138 int j; | 1146 int j; |
| 1139 char *ptr, buf[1024]; | 1147 char *ptr, buf[1024]; |
| 1140 const gdb_byte *valaddr = value_contents_for_printing (val); | 1148 const gdb_byte *valaddr = value_contents_for_printing (val); |
| 1141 | 1149 |
| 1142 strcpy (buf, "0x"); | 1150 strcpy (buf, "0x"); |
| 1143 ptr = buf + 2; | 1151 ptr = buf + 2; |
| 1144 for (j = 0; j < register_size (gdbarch, regnum); j++) | 1152 for (j = 0; j < register_size (gdbarch, regnum); j++) |
| 1145 { | 1153 { |
| 1146 int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? | 1154 int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? |
| 1147 j : register_size (gdbarch, regnum) - 1 - j; | 1155 j : register_size (gdbarch, regnum) - 1 - j; |
| 1148 | 1156 |
| 1149 sprintf (ptr, "%02x", (unsigned char) valaddr[idx]); | 1157 sprintf (ptr, "%02x", (unsigned char) valaddr[idx]); |
| 1150 ptr += 2; | 1158 ptr += 2; |
| 1151 } | 1159 } |
| 1152 ui_out_field_string (uiout, "value", buf); | 1160 ui_out_field_string (uiout, "value", buf); |
| 1153 /*fputs_filtered (buf, gdb_stdout); */ | |
| 1154 } | 1161 } |
| 1155 else | 1162 else |
| 1156 { | 1163 { |
| 1157 struct value_print_options opts; | 1164 struct value_print_options opts; |
| 1165 struct ui_file *stb; |
| 1166 struct cleanup *old_chain; |
| 1167 |
| 1168 stb = mem_fileopen (); |
| 1169 old_chain = make_cleanup_ui_file_delete (stb); |
| 1158 | 1170 |
| 1159 get_formatted_print_options (&opts, format); | 1171 get_formatted_print_options (&opts, format); |
| 1160 opts.deref_ref = 1; | 1172 opts.deref_ref = 1; |
| 1161 val_print (value_type (val), | 1173 val_print (value_type (val), |
| 1162 value_contents_for_printing (val), | 1174 value_contents_for_printing (val), |
| 1163 value_embedded_offset (val), 0, | 1175 value_embedded_offset (val), 0, |
| 1164 » » stb->stream, 0, val, &opts, current_language); | 1176 » » stb, 0, val, &opts, current_language); |
| 1165 ui_out_field_stream (uiout, "value", stb); | 1177 ui_out_field_stream (uiout, "value", stb); |
| 1166 ui_out_stream_delete (stb); | 1178 do_cleanups (old_chain); |
| 1167 } | 1179 } |
| 1168 } | 1180 } |
| 1169 | 1181 |
| 1170 /* Write given values into registers. The registers and values are | 1182 /* Write given values into registers. The registers and values are |
| 1171 given as pairs. The corresponding MI command is | 1183 given as pairs. The corresponding MI command is |
| 1172 -data-write-register-values <format> | 1184 -data-write-register-values <format> |
| 1173 [<regnum1> <value1>...<regnumN> <valueN>] */ | 1185 [<regnum1> <value1>...<regnumN> <valueN>] */ |
| 1174 void | 1186 void |
| 1175 mi_cmd_data_write_register_values (char *command, char **argv, int argc) | 1187 mi_cmd_data_write_register_values (char *command, char **argv, int argc) |
| 1176 { | 1188 { |
| 1177 struct regcache *regcache; | 1189 struct regcache *regcache; |
| 1178 struct gdbarch *gdbarch; | 1190 struct gdbarch *gdbarch; |
| 1179 int numregs, i; | 1191 int numregs, i; |
| 1180 char format; | 1192 char format; |
| 1181 | 1193 |
| 1182 /* Note that the test for a valid register must include checking the | 1194 /* Note that the test for a valid register must include checking the |
| 1183 gdbarch_register_name because gdbarch_num_regs may be allocated for | 1195 gdbarch_register_name because gdbarch_num_regs may be allocated |
| 1184 the union of the register sets within a family of related processors. | 1196 for the union of the register sets within a family of related |
| 1185 In this case, some entries of gdbarch_register_name will change depending | 1197 processors. In this case, some entries of gdbarch_register_name |
| 1186 upon the particular processor being debugged. */ | 1198 will change depending upon the particular processor being |
| 1199 debugged. */ |
| 1187 | 1200 |
| 1188 regcache = get_current_regcache (); | 1201 regcache = get_current_regcache (); |
| 1189 gdbarch = get_regcache_arch (regcache); | 1202 gdbarch = get_regcache_arch (regcache); |
| 1190 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); | 1203 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); |
| 1191 | 1204 |
| 1192 if (argc == 0) | 1205 if (argc == 0) |
| 1193 error (_("-data-write-register-values: Usage: -data-write-register-" | 1206 error (_("-data-write-register-values: Usage: -data-write-register-" |
| 1194 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]")); | 1207 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]")); |
| 1195 | 1208 |
| 1196 format = (int) argv[0][0]; | 1209 format = (int) argv[0][0]; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1222 regcache_cooked_write_signed (regcache, regnum, value); | 1235 regcache_cooked_write_signed (regcache, regnum, value); |
| 1223 } | 1236 } |
| 1224 else | 1237 else |
| 1225 error (_("bad register number")); | 1238 error (_("bad register number")); |
| 1226 } | 1239 } |
| 1227 } | 1240 } |
| 1228 | 1241 |
| 1229 /* Evaluate the value of the argument. The argument is an | 1242 /* Evaluate the value of the argument. The argument is an |
| 1230 expression. If the expression contains spaces it needs to be | 1243 expression. If the expression contains spaces it needs to be |
| 1231 included in double quotes. */ | 1244 included in double quotes. */ |
| 1245 |
| 1232 void | 1246 void |
| 1233 mi_cmd_data_evaluate_expression (char *command, char **argv, int argc) | 1247 mi_cmd_data_evaluate_expression (char *command, char **argv, int argc) |
| 1234 { | 1248 { |
| 1235 struct expression *expr; | 1249 struct expression *expr; |
| 1236 struct cleanup *old_chain = NULL; | 1250 struct cleanup *old_chain; |
| 1237 struct value *val; | 1251 struct value *val; |
| 1238 struct ui_stream *stb = NULL; | 1252 struct ui_file *stb; |
| 1239 struct value_print_options opts; | 1253 struct value_print_options opts; |
| 1240 struct ui_out *uiout = current_uiout; | 1254 struct ui_out *uiout = current_uiout; |
| 1241 | 1255 |
| 1242 stb = ui_out_stream_new (uiout); | 1256 stb = mem_fileopen (); |
| 1257 old_chain = make_cleanup_ui_file_delete (stb); |
| 1243 | 1258 |
| 1244 if (argc != 1) | 1259 if (argc != 1) |
| 1245 { | 1260 error (_("-data-evaluate-expression: " |
| 1246 ui_out_stream_delete (stb); | 1261 » "Usage: -data-evaluate-expression expression")); |
| 1247 error (_("-data-evaluate-expression: " | |
| 1248 » "Usage: -data-evaluate-expression expression")); | |
| 1249 } | |
| 1250 | 1262 |
| 1251 expr = parse_expression (argv[0]); | 1263 expr = parse_expression (argv[0]); |
| 1252 | 1264 |
| 1253 old_chain = make_cleanup (free_current_contents, &expr); | 1265 make_cleanup (free_current_contents, &expr); |
| 1254 | 1266 |
| 1255 val = evaluate_expression (expr); | 1267 val = evaluate_expression (expr); |
| 1256 | 1268 |
| 1257 /* Print the result of the expression evaluation. */ | 1269 /* Print the result of the expression evaluation. */ |
| 1258 get_user_print_options (&opts); | 1270 get_user_print_options (&opts); |
| 1259 opts.deref_ref = 0; | 1271 opts.deref_ref = 0; |
| 1260 common_val_print (val, stb->stream, 0, &opts, current_language); | 1272 common_val_print (val, stb, 0, &opts, current_language); |
| 1261 | 1273 |
| 1262 ui_out_field_stream (uiout, "value", stb); | 1274 ui_out_field_stream (uiout, "value", stb); |
| 1263 ui_out_stream_delete (stb); | |
| 1264 | 1275 |
| 1265 do_cleanups (old_chain); | 1276 do_cleanups (old_chain); |
| 1266 } | 1277 } |
| 1267 | 1278 |
| 1268 /* DATA-MEMORY-READ: | 1279 /* This is the -data-read-memory command. |
| 1269 | 1280 |
| 1270 ADDR: start address of data to be dumped. | 1281 ADDR: start address of data to be dumped. |
| 1271 WORD-FORMAT: a char indicating format for the ``word''. See | 1282 WORD-FORMAT: a char indicating format for the ``word''. See |
| 1272 the ``x'' command. | 1283 the ``x'' command. |
| 1273 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes. | 1284 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes. |
| 1274 NR_ROW: Number of rows. | 1285 NR_ROW: Number of rows. |
| 1275 NR_COL: The number of colums (words per row). | 1286 NR_COL: The number of colums (words per row). |
| 1276 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use | 1287 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use |
| 1277 ASCHAR for unprintable characters. | 1288 ASCHAR for unprintable characters. |
| 1278 | 1289 |
| 1279 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and | 1290 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and |
| 1280 displayes them. Returns: | 1291 displayes them. Returns: |
| 1281 | 1292 |
| 1282 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...} | 1293 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...} |
| 1283 | 1294 |
| 1284 Returns: | 1295 Returns: |
| 1285 The number of bytes read is SIZE*ROW*COL. */ | 1296 The number of bytes read is SIZE*ROW*COL. */ |
| 1286 | 1297 |
| 1287 void | 1298 void |
| 1288 mi_cmd_data_read_memory (char *command, char **argv, int argc) | 1299 mi_cmd_data_read_memory (char *command, char **argv, int argc) |
| 1289 { | 1300 { |
| 1290 struct gdbarch *gdbarch = get_current_arch (); | 1301 struct gdbarch *gdbarch = get_current_arch (); |
| 1291 struct ui_out *uiout = current_uiout; | 1302 struct ui_out *uiout = current_uiout; |
| 1292 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); | 1303 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); |
| 1293 CORE_ADDR addr; | 1304 CORE_ADDR addr; |
| 1294 long total_bytes; | 1305 long total_bytes, nr_cols, nr_rows; |
| 1295 long nr_cols; | |
| 1296 long nr_rows; | |
| 1297 char word_format; | 1306 char word_format; |
| 1298 struct type *word_type; | 1307 struct type *word_type; |
| 1299 long word_size; | 1308 long word_size; |
| 1300 char word_asize; | 1309 char word_asize; |
| 1301 char aschar; | 1310 char aschar; |
| 1302 gdb_byte *mbuf; | 1311 gdb_byte *mbuf; |
| 1303 int nr_bytes; | 1312 int nr_bytes; |
| 1304 long offset = 0; | 1313 long offset = 0; |
| 1305 int optind = 0; | 1314 int oind = 0; |
| 1306 char *optarg; | 1315 char *oarg; |
| 1307 enum opt | 1316 enum opt |
| 1317 { |
| 1318 OFFSET_OPT |
| 1319 }; |
| 1320 static const struct mi_opt opts[] = |
| 1308 { | 1321 { |
| 1309 OFFSET_OPT | 1322 {"o", OFFSET_OPT, 1}, |
| 1323 { 0, 0, 0 } |
| 1310 }; | 1324 }; |
| 1311 static const struct mi_opt opts[] = | |
| 1312 { | |
| 1313 {"o", OFFSET_OPT, 1}, | |
| 1314 { 0, 0, 0 } | |
| 1315 }; | |
| 1316 | 1325 |
| 1317 while (1) | 1326 while (1) |
| 1318 { | 1327 { |
| 1319 int opt = mi_getopt ("-data-read-memory", argc, argv, opts, | 1328 int opt = mi_getopt ("-data-read-memory", argc, argv, opts, |
| 1320 » » » &optind, &optarg); | 1329 » » » &oind, &oarg); |
| 1321 | 1330 |
| 1322 if (opt < 0) | 1331 if (opt < 0) |
| 1323 break; | 1332 break; |
| 1324 switch ((enum opt) opt) | 1333 switch ((enum opt) opt) |
| 1325 { | 1334 { |
| 1326 case OFFSET_OPT: | 1335 case OFFSET_OPT: |
| 1327 » offset = atol (optarg); | 1336 » offset = atol (oarg); |
| 1328 break; | 1337 break; |
| 1329 } | 1338 } |
| 1330 } | 1339 } |
| 1331 argv += optind; | 1340 argv += oind; |
| 1332 argc -= optind; | 1341 argc -= oind; |
| 1333 | 1342 |
| 1334 if (argc < 5 || argc > 6) | 1343 if (argc < 5 || argc > 6) |
| 1335 error (_("-data-read-memory: Usage: " | 1344 error (_("-data-read-memory: Usage: " |
| 1336 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].")); | 1345 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].")); |
| 1337 | 1346 |
| 1338 /* Extract all the arguments. */ | 1347 /* Extract all the arguments. */ |
| 1339 | 1348 |
| 1340 /* Start address of the memory dump. */ | 1349 /* Start address of the memory dump. */ |
| 1341 addr = parse_and_eval_address (argv[0]) + offset; | 1350 addr = parse_and_eval_address (argv[0]) + offset; |
| 1342 /* The format character to use when displaying a memory word. See | 1351 /* The format character to use when displaying a memory word. See |
| 1343 the ``x'' command. */ | 1352 the ``x'' command. */ |
| 1344 word_format = argv[1][0]; | 1353 word_format = argv[1][0]; |
| 1345 /* The size of the memory word. */ | 1354 /* The size of the memory word. */ |
| 1346 word_size = atol (argv[2]); | 1355 word_size = atol (argv[2]); |
| 1347 switch (word_size) | 1356 switch (word_size) |
| 1348 { | 1357 { |
| 1349 case 1: | 1358 case 1: |
| 1350 word_type = builtin_type (gdbarch)->builtin_int8; | 1359 word_type = builtin_type (gdbarch)->builtin_int8; |
| 1351 word_asize = 'b'; | 1360 word_asize = 'b'; |
| 1352 break; | 1361 break; |
| 1353 case 2: | 1362 case 2: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 ui_out_field_int (uiout, "total-bytes", total_bytes); | 1410 ui_out_field_int (uiout, "total-bytes", total_bytes); |
| 1402 ui_out_field_core_addr (uiout, "next-row", | 1411 ui_out_field_core_addr (uiout, "next-row", |
| 1403 gdbarch, addr + word_size * nr_cols); | 1412 gdbarch, addr + word_size * nr_cols); |
| 1404 ui_out_field_core_addr (uiout, "prev-row", | 1413 ui_out_field_core_addr (uiout, "prev-row", |
| 1405 gdbarch, addr - word_size * nr_cols); | 1414 gdbarch, addr - word_size * nr_cols); |
| 1406 ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes); | 1415 ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes); |
| 1407 ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes); | 1416 ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes); |
| 1408 | 1417 |
| 1409 /* Build the result as a two dimentional table. */ | 1418 /* Build the result as a two dimentional table. */ |
| 1410 { | 1419 { |
| 1411 struct ui_stream *stream = ui_out_stream_new (uiout); | 1420 struct ui_file *stream; |
| 1412 struct cleanup *cleanup_list_memory; | 1421 struct cleanup *cleanup_stream; |
| 1413 int row; | 1422 int row; |
| 1414 int row_byte; | 1423 int row_byte; |
| 1415 | 1424 |
| 1416 cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory"); | 1425 stream = mem_fileopen (); |
| 1426 cleanup_stream = make_cleanup_ui_file_delete (stream); |
| 1427 |
| 1428 make_cleanup_ui_out_list_begin_end (uiout, "memory"); |
| 1417 for (row = 0, row_byte = 0; | 1429 for (row = 0, row_byte = 0; |
| 1418 row < nr_rows; | 1430 row < nr_rows; |
| 1419 row++, row_byte += nr_cols * word_size) | 1431 row++, row_byte += nr_cols * word_size) |
| 1420 { | 1432 { |
| 1421 int col; | 1433 int col; |
| 1422 int col_byte; | 1434 int col_byte; |
| 1423 struct cleanup *cleanup_tuple; | 1435 struct cleanup *cleanup_tuple; |
| 1424 struct cleanup *cleanup_list_data; | 1436 struct cleanup *cleanup_list_data; |
| 1425 struct value_print_options opts; | 1437 struct value_print_options opts; |
| 1426 | 1438 |
| 1427 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); | 1439 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); |
| 1428 ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte); | 1440 ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte); |
| 1429 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr + | 1441 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr + |
| 1430 row_byte); */ | 1442 row_byte); */ |
| 1431 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data"); | 1443 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data"); |
| 1432 get_formatted_print_options (&opts, word_format); | 1444 get_formatted_print_options (&opts, word_format); |
| 1433 for (col = 0, col_byte = row_byte; | 1445 for (col = 0, col_byte = row_byte; |
| 1434 col < nr_cols; | 1446 col < nr_cols; |
| 1435 col++, col_byte += word_size) | 1447 col++, col_byte += word_size) |
| 1436 { | 1448 { |
| 1437 if (col_byte + word_size > nr_bytes) | 1449 if (col_byte + word_size > nr_bytes) |
| 1438 { | 1450 { |
| 1439 ui_out_field_string (uiout, NULL, "N/A"); | 1451 ui_out_field_string (uiout, NULL, "N/A"); |
| 1440 } | 1452 } |
| 1441 else | 1453 else |
| 1442 { | 1454 { |
| 1443 » » ui_file_rewind (stream->stream); | 1455 » » ui_file_rewind (stream); |
| 1444 print_scalar_formatted (mbuf + col_byte, word_type, &opts, | 1456 print_scalar_formatted (mbuf + col_byte, word_type, &opts, |
| 1445 » » » » » word_asize, stream->stream); | 1457 » » » » » word_asize, stream); |
| 1446 ui_out_field_stream (uiout, NULL, stream); | 1458 ui_out_field_stream (uiout, NULL, stream); |
| 1447 } | 1459 } |
| 1448 } | 1460 } |
| 1449 do_cleanups (cleanup_list_data); | 1461 do_cleanups (cleanup_list_data); |
| 1450 if (aschar) | 1462 if (aschar) |
| 1451 { | 1463 { |
| 1452 int byte; | 1464 int byte; |
| 1453 | 1465 |
| 1454 » ui_file_rewind (stream->stream); | 1466 » ui_file_rewind (stream); |
| 1455 for (byte = row_byte; | 1467 for (byte = row_byte; |
| 1456 byte < row_byte + word_size * nr_cols; byte++) | 1468 byte < row_byte + word_size * nr_cols; byte++) |
| 1457 { | 1469 { |
| 1458 if (byte >= nr_bytes) | 1470 if (byte >= nr_bytes) |
| 1459 » » { | 1471 » » fputc_unfiltered ('X', stream); |
| 1460 » » fputc_unfiltered ('X', stream->stream); | |
| 1461 » » } | |
| 1462 else if (mbuf[byte] < 32 || mbuf[byte] > 126) | 1472 else if (mbuf[byte] < 32 || mbuf[byte] > 126) |
| 1463 » » { | 1473 » » fputc_unfiltered (aschar, stream); |
| 1464 » » fputc_unfiltered (aschar, stream->stream); | |
| 1465 » » } | |
| 1466 else | 1474 else |
| 1467 » » fputc_unfiltered (mbuf[byte], stream->stream); | 1475 » » fputc_unfiltered (mbuf[byte], stream); |
| 1468 } | 1476 } |
| 1469 ui_out_field_stream (uiout, "ascii", stream); | 1477 ui_out_field_stream (uiout, "ascii", stream); |
| 1470 } | 1478 } |
| 1471 do_cleanups (cleanup_tuple); | 1479 do_cleanups (cleanup_tuple); |
| 1472 } | 1480 } |
| 1473 ui_out_stream_delete (stream); | 1481 do_cleanups (cleanup_stream); |
| 1474 do_cleanups (cleanup_list_memory); | |
| 1475 } | 1482 } |
| 1476 do_cleanups (cleanups); | 1483 do_cleanups (cleanups); |
| 1477 } | 1484 } |
| 1478 | 1485 |
| 1479 void | 1486 void |
| 1480 mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc) | 1487 mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc) |
| 1481 { | 1488 { |
| 1482 struct gdbarch *gdbarch = get_current_arch (); | 1489 struct gdbarch *gdbarch = get_current_arch (); |
| 1483 struct ui_out *uiout = current_uiout; | 1490 struct ui_out *uiout = current_uiout; |
| 1484 struct cleanup *cleanups; | 1491 struct cleanup *cleanups; |
| 1485 CORE_ADDR addr; | 1492 CORE_ADDR addr; |
| 1486 LONGEST length; | 1493 LONGEST length; |
| 1487 memory_read_result_s *read_result; | 1494 memory_read_result_s *read_result; |
| 1488 int ix; | 1495 int ix; |
| 1489 VEC(memory_read_result_s) *result; | 1496 VEC(memory_read_result_s) *result; |
| 1490 long offset = 0; | 1497 long offset = 0; |
| 1491 int optind = 0; | 1498 int oind = 0; |
| 1492 char *optarg; | 1499 char *oarg; |
| 1493 enum opt | 1500 enum opt |
| 1501 { |
| 1502 OFFSET_OPT |
| 1503 }; |
| 1504 static const struct mi_opt opts[] = |
| 1494 { | 1505 { |
| 1495 OFFSET_OPT | 1506 {"o", OFFSET_OPT, 1}, |
| 1507 { 0, 0, 0 } |
| 1496 }; | 1508 }; |
| 1497 static const struct mi_opt opts[] = | |
| 1498 { | |
| 1499 {"o", OFFSET_OPT, 1}, | |
| 1500 { 0, 0, 0 } | |
| 1501 }; | |
| 1502 | 1509 |
| 1503 while (1) | 1510 while (1) |
| 1504 { | 1511 { |
| 1505 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts, | 1512 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts, |
| 1506 » » » &optind, &optarg); | 1513 » » » &oind, &oarg); |
| 1507 if (opt < 0) | 1514 if (opt < 0) |
| 1508 break; | 1515 break; |
| 1509 switch ((enum opt) opt) | 1516 switch ((enum opt) opt) |
| 1510 { | 1517 { |
| 1511 case OFFSET_OPT: | 1518 case OFFSET_OPT: |
| 1512 » offset = atol (optarg); | 1519 » offset = atol (oarg); |
| 1513 break; | 1520 break; |
| 1514 } | 1521 } |
| 1515 } | 1522 } |
| 1516 argv += optind; | 1523 argv += oind; |
| 1517 argc -= optind; | 1524 argc -= oind; |
| 1518 | 1525 |
| 1519 if (argc != 2) | 1526 if (argc != 2) |
| 1520 error (_("Usage: [ -o OFFSET ] ADDR LENGTH.")); | 1527 error (_("Usage: [ -o OFFSET ] ADDR LENGTH.")); |
| 1521 | 1528 |
| 1522 addr = parse_and_eval_address (argv[0]) + offset; | 1529 addr = parse_and_eval_address (argv[0]) + offset; |
| 1523 length = atol (argv[1]); | 1530 length = atol (argv[1]); |
| 1524 | 1531 |
| 1525 result = read_memory_robust (current_target.beneath, addr, length); | 1532 result = read_memory_robust (current_target.beneath, addr, length); |
| 1526 | 1533 |
| 1527 cleanups = make_cleanup (free_memory_read_result_vector, result); | 1534 cleanups = make_cleanup (free_memory_read_result_vector, result); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1551 { | 1558 { |
| 1552 sprintf (p, "%02x", read_result->data[i]); | 1559 sprintf (p, "%02x", read_result->data[i]); |
| 1553 } | 1560 } |
| 1554 ui_out_field_string (uiout, "contents", data); | 1561 ui_out_field_string (uiout, "contents", data); |
| 1555 xfree (data); | 1562 xfree (data); |
| 1556 do_cleanups (t); | 1563 do_cleanups (t); |
| 1557 } | 1564 } |
| 1558 do_cleanups (cleanups); | 1565 do_cleanups (cleanups); |
| 1559 } | 1566 } |
| 1560 | 1567 |
| 1561 | 1568 /* Implementation of the -data-write_memory command. |
| 1562 /* DATA-MEMORY-WRITE: | |
| 1563 | 1569 |
| 1564 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The | 1570 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The |
| 1565 offset from the beginning of the memory grid row where the cell to | 1571 offset from the beginning of the memory grid row where the cell to |
| 1566 be written is. | 1572 be written is. |
| 1567 ADDR: start address of the row in the memory grid where the memory | 1573 ADDR: start address of the row in the memory grid where the memory |
| 1568 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of | 1574 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of |
| 1569 the location to write to. | 1575 the location to write to. |
| 1570 FORMAT: a char indicating format for the ``word''. See | 1576 FORMAT: a char indicating format for the ``word''. See |
| 1571 the ``x'' command. | 1577 the ``x'' command. |
| 1572 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes | 1578 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes |
| 1573 VALUE: value to be written into the memory address. | 1579 VALUE: value to be written into the memory address. |
| 1574 | 1580 |
| 1575 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE). | 1581 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE). |
| 1576 | 1582 |
| 1577 Prints nothing. */ | 1583 Prints nothing. */ |
| 1584 |
| 1578 void | 1585 void |
| 1579 mi_cmd_data_write_memory (char *command, char **argv, int argc) | 1586 mi_cmd_data_write_memory (char *command, char **argv, int argc) |
| 1580 { | 1587 { |
| 1581 struct gdbarch *gdbarch = get_current_arch (); | 1588 struct gdbarch *gdbarch = get_current_arch (); |
| 1582 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | 1589 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
| 1583 CORE_ADDR addr; | 1590 CORE_ADDR addr; |
| 1584 char word_format; | 1591 char word_format; |
| 1585 long word_size; | 1592 long word_size; |
| 1586 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big | 1593 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big |
| 1587 enough when using a compiler other than GCC. */ | 1594 enough when using a compiler other than GCC. */ |
| 1588 LONGEST value; | 1595 LONGEST value; |
| 1589 void *buffer; | 1596 void *buffer; |
| 1590 struct cleanup *old_chain; | 1597 struct cleanup *old_chain; |
| 1591 long offset = 0; | 1598 long offset = 0; |
| 1592 int optind = 0; | 1599 int oind = 0; |
| 1593 char *optarg; | 1600 char *oarg; |
| 1594 enum opt | 1601 enum opt |
| 1602 { |
| 1603 OFFSET_OPT |
| 1604 }; |
| 1605 static const struct mi_opt opts[] = |
| 1595 { | 1606 { |
| 1596 OFFSET_OPT | 1607 {"o", OFFSET_OPT, 1}, |
| 1608 { 0, 0, 0 } |
| 1597 }; | 1609 }; |
| 1598 static const struct mi_opt opts[] = | |
| 1599 { | |
| 1600 {"o", OFFSET_OPT, 1}, | |
| 1601 { 0, 0, 0 } | |
| 1602 }; | |
| 1603 | 1610 |
| 1604 while (1) | 1611 while (1) |
| 1605 { | 1612 { |
| 1606 int opt = mi_getopt ("-data-write-memory", argc, argv, opts, | 1613 int opt = mi_getopt ("-data-write-memory", argc, argv, opts, |
| 1607 » » » &optind, &optarg); | 1614 » » » &oind, &oarg); |
| 1608 | 1615 |
| 1609 if (opt < 0) | 1616 if (opt < 0) |
| 1610 break; | 1617 break; |
| 1611 switch ((enum opt) opt) | 1618 switch ((enum opt) opt) |
| 1612 { | 1619 { |
| 1613 case OFFSET_OPT: | 1620 case OFFSET_OPT: |
| 1614 » offset = atol (optarg); | 1621 » offset = atol (oarg); |
| 1615 break; | 1622 break; |
| 1616 } | 1623 } |
| 1617 } | 1624 } |
| 1618 argv += optind; | 1625 argv += oind; |
| 1619 argc -= optind; | 1626 argc -= oind; |
| 1620 | 1627 |
| 1621 if (argc != 4) | 1628 if (argc != 4) |
| 1622 error (_("-data-write-memory: Usage: " | 1629 error (_("-data-write-memory: Usage: " |
| 1623 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.")); | 1630 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.")); |
| 1624 | 1631 |
| 1625 /* Extract all the arguments. */ | 1632 /* Extract all the arguments. */ |
| 1626 /* Start address of the memory dump. */ | 1633 /* Start address of the memory dump. */ |
| 1627 addr = parse_and_eval_address (argv[0]); | 1634 addr = parse_and_eval_address (argv[0]); |
| 1628 /* The format character to use when displaying a memory word. See | 1635 /* The format character to use when displaying a memory word. See |
| 1629 the ``x'' command. */ | 1636 the ``x'' command. */ |
| 1630 word_format = argv[1][0]; | 1637 word_format = argv[1][0]; |
| 1631 /* The size of the memory word. */ | 1638 /* The size of the memory word. */ |
| 1632 word_size = atol (argv[2]); | 1639 word_size = atol (argv[2]); |
| 1633 | 1640 |
| 1634 /* Calculate the real address of the write destination. */ | 1641 /* Calculate the real address of the write destination. */ |
| 1635 addr += (offset * word_size); | 1642 addr += (offset * word_size); |
| 1636 | 1643 |
| 1637 /* Get the value as a number. */ | 1644 /* Get the value as a number. */ |
| 1638 value = parse_and_eval_address (argv[3]); | 1645 value = parse_and_eval_address (argv[3]); |
| 1639 /* Get the value into an array. */ | 1646 /* Get the value into an array. */ |
| 1640 buffer = xmalloc (word_size); | 1647 buffer = xmalloc (word_size); |
| 1641 old_chain = make_cleanup (xfree, buffer); | 1648 old_chain = make_cleanup (xfree, buffer); |
| 1642 store_signed_integer (buffer, word_size, byte_order, value); | 1649 store_signed_integer (buffer, word_size, byte_order, value); |
| 1643 /* Write it down to memory. */ | 1650 /* Write it down to memory. */ |
| 1644 write_memory (addr, buffer, word_size); | 1651 write_memory (addr, buffer, word_size); |
| 1645 /* Free the buffer. */ | 1652 /* Free the buffer. */ |
| 1646 do_cleanups (old_chain); | 1653 do_cleanups (old_chain); |
| 1647 } | 1654 } |
| 1648 | 1655 |
| 1649 /* DATA-MEMORY-WRITE-RAW: | 1656 /* Implementation of the -data-write-memory-bytes command. |
| 1650 | 1657 |
| 1651 ADDR: start address | 1658 ADDR: start address |
| 1652 DATA: string of bytes to write at that address. */ | 1659 DATA: string of bytes to write at that address. */ |
| 1660 |
| 1653 void | 1661 void |
| 1654 mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc) | 1662 mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc) |
| 1655 { | 1663 { |
| 1656 CORE_ADDR addr; | 1664 CORE_ADDR addr; |
| 1657 char *cdata; | 1665 char *cdata; |
| 1658 gdb_byte *data; | 1666 gdb_byte *data; |
| 1659 int len, r, i; | 1667 int len, r, i; |
| 1660 struct cleanup *back_to; | 1668 struct cleanup *back_to; |
| 1661 | 1669 |
| 1662 if (argc != 2) | 1670 if (argc != 2) |
| 1663 error (_("Usage: ADDR DATA.")); | 1671 error (_("Usage: ADDR DATA.")); |
| 1664 | 1672 |
| 1665 addr = parse_and_eval_address (argv[0]); | 1673 addr = parse_and_eval_address (argv[0]); |
| 1666 cdata = argv[1]; | 1674 cdata = argv[1]; |
| 1667 len = strlen (cdata)/2; | 1675 len = strlen (cdata)/2; |
| 1668 | 1676 |
| 1669 data = xmalloc (len); | 1677 data = xmalloc (len); |
| 1670 back_to = make_cleanup (xfree, data); | 1678 back_to = make_cleanup (xfree, data); |
| 1671 | 1679 |
| 1672 for (i = 0; i < len; ++i) | 1680 for (i = 0; i < len; ++i) |
| 1673 { | 1681 { |
| 1674 int x; | 1682 int x; |
| 1675 sscanf (cdata + i * 2, "%02x", &x); | 1683 sscanf (cdata + i * 2, "%02x", &x); |
| 1676 data[i] = (gdb_byte)x; | 1684 data[i] = (gdb_byte) x; |
| 1677 } | 1685 } |
| 1678 | 1686 |
| 1679 r = target_write_memory (addr, data, len); | 1687 r = target_write_memory (addr, data, len); |
| 1680 if (r != 0) | 1688 if (r != 0) |
| 1681 error (_("Could not write memory")); | 1689 error (_("Could not write memory")); |
| 1682 | 1690 |
| 1683 do_cleanups (back_to); | 1691 do_cleanups (back_to); |
| 1684 } | 1692 } |
| 1685 | 1693 |
| 1686 | |
| 1687 void | 1694 void |
| 1688 mi_cmd_enable_timings (char *command, char **argv, int argc) | 1695 mi_cmd_enable_timings (char *command, char **argv, int argc) |
| 1689 { | 1696 { |
| 1690 if (argc == 0) | 1697 if (argc == 0) |
| 1691 do_timings = 1; | 1698 do_timings = 1; |
| 1692 else if (argc == 1) | 1699 else if (argc == 1) |
| 1693 { | 1700 { |
| 1694 if (strcmp (argv[0], "yes") == 0) | 1701 if (strcmp (argv[0], "yes") == 0) |
| 1695 do_timings = 1; | 1702 do_timings = 1; |
| 1696 else if (strcmp (argv[0], "no") == 0) | 1703 else if (strcmp (argv[0], "no") == 0) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 struct inferior *inf; | 1768 struct inferior *inf; |
| 1762 | 1769 |
| 1763 if (argc != 0) | 1770 if (argc != 0) |
| 1764 error (_("-add-inferior should be passed no arguments")); | 1771 error (_("-add-inferior should be passed no arguments")); |
| 1765 | 1772 |
| 1766 inf = add_inferior_with_spaces (); | 1773 inf = add_inferior_with_spaces (); |
| 1767 | 1774 |
| 1768 ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num); | 1775 ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num); |
| 1769 } | 1776 } |
| 1770 | 1777 |
| 1771 /* Callback used to find the first inferior other than the | 1778 /* Callback used to find the first inferior other than the current |
| 1772 current one. */ | 1779 one. */ |
| 1773 | 1780 |
| 1774 static int | 1781 static int |
| 1775 get_other_inferior (struct inferior *inf, void *arg) | 1782 get_other_inferior (struct inferior *inf, void *arg) |
| 1776 { | 1783 { |
| 1777 if (inf == current_inferior ()) | 1784 if (inf == current_inferior ()) |
| 1778 return 0; | 1785 return 0; |
| 1779 | 1786 |
| 1780 return 1; | 1787 return 1; |
| 1781 } | 1788 } |
| 1782 | 1789 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1815 set_current_program_space (new_inferior->pspace); | 1822 set_current_program_space (new_inferior->pspace); |
| 1816 } | 1823 } |
| 1817 | 1824 |
| 1818 delete_inferior_1 (inf, 1 /* silent */); | 1825 delete_inferior_1 (inf, 1 /* silent */); |
| 1819 } | 1826 } |
| 1820 | 1827 |
| 1821 | 1828 |
| 1822 | 1829 |
| 1823 | 1830 |
| 1824 /* Execute a command within a safe environment. | 1831 /* Execute a command within a safe environment. |
error: old chunk mismatch |
None
| OLD | NEW |