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.
This commit is contained in:
Andrew Burgess 2015-07-14 15:07:35 +01:00
parent 0b45135ec1
commit 7ff38b1c89
5 changed files with 71 additions and 44 deletions

View File

@ -1,3 +1,14 @@
2015-08-07 Andrew Burgess <andrew.burgess@embecosm.com>
* 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 <markus.t.metzger@intel.com>
* btrace.c (btrace_compute_ftrace_bts): Clear insn flags.

View File

@ -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

View File

@ -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. */

View File

@ -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;

View File

@ -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)