GDB (xrefs)
tui-hooks.c
Go to the documentation of this file.
1 /* GDB hooks for TUI.
2 
3  Copyright (C) 2001-2018 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "symtab.h"
22 #include "inferior.h"
23 #include "command.h"
24 #include "bfd.h"
25 #include "symfile.h"
26 #include "objfiles.h"
27 #include "target.h"
28 #include "gdbcore.h"
29 #include "event-loop.h"
30 #include "event-top.h"
31 #include "frame.h"
32 #include "breakpoint.h"
33 #include "ui-out.h"
34 #include "top.h"
35 #include "observer.h"
36 #include <unistd.h>
37 #include <fcntl.h>
38 
39 #include "tui/tui.h"
40 #include "tui/tui-hooks.h"
41 #include "tui/tui-data.h"
42 #include "tui/tui-layout.h"
43 #include "tui/tui-io.h"
44 #include "tui/tui-regs.h"
45 #include "tui/tui-win.h"
46 #include "tui/tui-stack.h"
47 #include "tui/tui-windata.h"
48 #include "tui/tui-winsource.h"
49 
50 #include "gdb_curses.h"
51 
52 /* This redefines CTRL if it is not already defined, so it must come
53  after terminal state releated include files like <term.h> and
54  "gdb_curses.h". */
55 #include "readline/readline.h"
56 
57 static void
59 {
60  if (tui_active)
62 }
63 
64 /* Prevent recursion of deprecated_register_changed_hook(). */
65 static int tui_refreshing_registers = 0;
66 
67 /* Observer for the register_changed notification. */
68 
69 static void
70 tui_register_changed (struct frame_info *frame, int regno)
71 {
72  struct frame_info *fi;
73 
74  /* The frame of the register that was changed may differ from the selected
75  frame, but we only want to show the register values of the selected frame.
76  And even if the frames differ a register change made in one can still show
77  up in the other. So we always use the selected frame here, and ignore
78  FRAME. */
79  fi = get_selected_frame (NULL);
80  if (tui_refreshing_registers == 0)
81  {
85  }
86 }
87 
88 /* Breakpoint creation hook.
89  Update the screen to show the new breakpoint. */
90 static void
92 {
94 }
95 
96 /* Breakpoint deletion hook.
97  Refresh the screen to update the breakpoint marks. */
98 static void
100 {
102 }
103 
104 static void
106 {
108 }
109 
110 /* Refresh TUI's frame and register information. This is a hook intended to be
111  used to update the screen after potential frame and register changes.
112 
113  REGISTERS_TOO_P controls whether to refresh our register information even
114  if frame information hasn't changed. */
115 
116 static void
118 {
119  struct frame_info *fi;
120  CORE_ADDR pc;
121  int frame_info_changed_p;
122 
123  if (!has_stack_frames ())
124  return;
125 
128 
129  fi = get_selected_frame (NULL);
130  /* Ensure that symbols for this frame are read in. Also, determine
131  the source language of this frame, and switch to it if
132  desired. */
133  if (get_frame_pc_if_available (fi, &pc))
134  {
135  struct symtab *s;
136 
137  s = find_pc_line_symtab (pc);
138  /* elz: This if here fixes the problem with the pc not being
139  displayed in the tui asm layout, with no debug symbols. The
140  value of s would be 0 here, and select_source_symtab would
141  abort the command by calling the 'error' function. */
142  if (s)
144  }
145 
146  /* Display the frame position (even if there is no symbols or the PC
147  is not known). */
148  frame_info_changed_p = tui_show_frame_info (fi);
149 
150  /* Refresh the register window if it's visible. */
152  && (frame_info_changed_p || registers_too_p))
153  {
157  }
158 }
159 
160 /* Dummy callback for deprecated_print_frame_info_listing_hook which is called
161  from print_frame_info. */
162 
163 static void
165  int line,
166  int stopline,
167  int noerror)
168 {
169 }
170 
171 /* Perform all necessary cleanups regarding our module's inferior data
172  that is required after the inferior INF just exited. */
173 
174 static void
176 {
177  /* Leave the SingleKey mode to make sure the gdb prompt is visible. */
180  tui_display_main ();
181 }
182 
183 /* Observer for the before_prompt notification. */
184 
185 static void
186 tui_before_prompt (const char *current_gdb_prompt)
187 {
188  /* This refresh is intended to catch changes to the selected frame following
189  a call to "up", "down" or "frame". As such we don't necessarily want to
190  refresh registers here unless the frame actually changed by one of these
191  commands. Registers will otherwise be refreshed after a normal stop or by
192  our tui_register_changed_hook. */
193  tui_refresh_frame_and_register_information (/*registers_too_p=*/0);
194 }
195 
196 /* Observer for the normal_stop notification. */
197 
198 static void
200 {
201  /* This refresh is intended to catch changes to the selected frame and to
202  registers following a normal stop. */
203  tui_refresh_frame_and_register_information (/*registers_too_p=*/1);
204 }
205 
206 /* Observers created when installing TUI hooks. */
214 
215 /* Install the TUI specific hooks. */
216 void
218 {
219  /* If this hook is not set to something then print_frame_info will
220  assume that the CLI, not the TUI, is active, and will print the frame info
221  for us in such a way that we are not prepared to handle. This hook is
222  otherwise effectively obsolete. */
225 
226  /* Install the event hooks. */
241 }
242 
243 /* Remove the TUI specific hooks. */
244 void
246 {
249  /* Remove our observers. */
264 }
265 
266 void
268 {
269  /* Install the permanent hooks. */
271 }
static struct observer * tui_normal_stop_observer
Definition: tui-hooks.c:212
void observer_detach_breakpoint_deleted(struct observer *observer)
struct observer * observer_attach_breakpoint_deleted(observer_breakpoint_deleted_ftype *f)
struct frame_info * get_selected_frame(const char *message)
Definition: frame.c:1638
struct observer * observer_attach_before_prompt(observer_before_prompt_ftype *f)
bfd_vma CORE_ADDR
Definition: common-types.h:41
int tui_active
Definition: tui.c:60
static void tui_refresh_frame_and_register_information(int registers_too_p)
Definition: tui-hooks.c:117
int(* deprecated_query_hook)(const char *, va_list) ATTRIBUTE_FPTR_PRINTF(1
Definition: top.c:196
void observer_detach_breakpoint_modified(struct observer *observer)
int get_frame_pc_if_available(struct frame_info *frame, CORE_ADDR *pc)
Definition: frame.c:2383
void select_source_symtab(struct symtab *s)
Definition: source.c:247
static int tui_refreshing_registers
Definition: tui-hooks.c:65
void(* deprecated_print_frame_info_listing_hook)(struct symtab *s, int line, int stopline, int noerror)
Definition: top.c:190
struct observer * observer_attach_inferior_exit(observer_inferior_exit_ftype *f)
static void tui_event_create_breakpoint(struct breakpoint *b)
Definition: tui-hooks.c:91
static void tui_before_prompt(const char *current_gdb_prompt)
Definition: tui-hooks.c:186
static struct observer * tui_register_changed_observer
Definition: tui-hooks.c:213
static struct observer * tui_bp_deleted_observer
Definition: tui-hooks.c:208
void tui_install_hooks(void)
Definition: tui-hooks.c:217
void tui_set_key_mode(enum tui_key_mode mode)
Definition: tui.c:318
static struct observer * tui_bp_created_observer
Definition: tui-hooks.c:207
static void tui_normal_stop(struct bpstats *bs, int print_frame)
Definition: tui-hooks.c:199
struct observer * observer_attach_breakpoint_created(observer_breakpoint_created_ftype *f)
static struct observer * tui_before_prompt_observer
Definition: tui-hooks.c:211
static void tui_inferior_exit(struct inferior *inf)
Definition: tui-hooks.c:175
void observer_detach_breakpoint_created(struct observer *observer)
Definition: gnu-nat.c:174
static void tui_dummy_print_frame_info_listing_hook(struct symtab *s, int line, int stopline, int noerror)
Definition: tui-hooks.c:164
void observer_detach_register_changed(struct observer *observer)
static void tui_event_modify_breakpoint(struct breakpoint *b)
Definition: tui-hooks.c:105
static void ours_for_output()
Definition: target.c:501
void observer_detach_normal_stop(struct observer *observer)
void tui_check_data_values(struct frame_info *frame)
Definition: tui-windata.c:230
static void print_frame(struct frame_info *frame, int print_level, enum print_what print_what, int print_args, struct symtab_and_line sal)
static void tui_new_objfile_hook(struct objfile *objfile)
Definition: tui-hooks.c:58
int tui_is_window_visible(enum tui_win_type type)
Definition: tui.c:649
struct observer * observer_attach_register_changed(observer_register_changed_ftype *f)
struct observer * observer_attach_breakpoint_modified(observer_breakpoint_modified_ftype *f)
static struct observer * tui_inferior_exit_observer
Definition: tui-hooks.c:210
static void tui_event_delete_breakpoint(struct breakpoint *b)
Definition: tui-hooks.c:99
void tui_update_all_breakpoint_info(void)
static struct observer * tui_bp_modified_observer
Definition: tui-hooks.c:209
int tui_show_frame_info(struct frame_info *fi)
Definition: tui-stack.c:357
struct observer * observer_attach_normal_stop(observer_normal_stop_ftype *f)
struct observer * observer_attach_new_objfile(observer_new_objfile_ftype *f)
void observer_detach_before_prompt(struct observer *observer)
static void tui_register_changed(struct frame_info *frame, int regno)
Definition: tui-hooks.c:70
Definition: tui.h:41
struct symtab * find_pc_line_symtab(CORE_ADDR pc)
Definition: symtab.c:3301
void _initialize_tui_hooks(void)
Definition: tui-hooks.c:267
int has_stack_frames(void)
Definition: frame.c:1609
void tui_display_main(void)
Definition: tui-winsource.c:44
void observer_detach_inferior_exit(struct observer *observer)
void tui_remove_hooks(void)
Definition: tui-hooks.c:245