From 7ff38b1c898be5db053193f26d6a3a1d8a6074e8 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Tue, 14 Jul 2015 15:07:35 +0100 Subject: [PATCH] gdb: get_frame_language now takes a frame parameter. As part of a drive to remove deprecated_safe_get_selected_frame, make the get_frame_language function take a frame parameter. Given the name of the function this actually seems to make a lot of sense. The task of fetching a suitable frame is then passed to the calling functions. For get_frame_language there are not many callers, these are updated to get the selected frame in a suitable way. gdb/ChangeLog: * language.c (show_language_command): Find selected frame before asking for the language of that frame. (set_language_command): Likewise. * language.h (get_frame_language): Add frame parameter. * stack.c (get_frame_language): Add frame parameter, assert parameter is not NULL, update comment and reindent. * top.c (check_frame_language_change): Pass the selected frame into get_frame_language. --- gdb/ChangeLog | 11 +++++++++ gdb/language.c | 34 ++++++++++++++++++++------- gdb/language.h | 2 +- gdb/stack.c | 63 ++++++++++++++++++++++++-------------------------- gdb/top.c | 5 ++-- 5 files changed, 71 insertions(+), 44 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e9ba28127b..14f363880b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2015-08-07 Andrew Burgess + + * language.c (show_language_command): Find selected frame before + asking for the language of that frame. + (set_language_command): Likewise. + * language.h (get_frame_language): Add frame parameter. + * stack.c (get_frame_language): Add frame parameter, assert + parameter is not NULL, update comment and reindent. + * top.c (check_frame_language_change): Pass the selected frame + into get_frame_language. + 2015-08-07 Markus Metzger * btrace.c (btrace_compute_ftrace_bts): Clear insn flags. diff --git a/gdb/language.c b/gdb/language.c index a8b432ecf0..ab767c3aaa 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -118,7 +118,7 @@ static void show_language_command (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - enum language flang; /* The language of the current frame. */ + enum language flang; /* The language of the frame. */ if (language_mode == language_mode_auto) fprintf_filtered (gdb_stdout, @@ -130,11 +130,17 @@ show_language_command (struct ui_file *file, int from_tty, _("The current source language is \"%s\".\n"), current_language->la_name); - flang = get_frame_language (); - if (flang != language_unknown && - language_mode == language_mode_manual && - current_language->la_language != flang) - printf_filtered ("%s\n", lang_frame_mismatch_warn); + if (has_stack_frames ()) + { + struct frame_info *frame; + + frame = get_selected_frame (NULL); + flang = get_frame_language (frame); + if (flang != language_unknown + && language_mode == language_mode_manual + && current_language->la_language != flang) + printf_filtered ("%s\n", lang_frame_mismatch_warn); + } } /* Set command. Change the current working language. */ @@ -142,7 +148,7 @@ static void set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) { int i; - enum language flang; + enum language flang = language_unknown; /* Search the list of languages for a match. */ for (i = 0; i < languages_size; i++) @@ -155,7 +161,19 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) /* Enter auto mode. Set to the current frame's language, if known, or fallback to the initial language. */ language_mode = language_mode_auto; - flang = get_frame_language (); + TRY + { + struct frame_info *frame; + + frame = get_selected_frame (NULL); + flang = get_frame_language (frame); + } + CATCH (ex, RETURN_MASK_ERROR) + { + flang = language_unknown; + } + END_CATCH + if (flang != language_unknown) set_language (flang); else diff --git a/gdb/language.h b/gdb/language.h index 4ecb10320e..8782ef0d4e 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -544,7 +544,7 @@ extern const char *language_str (enum language); extern void add_language (const struct language_defn *); -extern enum language get_frame_language (void); /* In stack.c */ +extern enum language get_frame_language (struct frame_info *frame); /* In stack.c */ /* Check for a language-specific trampoline. */ diff --git a/gdb/stack.c b/gdb/stack.c index b4cfdbd40e..31a723d71c 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2560,46 +2560,43 @@ func_command (char *arg, int from_tty) select_and_print_frame (frame); } -/* Gets the language of the current frame. */ +/* Gets the language of FRAME. */ enum language -get_frame_language (void) +get_frame_language (struct frame_info *frame) { - struct frame_info *frame = deprecated_safe_get_selected_frame (); + CORE_ADDR pc = 0; + int pc_p = 0; - if (frame) + gdb_assert (frame!= NULL); + + /* We determine the current frame language by looking up its + associated symtab. To retrieve this symtab, we use the frame + PC. However we cannot use the frame PC as is, because it + usually points to the instruction following the "call", which + is sometimes the first instruction of another function. So + we rely on get_frame_address_in_block(), it provides us with + a PC that is guaranteed to be inside the frame's code + block. */ + + TRY { - CORE_ADDR pc = 0; - int pc_p = 0; + pc = get_frame_address_in_block (frame); + pc_p = 1; + } + CATCH (ex, RETURN_MASK_ERROR) + { + if (ex.error != NOT_AVAILABLE_ERROR) + throw_exception (ex); + } + END_CATCH - /* We determine the current frame language by looking up its - associated symtab. To retrieve this symtab, we use the frame - PC. However we cannot use the frame PC as is, because it - usually points to the instruction following the "call", which - is sometimes the first instruction of another function. So - we rely on get_frame_address_in_block(), it provides us with - a PC that is guaranteed to be inside the frame's code - block. */ + if (pc_p) + { + struct compunit_symtab *cust = find_pc_compunit_symtab (pc); - TRY - { - pc = get_frame_address_in_block (frame); - pc_p = 1; - } - CATCH (ex, RETURN_MASK_ERROR) - { - if (ex.error != NOT_AVAILABLE_ERROR) - throw_exception (ex); - } - END_CATCH - - if (pc_p) - { - struct compunit_symtab *cust = find_pc_compunit_symtab (pc); - - if (cust != NULL) - return compunit_language (cust); - } + if (cust != NULL) + return compunit_language (cust); } return language_unknown; diff --git a/gdb/top.c b/gdb/top.c index 3e88ac6490..0130acfeda 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -329,10 +329,11 @@ void check_frame_language_change (void) { static int warned = 0; + struct frame_info *frame; /* First make sure that a new frame has been selected, in case the command or the hooks changed the program state. */ - deprecated_safe_get_selected_frame (); + frame = deprecated_safe_get_selected_frame (); if (current_language != expected_language) { if (language_mode == language_mode_auto && info_verbose) @@ -352,7 +353,7 @@ check_frame_language_change (void) { enum language flang; - flang = get_frame_language (); + flang = get_frame_language (frame); if (!warned && flang != language_unknown && flang != current_language->la_language)