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:
parent
0b45135ec1
commit
7ff38b1c89
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
||||
|
63
gdb/stack.c
63
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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user