From e17c207e88cbd63e9dc9dce1f3458a8ced4ff566 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Thu, 2 Jul 2009 17:02:35 +0000 Subject: [PATCH] * arch-utils.c (selected_byte_order): Return target_byte_order_user. (show_endian): Use target_byte_order_user if specified; otherwise use get_current_arch () instead of current_gdbarch. (show_architecture): Use set_architecture_string if specified; otherwise use get_current_arch () instead of current_gdbarch. (get_current_arch): New function. * arch-utils.h (get_current_arch): Add prototype. * osabi.c (show_osabi): Use get_current_arch () instead of current_gdbarch. * findcmd.c: Include "arch-utils.h". (parse_find_args): Add BIG_P argument. Use it instead of byte order of current_gdbarch. (find_command): Use get_current_arch () instead of current_gdbarch. Pass byte order to parse_find_args. * maint.c: Include "arch-utils.h". (maintenance_print_architecture): Use get_current_arch () instead of current_gdbarch. * reggroups.c: Include "arch-utils.h". (maintenance_print_reggroups): Use get_current_arch () instead of current_gdbarch. * symfile.c: Include "arch-utils.h". (overlay_load_command): Use get_current_arch () instead of current_gdbarch. * value.c: Include "arch-utils.h". (show_convenience): Use get_current_arch () instead of current_gdbarch. * tui/tui-regs.c: Include "arch-utils.h". (tui_reg_next_command): Use get_current_arch () instead of current_gdbarch. * mi/mi-main.c: Include "arch-utils.h". (mi_cmd_data_read_memory): Use get_current_arch () instead of current_gdbarch. * parse.c: Include "arch-utils.h". (parse_exp_in_context): Use get_current_arch () instead of current_gdbarch. --- gdb/ChangeLog | 47 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/arch-utils.c | 31 ++++++++++++++++++++---------- gdb/arch-utils.h | 8 ++++++++ gdb/findcmd.c | 10 ++++++---- gdb/maint.c | 7 +++++-- gdb/mi/mi-main.c | 3 ++- gdb/osabi.c | 2 +- gdb/parse.c | 3 ++- gdb/reggroups.c | 7 +++++-- gdb/symfile.c | 7 +++++-- gdb/tui/tui-regs.c | 7 +++++-- gdb/value.c | 3 ++- 12 files changed, 109 insertions(+), 26 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fcb9e80596c..4c7df3e8310 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,50 @@ +2009-07-02 Ulrich Weigand + + * arch-utils.c (selected_byte_order): Return target_byte_order_user. + (show_endian): Use target_byte_order_user if specified; otherwise + use get_current_arch () instead of current_gdbarch. + (show_architecture): Use set_architecture_string if specified; + otherwise use get_current_arch () instead of current_gdbarch. + (get_current_arch): New function. + * arch-utils.h (get_current_arch): Add prototype. + + * osabi.c (show_osabi): Use get_current_arch () instead of + current_gdbarch. + + * findcmd.c: Include "arch-utils.h". + (parse_find_args): Add BIG_P argument. Use it instead of byte order + of current_gdbarch. + (find_command): Use get_current_arch () instead of current_gdbarch. + Pass byte order to parse_find_args. + + * maint.c: Include "arch-utils.h". + (maintenance_print_architecture): Use get_current_arch () instead + of current_gdbarch. + + * reggroups.c: Include "arch-utils.h". + (maintenance_print_reggroups): Use get_current_arch () instead + of current_gdbarch. + + * symfile.c: Include "arch-utils.h". + (overlay_load_command): Use get_current_arch () instead of + current_gdbarch. + + * value.c: Include "arch-utils.h". + (show_convenience): Use get_current_arch () instead of + current_gdbarch. + + * tui/tui-regs.c: Include "arch-utils.h". + (tui_reg_next_command): Use get_current_arch () instead of + current_gdbarch. + + * mi/mi-main.c: Include "arch-utils.h". + (mi_cmd_data_read_memory): Use get_current_arch () instead of + current_gdbarch. + + * parse.c: Include "arch-utils.h". + (parse_exp_in_context): Use get_current_arch () instead of + current_gdbarch. + 2009-07-02 Ulrich Weigand * gdbtypes.c (make_pointer_type, make_reference_type, diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index c1ea9da3636..76c96e5e513 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -260,10 +260,7 @@ static const char *set_endian_string; enum bfd_endian selected_byte_order (void) { - if (target_byte_order_user != BFD_ENDIAN_UNKNOWN) - return gdbarch_byte_order (current_gdbarch); - else - return BFD_ENDIAN_UNKNOWN; + return target_byte_order_user; } /* Called by ``show endian''. */ @@ -273,14 +270,14 @@ show_endian (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { if (target_byte_order_user == BFD_ENDIAN_UNKNOWN) - if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) + if (gdbarch_byte_order (get_current_arch ()) == BFD_ENDIAN_BIG) fprintf_unfiltered (file, _("The target endianness is set automatically " "(currently big endian)\n")); else fprintf_unfiltered (file, _("The target endianness is set automatically " "(currently little endian)\n")); else - if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) + if (target_byte_order_user == BFD_ENDIAN_BIG) fprintf_unfiltered (file, _("The target is assumed to be big endian\n")); else @@ -418,14 +415,13 @@ static void show_architecture (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - const char *arch; - arch = gdbarch_bfd_arch_info (current_gdbarch)->printable_name; if (target_architecture_user == NULL) fprintf_filtered (file, _("\ -The target architecture is set automatically (currently %s)\n"), arch); +The target architecture is set automatically (currently %s)\n"), + gdbarch_bfd_arch_info (get_current_arch ())->printable_name); else fprintf_filtered (file, _("\ -The target architecture is assumed to be %s\n"), arch); +The target architecture is assumed to be %s\n"), set_architecture_string); } @@ -720,6 +716,21 @@ gdbarch_info_fill (struct gdbarch_info *info) gdb_assert (info->bfd_arch_info != NULL); } +/* Return "current" architecture. If the target is running, this is the + architecture of the selected frame. Otherwise, the "current" architecture + defaults to the target architecture. + + This function should normally be called solely by the command interpreter + routines to determine the architecture to execute a command in. */ +struct gdbarch * +get_current_arch (void) +{ + if (has_stack_frames ()) + return get_frame_arch (get_selected_frame (NULL)); + else + return target_gdbarch; +} + /* */ extern initialize_file_ftype _initialize_gdbarch_utils; /* -Wmissing-prototypes */ diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h index c4e09807181..555ff59a645 100644 --- a/gdb/arch-utils.h +++ b/gdb/arch-utils.h @@ -139,4 +139,12 @@ extern void gdbarch_info_fill (struct gdbarch_info *info); extern struct gdbarch *gdbarch_from_bfd (bfd *abfd); +/* Return "current" architecture. If the target is running, this is the + architecture of the selected frame. Otherwise, the "current" architecture + defaults to the target architecture. + + This function should normally be called solely by the command interpreter + routines to determine the architecture to execute a command in. */ +extern struct gdbarch *get_current_arch (void); + #endif diff --git a/gdb/findcmd.c b/gdb/findcmd.c index 09d93fced10..b701d93c93c 100644 --- a/gdb/findcmd.c +++ b/gdb/findcmd.c @@ -18,6 +18,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include #include "gdb_string.h" #include "gdbcmd.h" @@ -50,7 +51,8 @@ put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) static void parse_find_args (char *args, ULONGEST *max_countp, char **pattern_bufp, ULONGEST *pattern_lenp, - CORE_ADDR *start_addrp, ULONGEST *search_space_lenp) + CORE_ADDR *start_addrp, ULONGEST *search_space_lenp, + bfd_boolean big_p) { /* Default to using the specified type. */ char size = '\0'; @@ -67,7 +69,6 @@ parse_find_args (char *args, ULONGEST *max_countp, CORE_ADDR start_addr; ULONGEST search_space_len; char *s = args; - bfd_boolean big_p = gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG; struct cleanup *old_cleanups; struct value *v; @@ -239,6 +240,8 @@ parse_find_args (char *args, ULONGEST *max_countp, static void find_command (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + bfd_boolean big_p = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG; /* Command line parameters. These are initialized to avoid uninitialized warnings from -Wall. */ ULONGEST max_count = 0; @@ -252,7 +255,7 @@ find_command (char *args, int from_tty) struct cleanup *old_cleanups; parse_find_args (args, &max_count, &pattern_buf, &pattern_len, - &start_addr, &search_space_len); + &start_addr, &search_space_len, big_p); old_cleanups = make_cleanup (free_current_contents, &pattern_buf); @@ -294,7 +297,6 @@ find_command (char *args, int from_tty) set_internalvar_integer (lookup_internalvar ("numfound"), found_count); if (found_count > 0) { - struct gdbarch *gdbarch = current_gdbarch; struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; set_internalvar (lookup_internalvar ("_"), value_from_pointer (ptr_type, last_found_addr)); diff --git a/gdb/maint.c b/gdb/maint.c index 56cafe9ae3e..ae465ce638c 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -22,6 +22,7 @@ #include "defs.h" +#include "arch-utils.h" #include #include #include "command.h" @@ -411,8 +412,10 @@ maintenance_print_statistics (char *args, int from_tty) static void maintenance_print_architecture (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + if (args == NULL) - gdbarch_dump (current_gdbarch, gdb_stdout); + gdbarch_dump (gdbarch, gdb_stdout); else { struct cleanup *cleanups; @@ -420,7 +423,7 @@ maintenance_print_architecture (char *args, int from_tty) if (file == NULL) perror_with_name (_("maintenance print architecture")); cleanups = make_cleanup_ui_file_delete (file); - gdbarch_dump (current_gdbarch, file); + gdbarch_dump (gdbarch, file); do_cleanups (cleanups); } } diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index a96d43cea2c..aa176f715ac 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -23,6 +23,7 @@ /* Work in progress. */ #include "defs.h" +#include "arch-utils.h" #include "target.h" #include "inferior.h" #include "gdb_string.h" @@ -828,7 +829,7 @@ mi_cmd_data_evaluate_expression (char *command, char **argv, int argc) void mi_cmd_data_read_memory (char *command, char **argv, int argc) { - struct gdbarch *gdbarch = current_gdbarch; + struct gdbarch *gdbarch = get_current_arch (); struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); CORE_ADDR addr; long total_bytes; diff --git a/gdb/osabi.c b/gdb/osabi.c index 6024419325b..778dedcf4b6 100644 --- a/gdb/osabi.c +++ b/gdb/osabi.c @@ -596,7 +596,7 @@ show_osabi (struct ui_file *file, int from_tty, struct cmd_list_element *c, if (user_osabi_state == osabi_auto) fprintf_filtered (file, _("The current OS ABI is \"auto\" (currently \"%s\").\n"), - gdbarch_osabi_name (gdbarch_osabi (current_gdbarch))); + gdbarch_osabi_name (gdbarch_osabi (get_current_arch ()))); else fprintf_filtered (file, _("The current OS ABI is \"%s\".\n"), gdbarch_osabi_name (user_selected_osabi)); diff --git a/gdb/parse.c b/gdb/parse.c index 8e0373fa7cc..ef938e37d8b 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -34,6 +34,7 @@ #include #include "defs.h" +#include "arch-utils.h" #include "gdb_string.h" #include "symtab.h" #include "gdbtypes.h" @@ -1086,7 +1087,7 @@ parse_exp_in_context (char **stringptr, struct block *block, int comma, expout = (struct expression *) xmalloc (sizeof (struct expression) + EXP_ELEM_TO_BYTES (expout_size)); expout->language_defn = current_language; - expout->gdbarch = current_gdbarch; + expout->gdbarch = get_current_arch (); TRY_CATCH (except, RETURN_MASK_ALL) { diff --git a/gdb/reggroups.c b/gdb/reggroups.c index 080342206cb..171fc366549 100644 --- a/gdb/reggroups.c +++ b/gdb/reggroups.c @@ -20,6 +20,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "reggroups.h" #include "gdbtypes.h" #include "gdb_assert.h" @@ -230,8 +231,10 @@ reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file) static void maintenance_print_reggroups (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + if (args == NULL) - reggroups_dump (current_gdbarch, gdb_stdout); + reggroups_dump (gdbarch, gdb_stdout); else { struct cleanup *cleanups; @@ -239,7 +242,7 @@ maintenance_print_reggroups (char *args, int from_tty) if (file == NULL) perror_with_name (_("maintenance print reggroups")); cleanups = make_cleanup_ui_file_delete (file); - reggroups_dump (current_gdbarch, file); + reggroups_dump (gdbarch, file); do_cleanups (cleanups); } } diff --git a/gdb/symfile.c b/gdb/symfile.c index 25f3f26bc1d..cecbda46d70 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -22,6 +22,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "bfdlink.h" #include "symtab.h" #include "gdbtypes.h" @@ -3643,8 +3644,10 @@ overlay_off_command (char *args, int from_tty) static void overlay_load_command (char *args, int from_tty) { - if (gdbarch_overlay_update_p (current_gdbarch)) - gdbarch_overlay_update (current_gdbarch, NULL); + struct gdbarch *gdbarch = get_current_arch (); + + if (gdbarch_overlay_update_p (gdbarch)) + gdbarch_overlay_update (gdbarch, NULL); else error (_("This target does not know how to read its overlay state.")); } diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index c7ad138f748..bfb66f820fb 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -21,6 +21,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "tui/tui.h" #include "tui/tui-data.h" #include "symtab.h" @@ -558,14 +559,16 @@ tui_display_register (struct tui_data_element *data, static void tui_reg_next_command (char *arg, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + if (TUI_DATA_WIN != 0) { struct reggroup *group = TUI_DATA_WIN->detail.data_display_info.current_group; - group = reggroup_next (current_gdbarch, group); + group = reggroup_next (gdbarch, group); if (group == 0) - group = reggroup_next (current_gdbarch, 0); + group = reggroup_next (gdbarch, 0); if (group) tui_show_registers (group); diff --git a/gdb/value.c b/gdb/value.c index fb8da3e3194..4632ae4056c 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -20,6 +20,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "gdb_string.h" #include "symtab.h" #include "gdbtypes.h" @@ -1448,7 +1449,7 @@ preserve_values (struct objfile *objfile) static void show_convenience (char *ignore, int from_tty) { - struct gdbarch *gdbarch = current_gdbarch; + struct gdbarch *gdbarch = get_current_arch (); struct internalvar *var; int varseen = 0; struct value_print_options opts; -- 2.30.2