X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finfcmd.c;h=19f720b4506c45c16d77c852e42fc3f36cd81fd8;hb=2dd4d4224afba558be14b39e2886ba47b2132678;hp=8e2f74eddbab8d18db5cf81f2e47210b02882ef2;hpb=1292279a4ef1c77bd8e6ffb26346ebc0592e1a8d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 8e2f74eddb..19f720b450 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1,6 +1,6 @@ /* Memory-access and commands for "inferior" process, for GDB. - Copyright (C) 1986-2012 Free Software Foundation, Inc. + Copyright (C) 1986-2013 Free Software Foundation, Inc. This file is part of GDB. @@ -20,7 +20,7 @@ #include "defs.h" #include "arch-utils.h" #include -#include "gdb_string.h" +#include #include "symtab.h" #include "gdbtypes.h" #include "frame.h" @@ -56,20 +56,7 @@ #include "inf-loop.h" #include "continuations.h" #include "linespec.h" - -/* Functions exported for general use, in inferior.h: */ - -void all_registers_info (char *, int); - -void registers_info (char *, int); - -void nexti_command (char *, int); - -void stepi_command (char *, int); - -void continue_command (char *, int); - -void interrupt_target_command (char *args, int from_tty); +#include "cli/cli-utils.h" /* Local functions: */ @@ -151,11 +138,6 @@ ptid_t inferior_ptid; CORE_ADDR stop_pc; -/* Flag indicating that a command has proceeded the inferior past the - current breakpoint. */ - -int breakpoint_proceeded; - /* Nonzero if stopped due to completion of a stack dummy routine. */ enum stop_stack_kind stop_stack_dummy; @@ -165,6 +147,10 @@ enum stop_stack_kind stop_stack_dummy; int stopped_by_random_signal; +/* See inferior.h. */ + +int startup_with_shell = 1; + /* Accessor routines. */ @@ -273,7 +259,7 @@ construct_inferior_arguments (int argc, char **argv) { char *result; - if (STARTUP_WITH_SHELL) + if (startup_with_shell) { #ifdef __MINGW32__ /* This holds all the characters considered special to the @@ -450,11 +436,7 @@ post_create_inferior (struct target_ops *target, int from_tty) /* Create the hooks to handle shared library load and unload events. */ -#ifdef SOLIB_CREATE_INFERIOR_HOOK - SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid)); -#else solib_create_inferior_hook (from_tty); -#endif if (current_program_space->solib_add_generation == solib_add_generation) { @@ -469,14 +451,8 @@ post_create_inferior (struct target_ops *target, int from_tty) /* If the solist is global across processes, there's no need to refetch it here. */ - if (!gdbarch_has_global_solist (target_gdbarch)) - { -#ifdef SOLIB_ADD - SOLIB_ADD (NULL, 0, target, auto_solib_add); -#else - solib_add (NULL, 0, target, auto_solib_add); -#endif - } + if (!gdbarch_has_global_solist (target_gdbarch ())) + solib_add (NULL, 0, target, auto_solib_add); } } @@ -708,6 +684,24 @@ ensure_not_tfind_mode (void) error (_("Cannot execute this command while looking at trace frames.")); } +/* Throw an error indicating the current thread is running. */ + +static void +error_is_running (void) +{ + error (_("Cannot execute this command while " + "the selected thread is running.")); +} + +/* Calls error_is_running if the current thread is running. */ + +static void +ensure_not_running (void) +{ + if (is_running (inferior_ptid)) + error_is_running (); +} + void continue_1 (int all_threads) { @@ -738,7 +732,7 @@ continue_1 (int all_threads) } /* continue [-a] [proceed-count] [&] */ -void +static void continue_command (char *args, int from_tty) { int async_exec = 0; @@ -857,13 +851,13 @@ next_command (char *count_string, int from_tty) /* Likewise, but step only one instruction. */ -void +static void stepi_command (char *count_string, int from_tty) { step_1 (0, 1, count_string); } -void +static void nexti_command (char *count_string, int from_tty) { step_1 (1, 1, count_string); @@ -1028,7 +1022,7 @@ step_once (int skip_subroutines, int single_inst, int count, int thread) CORE_ADDR pc; /* Step at an inlined function behaves like "down". */ - if (!skip_subroutines && !single_inst + if (!skip_subroutines && inline_skipped_frames (inferior_ptid)) { ptid_t resume_ptid; @@ -1056,9 +1050,14 @@ step_once (int skip_subroutines, int single_inst, int count, int thread) &tp->control.step_range_start, &tp->control.step_range_end); + tp->control.may_range_step = 1; + /* If we have no line info, switch to stepi mode. */ if (tp->control.step_range_end == 0 && step_stop_if_no_debug) - tp->control.step_range_start = tp->control.step_range_end = 1; + { + tp->control.step_range_start = tp->control.step_range_end = 1; + tp->control.may_range_step = 0; + } else if (tp->control.step_range_end == 0) { const char *name; @@ -1170,8 +1169,8 @@ jump_command (char *arg, int from_tty) if (sfn != NULL) { fixup_symbol_section (sfn, 0); - if (section_is_overlay (SYMBOL_OBJ_SECTION (sfn)) && - !section_is_mapped (SYMBOL_OBJ_SECTION (sfn))) + if (section_is_overlay (SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (sfn), sfn)) && + !section_is_mapped (SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (sfn), sfn))) { if (!query (_("WARNING!!! Destination is in " "unmapped overlay! Jump anyway? "))) @@ -1332,12 +1331,12 @@ until_next_command (int from_tty) if (!func) { - struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc); + struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc); - if (msymbol == NULL) + if (msymbol.minsym == NULL) error (_("Execution is not within a known function.")); - tp->control.step_range_start = SYMBOL_VALUE_ADDRESS (msymbol); + tp->control.step_range_start = SYMBOL_VALUE_ADDRESS (msymbol.minsym); tp->control.step_range_end = pc; } else @@ -1347,6 +1346,7 @@ until_next_command (int from_tty) tp->control.step_range_start = BLOCK_START (SYMBOL_BLOCK_VALUE (func)); tp->control.step_range_end = sal.end; } + tp->control.may_range_step = 1; tp->control.step_over_calls = STEP_OVER_ALL; @@ -1446,14 +1446,13 @@ get_return_value (struct value *function, struct type *value_type) struct regcache *stop_regs = stop_registers; struct gdbarch *gdbarch; struct value *value; - struct ui_out *uiout = current_uiout; struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); /* If stop_registers were not saved, use the current registers. */ if (!stop_regs) { stop_regs = regcache_dup (get_current_regcache ()); - cleanup = make_cleanup_regcache_xfree (stop_regs); + make_cleanup_regcache_xfree (stop_regs); } gdbarch = get_regcache_arch (stop_regs); @@ -1511,7 +1510,7 @@ print_return_value (struct value *function, struct type *value_type) ui_out_field_fmt (uiout, "gdb-result-var", "$%d", record_latest_value (value)); ui_out_text (uiout, " = "); - get_raw_print_options (&opts); + get_no_prettyformat_print_options (&opts); value_print (value, stb, &opts); ui_out_field_stream (uiout, "return-value", stb); ui_out_text (uiout, "\n"); @@ -1770,13 +1769,18 @@ finish_command (char *arg, int from_tty) if (from_tty) { printf_filtered (_("Run till exit from ")); - print_stack_frame (get_selected_frame (NULL), 1, LOCATION); + print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0); } proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 1); return; } + /* Ignore TAILCALL_FRAME type frames, they were executed already before + entering THISFRAME. */ + while (get_frame_type (frame) == TAILCALL_FRAME) + frame = get_prev_frame (frame); + /* Find the function we will return from. */ function = find_pc_function (get_frame_pc (get_selected_frame (NULL))); @@ -1790,7 +1794,7 @@ finish_command (char *arg, int from_tty) else printf_filtered (_("Run till exit from ")); - print_stack_frame (get_selected_frame (NULL), 1, LOCATION); + print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0); } if (execution_direction == EXEC_REVERSE) @@ -1834,7 +1838,7 @@ program_info (char *args, int from_tty) target_files_info (); printf_filtered (_("Program stopped at %s.\n"), - paddress (target_gdbarch, stop_pc)); + paddress (target_gdbarch (), stop_pc)); if (tp->control.stop_step) printf_filtered (_("It stopped after being stepped.\n")); else if (stat != 0) @@ -2024,15 +2028,13 @@ default_print_one_register_info (struct ui_file *file, struct value *val) { struct type *regtype = value_type (val); + int print_raw_format; fputs_filtered (name, file); print_spaces_filtered (15 - strlen (name), file); - if (!value_entirely_available (val)) - { - fprintf_filtered (file, "*value not available*\n"); - return; - } + print_raw_format = (value_entirely_available (val) + && !value_optimized_out (val)); /* If virtual format is floating, print it that way, and in raw hex. */ @@ -2052,18 +2054,12 @@ default_print_one_register_info (struct ui_file *file, value_embedded_offset (val), 0, file, 0, val, &opts, current_language); - fprintf_filtered (file, "\t(raw 0x"); - for (j = 0; j < TYPE_LENGTH (regtype); j++) + if (print_raw_format) { - int idx; - - if (byte_order == BFD_ENDIAN_BIG) - idx = j; - else - idx = TYPE_LENGTH (regtype) - 1 - j; - fprintf_filtered (file, "%02x", (unsigned char) valaddr[idx]); + fprintf_filtered (file, "\t(raw "); + print_hex_chars (file, valaddr, TYPE_LENGTH (regtype), byte_order); + fprintf_filtered (file, ")"); } - fprintf_filtered (file, ")"); } else { @@ -2078,7 +2074,7 @@ default_print_one_register_info (struct ui_file *file, file, 0, val, &opts, current_language); /* If not a vector register, print it also according to its natural format. */ - if (TYPE_VECTOR (regtype) == 0) + if (print_raw_format && TYPE_VECTOR (regtype) == 0) { get_user_print_options (&opts); opts.deref_ref = 1; @@ -2116,9 +2112,6 @@ default_print_registers_info (struct gdbarch *gdbarch, for (i = 0; i < numregs; i++) { - struct type *regtype; - struct value *val; - /* Decide between printing all regs, non-float / vector regs, or specific reg. */ if (regnum == -1) @@ -2146,16 +2139,9 @@ default_print_registers_info (struct gdbarch *gdbarch, || *(gdbarch_register_name (gdbarch, i)) == '\0') continue; - regtype = register_type (gdbarch, i); - val = allocate_value (regtype); - - /* Get the data in raw format. */ - if (! frame_register_read (frame, i, value_contents_raw (val))) - mark_value_bytes_unavailable (val, 0, TYPE_LENGTH (value_type (val))); - default_print_one_register_info (file, gdbarch_register_name (gdbarch, i), - val); + value_of_register (i, frame)); } } @@ -2182,12 +2168,8 @@ registers_info (char *addr_exp, int fpregs) char *start; const char *end; - /* Keep skipping leading white space. */ - if (isspace ((*addr_exp))) - { - addr_exp++; - continue; - } + /* Skip leading white space. */ + addr_exp = skip_spaces (addr_exp); /* Discard any leading ``$''. Check that there is something resembling a register following it. */ @@ -2271,7 +2253,7 @@ registers_info (char *addr_exp, int fpregs) } } -void +static void all_registers_info (char *addr_exp, int from_tty) { registers_info (addr_exp, 1); @@ -2347,7 +2329,7 @@ kill_command (char *arg, int from_tty) if (target_has_stack) { printf_filtered (_("In %s,\n"), target_longname); - print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } } bfd_cache_close_all (); @@ -2425,7 +2407,7 @@ attach_command_post_wait (char *args, int from_tty, int async_exec) exec_file = (char *) get_exec_file (0); if (!exec_file) { - exec_file = target_pid_to_exec_file (PIDGET (inferior_ptid)); + exec_file = target_pid_to_exec_file (ptid_get_pid (inferior_ptid)); if (exec_file) { /* It's possible we don't have a full path, but rather just a @@ -2450,7 +2432,7 @@ attach_command_post_wait (char *args, int from_tty, int async_exec) } /* Take any necessary post-attaching actions for this platform. */ - target_post_attach (PIDGET (inferior_ptid)); + target_post_attach (ptid_get_pid (inferior_ptid)); post_create_inferior (¤t_target, from_tty); @@ -2537,7 +2519,7 @@ attach_command (char *args, int from_tty) dont_repeat (); /* Not for the faint of heart */ - if (gdbarch_has_global_solist (target_gdbarch)) + if (gdbarch_has_global_solist (target_gdbarch ())) /* Don't complain if all processes share the same symbol space. */ ; @@ -2721,13 +2703,15 @@ detach_command (char *args, int from_tty) if (ptid_equal (inferior_ptid, null_ptid)) error (_("The program is not being run.")); - disconnect_tracing (from_tty); + query_if_trace_running (from_tty); + + disconnect_tracing (); target_detach (args, from_tty); /* If the solist is global across inferiors, don't clear it when we detach from a single inferior. */ - if (!gdbarch_has_global_solist (target_gdbarch)) + if (!gdbarch_has_global_solist (target_gdbarch ())) no_shared_libraries (NULL, from_tty); /* If we still have inferiors to debug, then don't mess with their @@ -2751,7 +2735,8 @@ static void disconnect_command (char *args, int from_tty) { dont_repeat (); /* Not for the faint of heart. */ - disconnect_tracing (from_tty); + query_if_trace_running (from_tty); + disconnect_tracing (); target_disconnect (args, from_tty); no_shared_libraries (NULL, from_tty); init_thread_list (); @@ -2786,7 +2771,7 @@ interrupt_target_1 (int all_threads) if the `-a' switch is used. */ /* interrupt [-a] */ -void +static void interrupt_target_command (char *args, int from_tty) { if (target_can_async_p ()) @@ -2860,10 +2845,13 @@ info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty) { struct gdbarch *gdbarch = get_current_arch (); - if (gdbarch_info_proc_p (gdbarch)) - gdbarch_info_proc (gdbarch, args, what); - else - target_info_proc (args, what); + if (!target_info_proc (args, what)) + { + if (gdbarch_info_proc_p (gdbarch)) + gdbarch_info_proc (gdbarch, args, what); + else + error (_("Not supported on this target.")); + } } /* Implement `info proc' when given without any futher parameters. */ @@ -2935,7 +2923,7 @@ _initialize_infcmd (void) { static struct cmd_list_element *info_proc_cmdlist; struct cmd_list_element *c = NULL; - char *cmd_name; + const char *cmd_name; /* Add the filename of the terminal connected to inferior I/O. */ add_setshow_filename_cmd ("inferior-tty", class_run, @@ -3099,6 +3087,7 @@ Usage: jump \n\ Give as argument either LINENUM or *ADDR, where ADDR is an expression\n\ for an address to start at.")); set_cmd_completer (c, location_completer); + add_com_alias ("j", "jump", class_run, 1); if (xdb_commands) {