From 060967202b8def804d9afccad343d2eaef8a81cf Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Tue, 4 Aug 2015 15:42:03 +0100 Subject: [PATCH] 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. --- gdb/ChangeLog | 12 ++++++++++++ gdb/frame.c | 42 ++++++++++++++++++++++++++++++++++++++++++ gdb/frame.h | 7 +++++++ gdb/language.c | 1 + gdb/language.h | 2 -- gdb/stack.c | 42 ------------------------------------------ gdb/symtab.h | 2 ++ gdb/top.c | 1 + 8 files changed, 65 insertions(+), 44 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 14f363880b..ce42136baf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2015-08-07 Andrew Burgess + + * 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 * language.c (show_language_command): Find selected frame before diff --git a/gdb/frame.c b/gdb/frame.c index da5bfb9ee4..f05f739676 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -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 diff --git a/gdb/frame.h b/gdb/frame.h index be64c57ac8..03f38925db 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -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) */ diff --git a/gdb/language.c b/gdb/language.c index ab767c3aaa..4937b7d0c8 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -43,6 +43,7 @@ #include "demangle.h" #include "symfile.h" #include "cp-support.h" +#include "frame.h" extern void _initialize_language (void); diff --git a/gdb/language.h b/gdb/language.h index 8782ef0d4e..2265afcbfc 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -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); diff --git a/gdb/stack.c b/gdb/stack.c index 31a723d71c..ae53ec8b3f 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -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. */ diff --git a/gdb/symtab.h b/gdb/symtab.h index 61fc8c5c79..e90ce00428 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -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: diff --git a/gdb/top.c b/gdb/top.c index 0130acfeda..061b52fbaa 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -49,6 +49,7 @@ #include "observer.h" #include "maint.h" #include "filenames.h" +#include "frame.h" /* readline include files. */ #include "readline/readline.h" -- 2.34.1