OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [tui/] [tui-hooks.c] - Blame information for rev 330

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* GDB hooks for TUI.
2
 
3
   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include "defs.h"
22
#include "symtab.h"
23
#include "inferior.h"
24
#include "command.h"
25
#include "bfd.h"
26
#include "symfile.h"
27
#include "objfiles.h"
28
#include "target.h"
29
#include "gdbcore.h"
30
#include "event-loop.h"
31
#include "event-top.h"
32
#include "frame.h"
33
#include "breakpoint.h"
34
#include "ui-out.h"
35
#include "top.h"
36
#include "observer.h"
37
#include <unistd.h>
38
#include <fcntl.h>
39
 
40
#include "tui/tui.h"
41
#include "tui/tui-hooks.h"
42
#include "tui/tui-data.h"
43
#include "tui/tui-layout.h"
44
#include "tui/tui-io.h"
45
#include "tui/tui-regs.h"
46
#include "tui/tui-win.h"
47
#include "tui/tui-stack.h"
48
#include "tui/tui-windata.h"
49
#include "tui/tui-winsource.h"
50
 
51
#include "gdb_curses.h"
52
 
53
/* This redefines CTRL if it is not already defined, so it must come
54
   after terminal state releated include files like <term.h> and
55
   "gdb_curses.h".  */
56
#include "readline/readline.h"
57
 
58
int tui_target_has_run = 0;
59
 
60
static void
61
tui_new_objfile_hook (struct objfile* objfile)
62
{
63
  if (tui_active)
64
    tui_display_main ();
65
}
66
 
67
static int ATTRIBUTE_PRINTF (1, 0)
68
tui_query_hook (const char *msg, va_list argp)
69
{
70
  int retval;
71
  int ans2;
72
  int answer;
73
 
74
  echo ();
75
  while (1)
76
    {
77
      wrap_here ("");           /* Flush any buffered output.  */
78
      gdb_flush (gdb_stdout);
79
 
80
      vfprintf_filtered (gdb_stdout, msg, argp);
81
      printf_filtered (_("(y or n) "));
82
 
83
      wrap_here ("");
84
      gdb_flush (gdb_stdout);
85
 
86
      answer = tui_getc (stdin);
87
      clearerr (stdin);         /* in case of C-d */
88
      if (answer == EOF)        /* C-d */
89
        {
90
          retval = 1;
91
          break;
92
        }
93
      /* Eat rest of input line, to EOF or newline.  */
94
      if (answer != '\n')
95
        do
96
          {
97
            ans2 = tui_getc (stdin);
98
            clearerr (stdin);
99
          }
100
        while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
101
 
102
      if (answer >= 'a')
103
        answer -= 040;
104
      if (answer == 'Y')
105
        {
106
          retval = 1;
107
          break;
108
        }
109
      if (answer == 'N')
110
        {
111
          retval = 0;
112
          break;
113
        }
114
      printf_filtered (_("Please answer y or n.\n"));
115
    }
116
  noecho ();
117
  return retval;
118
}
119
 
120
/* Prevent recursion of deprecated_register_changed_hook().  */
121
static int tui_refreshing_registers = 0;
122
 
123
static void
124
tui_register_changed_hook (int regno)
125
{
126
  struct frame_info *fi;
127
 
128
  fi = get_selected_frame (NULL);
129
  if (tui_refreshing_registers == 0)
130
    {
131
      tui_refreshing_registers = 1;
132
      tui_check_data_values (fi);
133
      tui_refreshing_registers = 0;
134
    }
135
}
136
 
137
/* Breakpoint creation hook.
138
   Update the screen to show the new breakpoint.  */
139
static void
140
tui_event_create_breakpoint (int number)
141
{
142
  tui_update_all_breakpoint_info ();
143
}
144
 
145
/* Breakpoint deletion hook.
146
   Refresh the screen to update the breakpoint marks.  */
147
static void
148
tui_event_delete_breakpoint (int number)
149
{
150
  tui_update_all_breakpoint_info ();
151
}
152
 
153
static void
154
tui_event_modify_breakpoint (int number)
155
{
156
  tui_update_all_breakpoint_info ();
157
}
158
 
159
/* Called when going to wait for the target.
160
   Leave curses mode and setup program mode.  */
161
static ptid_t
162
tui_target_wait_hook (ptid_t pid,
163
                      struct target_waitstatus *status, int options)
164
{
165
  ptid_t res;
166
 
167
  /* Leave tui mode (optional).  */
168
#if 0
169
  if (tui_active)
170
    {
171
      target_terminal_ours ();
172
      endwin ();
173
      target_terminal_inferior ();
174
    }
175
#endif
176
  tui_target_has_run = 1;
177
  res = target_wait (pid, status, options);
178
 
179
  if (tui_active)
180
    {
181
      /* TODO: need to refresh (optional).  */
182
    }
183
  return res;
184
}
185
 
186
/* The selected frame has changed.  This is happens after a target
187
   stop or when the user explicitly changes the frame
188
   (up/down/thread/...).  */
189
static void
190
tui_selected_frame_level_changed_hook (int level)
191
{
192
  struct frame_info *fi;
193
 
194
  /* Negative level means that the selected frame was cleared.  */
195
  if (level < 0)
196
    return;
197
 
198
  fi = get_selected_frame (NULL);
199
  /* Ensure that symbols for this frame are read in.  Also, determine
200
     the source language of this frame, and switch to it if
201
     desired.  */
202
  if (fi)
203
    {
204
      struct symtab *s;
205
 
206
      s = find_pc_symtab (get_frame_pc (fi));
207
      /* elz: This if here fixes the problem with the pc not being
208
         displayed in the tui asm layout, with no debug symbols.  The
209
         value of s would be 0 here, and select_source_symtab would
210
         abort the command by calling the 'error' function.  */
211
      if (s)
212
        select_source_symtab (s);
213
 
214
      /* Display the frame position (even if there is no symbols).  */
215
      tui_show_frame_info (fi);
216
 
217
      /* Refresh the register window if it's visible.  */
218
      if (tui_is_window_visible (DATA_WIN))
219
        {
220
          tui_refreshing_registers = 1;
221
          tui_check_data_values (fi);
222
          tui_refreshing_registers = 0;
223
        }
224
    }
225
}
226
 
227
/* Called from print_frame_info to list the line we stopped in.  */
228
static void
229
tui_print_frame_info_listing_hook (struct symtab *s,
230
                                   int line,
231
                                   int stopline,
232
                                   int noerror)
233
{
234
  select_source_symtab (s);
235
  tui_show_frame_info (get_selected_frame (NULL));
236
}
237
 
238
/* Called when the target process died or is detached.
239
   Update the status line.  */
240
static void
241
tui_detach_hook (void)
242
{
243
  tui_show_frame_info (0);
244
  tui_display_main ();
245
}
246
 
247
/* Observers created when installing TUI hooks.  */
248
static struct observer *tui_bp_created_observer;
249
static struct observer *tui_bp_deleted_observer;
250
static struct observer *tui_bp_modified_observer;
251
 
252
/* Install the TUI specific hooks.  */
253
void
254
tui_install_hooks (void)
255
{
256
  deprecated_target_wait_hook = tui_target_wait_hook;
257
  deprecated_selected_frame_level_changed_hook = tui_selected_frame_level_changed_hook;
258
  deprecated_print_frame_info_listing_hook = tui_print_frame_info_listing_hook;
259
 
260
  deprecated_query_hook = tui_query_hook;
261
 
262
  /* Install the event hooks.  */
263
  tui_bp_created_observer
264
    = observer_attach_breakpoint_created (tui_event_create_breakpoint);
265
  tui_bp_deleted_observer
266
    = observer_attach_breakpoint_deleted (tui_event_delete_breakpoint);
267
  tui_bp_modified_observer
268
    = observer_attach_breakpoint_modified (tui_event_modify_breakpoint);
269
 
270
  deprecated_register_changed_hook = tui_register_changed_hook;
271
  deprecated_detach_hook = tui_detach_hook;
272
}
273
 
274
/* Remove the TUI specific hooks.  */
275
void
276
tui_remove_hooks (void)
277
{
278
  deprecated_target_wait_hook = 0;
279
  deprecated_selected_frame_level_changed_hook = 0;
280
  deprecated_print_frame_info_listing_hook = 0;
281
  deprecated_query_hook = 0;
282
  deprecated_register_changed_hook = 0;
283
  deprecated_detach_hook = 0;
284
 
285
  /* Remove our observers.  */
286
  observer_detach_breakpoint_created (tui_bp_created_observer);
287
  tui_bp_created_observer = NULL;
288
  observer_detach_breakpoint_deleted (tui_bp_deleted_observer);
289
  tui_bp_deleted_observer = NULL;
290
  observer_detach_breakpoint_modified (tui_bp_modified_observer);
291
  tui_bp_modified_observer = NULL;
292
}
293
 
294
void _initialize_tui_hooks (void);
295
 
296
void
297
_initialize_tui_hooks (void)
298
{
299
  /* Install the permanent hooks.  */
300
  observer_attach_new_objfile (tui_new_objfile_hook);
301
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.