gdb: Move get_frame_language from stack.c to frame.c.

The get_frame_language feels like it would be more at home in frame.c
rather than in stack.c, while the declaration, that is currently in
language.h can be moved into frame.h to match.

A couple of new includes are added, but otherwise no substantial change
here.

gdb/ChangeLog:

	* stack.c (get_frame_language): Moved ...
	* frame.c (get_frame_language): ... to here.
	* language.h (get_frame_language): Declaration moved to frame.h.
	* frame.h: Add language.h include, for language enum.
	(get_frame_language): Declaration moved from language.h.
	* language.c: Add frame.h include.
	* top.c: Add frame.h include.
	* symtab.h (struct obj_section): Declare.
	(struct cmd_list_element): Declare.
This commit is contained in:
Andrew Burgess 2015-08-04 15:42:03 +01:00
parent 7ff38b1c89
commit 060967202b
8 changed files with 65 additions and 44 deletions

View File

@ -1,3 +1,15 @@
2015-08-07 Andrew Burgess <andrew.burgess@embecosm.com>
* stack.c (get_frame_language): Moved ...
* frame.c (get_frame_language): ... to here.
* language.h (get_frame_language): Declaration moved to frame.h.
* frame.h: Add language.h include, for language enum.
(get_frame_language): Declaration moved from language.h.
* language.c: Add frame.h include.
* top.c: Add frame.h include.
* symtab.h (struct obj_section): Declare.
(struct cmd_list_element): Declare.
2015-08-07 Andrew Burgess <andrew.burgess@embecosm.com>
* language.c (show_language_command): Find selected frame before

View File

@ -2571,6 +2571,48 @@ frame_unwind_caller_arch (struct frame_info *next_frame)
return frame_unwind_arch (skip_artificial_frames (next_frame));
}
/* Gets the language of FRAME. */
enum language
get_frame_language (struct frame_info *frame)
{
CORE_ADDR pc = 0;
int pc_p = 0;
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
{
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);
}
return language_unknown;
}
/* Stack pointer methods. */
CORE_ADDR

View File

@ -69,6 +69,8 @@
*/
#include "language.h"
struct symtab_and_line;
struct frame_unwind;
struct frame_base;
@ -814,4 +816,9 @@ extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc);
extern int frame_unwinder_is (struct frame_info *fi,
const struct frame_unwind *unwinder);
/* Return the language of FRAME. */
extern enum language get_frame_language (struct frame_info *frame);
#endif /* !defined (FRAME_H) */

View File

@ -43,6 +43,7 @@
#include "demangle.h"
#include "symfile.h"
#include "cp-support.h"
#include "frame.h"
extern void _initialize_language (void);

View File

@ -544,8 +544,6 @@ extern const char *language_str (enum language);
extern void add_language (const struct language_defn *);
extern enum language get_frame_language (struct frame_info *frame); /* In stack.c */
/* Check for a language-specific trampoline. */
extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc);

View File

@ -2559,48 +2559,6 @@ func_command (char *arg, int from_tty)
else if (frame != get_selected_frame (NULL))
select_and_print_frame (frame);
}
/* Gets the language of FRAME. */
enum language
get_frame_language (struct frame_info *frame)
{
CORE_ADDR pc = 0;
int pc_p = 0;
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
{
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);
}
return language_unknown;
}
/* Provide a prototype to silence -Wmissing-prototypes. */

View File

@ -38,6 +38,8 @@ struct program_space;
struct language_defn;
struct probe;
struct common_block;
struct obj_section;
struct cmd_list_element;
/* Some of the structures in this file are space critical.
The space-critical structures are:

View File

@ -49,6 +49,7 @@
#include "observer.h"
#include "maint.h"
#include "filenames.h"
#include "frame.h"
/* readline include files. */
#include "readline/readline.h"