diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2015-08-04 15:42:03 +0100 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2015-08-07 11:55:20 +0200 |
commit | 060967202b8def804d9afccad343d2eaef8a81cf (patch) | |
tree | b8f2425d843495f217fc1262949ba2ff92aa8c9e /gdb/frame.c | |
parent | 7ff38b1c898be5db053193f26d6a3a1d8a6074e8 (diff) | |
download | gdb-060967202b8def804d9afccad343d2eaef8a81cf.zip gdb-060967202b8def804d9afccad343d2eaef8a81cf.tar.gz gdb-060967202b8def804d9afccad343d2eaef8a81cf.tar.bz2 |
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.
Diffstat (limited to 'gdb/frame.c')
-rw-r--r-- | gdb/frame.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index da5bfb9..f05f739 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 |