Remove "noerror" parameter from some TUI functions
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly window.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
f33c6cbf 4
f377b406
SC
5 Contributed by Hewlett-Packard Company.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
23#include <ctype.h>
24#include "symtab.h"
25#include "frame.h"
26#include "breakpoint.h"
fd0407d6 27#include "value.h"
52575520 28#include "source.h"
13274fc3 29#include "objfiles.h"
a7417d46 30#include "filenames.h"
c906108c 31
d7b2e967
AC
32#include "tui/tui.h"
33#include "tui/tui-data.h"
62f29fda 34#include "tui/tui-io.h"
d7b2e967
AC
35#include "tui/tui-stack.h"
36#include "tui/tui-win.h"
37#include "tui/tui-wingeneral.h"
38#include "tui/tui-winsource.h"
39#include "tui/tui-source.h"
40#include "tui/tui-disasm.h"
6a83354a 41#include "gdb_curses.h"
c906108c 42
1f393769 43/* Function to display the "main" routine. */
c906108c 44void
b4eb2452 45tui_display_main ()
c906108c 46{
3891b65e
TT
47 auto adapter = tui_source_windows ();
48 if (adapter.begin () != adapter.end ())
c906108c 49 {
13274fc3 50 struct gdbarch *gdbarch;
c906108c
SS
51 CORE_ADDR addr;
52
13274fc3 53 tui_get_begin_asm_address (&gdbarch, &addr);
c774cec6 54 if (addr != (CORE_ADDR) 0)
c906108c 55 {
34248c3a 56 struct symtab *s;
c906108c 57
13274fc3 58 tui_update_source_windows_with_addr (gdbarch, addr);
34248c3a
DE
59 s = find_pc_line_symtab (addr);
60 if (s != NULL)
61 tui_update_locator_fullname (symtab_to_fullname (s));
2e17b763 62 else
56d397a3 63 tui_update_locator_fullname ("??");
c906108c
SS
64 }
65 }
2e17b763 66}
c906108c
SS
67
68
69
f80bda8e
AC
70/* Function to display source in the source window. This function
71 initializes the horizontal scroll to 0. */
c906108c 72void
be4da588 73tui_update_source_window (struct tui_source_window_base *win_info,
13274fc3 74 struct gdbarch *gdbarch,
08ef48c5 75 struct symtab *s,
20149b6b 76 struct tui_line_or_address line_or_addr)
c906108c 77{
be4da588 78 win_info->horizontal_offset = 0;
20149b6b 79 tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr);
f80bda8e 80}
c906108c
SS
81
82
f80bda8e
AC
83/* Function to display source in the source/asm window. This function
84 shows the source as specified by the horizontal offset. */
c906108c 85void
be4da588 86tui_update_source_window_as_is (struct tui_source_window_base *win_info,
13274fc3 87 struct gdbarch *gdbarch,
08ef48c5 88 struct symtab *s,
20149b6b 89 struct tui_line_or_address line_or_addr)
c906108c 90{
22940a24 91 enum tui_status ret;
c906108c 92
cb2ce893 93 if (win_info->type == SRC_WIN)
20149b6b 94 ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no);
c906108c 95 else
9d391078 96 ret = tui_set_disassem_content (win_info, gdbarch, line_or_addr.u.addr);
c906108c
SS
97
98 if (ret == TUI_FAILURE)
c398c3d0 99 win_info->erase_source_content ();
c906108c
SS
100 else
101 {
0807ab7b 102 tui_update_breakpoint_info (win_info, nullptr, false);
0bd27e07 103 win_info->show_source_content ();
7ba913dc 104 win_info->update_exec_info ();
cb2ce893 105 if (win_info->type == SRC_WIN)
c906108c 106 {
51abb421
PA
107 symtab_and_line sal;
108
362c05fe 109 sal.line = line_or_addr.u.line_no +
53e7cdba 110 (win_info->content.size () - 2);
52575520 111 sal.symtab = s;
eb822aa6 112 sal.pspace = SYMTAB_PSPACE (s);
51abb421 113 set_current_source_symtab_and_line (sal);
ef5eab5a
MS
114 /* If the focus was in the asm win, put it in the src win if
115 we don't have a split layout. */
e5908723
MS
116 if (tui_win_with_focus () == TUI_DISASM_WIN
117 && tui_current_layout () != SRC_DISASSEM_COMMAND)
5813316f 118 tui_set_win_focus_to (win_info);
c906108c
SS
119 }
120 }
f80bda8e 121}
c906108c
SS
122
123
f80bda8e
AC
124/* Function to ensure that the source and/or disassemly windows
125 reflect the input address. */
c906108c 126void
13274fc3 127tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr)
c906108c 128{
c774cec6 129 if (addr != 0)
c906108c
SS
130 {
131 struct symtab_and_line sal;
362c05fe 132 struct tui_line_or_address l;
a4b99e53 133
dd1abb8c 134 switch (tui_current_layout ())
c906108c
SS
135 {
136 case DISASSEM_COMMAND:
137 case DISASSEM_DATA_COMMAND:
13274fc3 138 tui_show_disassem (gdbarch, addr);
c906108c
SS
139 break;
140 case SRC_DISASSEM_COMMAND:
13274fc3 141 tui_show_disassem_and_update_source (gdbarch, addr);
c906108c
SS
142 break;
143 default:
c774cec6 144 sal = find_pc_line (addr, 0);
362c05fe
AS
145 l.loa = LOA_LINE;
146 l.u.line_no = sal.line;
20149b6b 147 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l);
c906108c
SS
148 break;
149 }
150 }
151 else
152 {
ad54d15b 153 for (struct tui_source_window_base *win_info : tui_source_windows ())
c398c3d0 154 win_info->erase_source_content ();
c906108c 155 }
6ba8e26f 156}
c906108c 157
f80bda8e
AC
158/* Function to ensure that the source and/or disassemly windows
159 reflect the input address. */
c906108c 160void
f80bda8e 161tui_update_source_windows_with_line (struct symtab *s, int line)
c906108c 162{
13274fc3 163 struct gdbarch *gdbarch;
84b1e7c7 164 CORE_ADDR pc;
362c05fe 165 struct tui_line_or_address l;
13274fc3
UW
166
167 if (!s)
168 return;
169
eb822aa6 170 gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
13274fc3 171
dd1abb8c 172 switch (tui_current_layout ())
c906108c
SS
173 {
174 case DISASSEM_COMMAND:
175 case DISASSEM_DATA_COMMAND:
84b1e7c7 176 find_line_pc (s, line, &pc);
13274fc3 177 tui_update_source_windows_with_addr (gdbarch, pc);
c906108c
SS
178 break;
179 default:
362c05fe
AS
180 l.loa = LOA_LINE;
181 l.u.line_no = line;
20149b6b 182 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l);
dd1abb8c 183 if (tui_current_layout () == SRC_DISASSEM_COMMAND)
84b1e7c7
SC
184 {
185 find_line_pc (s, line, &pc);
13274fc3 186 tui_show_disassem (gdbarch, pc);
84b1e7c7 187 }
c906108c
SS
188 break;
189 }
f80bda8e 190}
c906108c 191
c906108c 192void
e25d2004 193tui_source_window_base::do_erase_source_content (const char *str)
c906108c 194{
6ba8e26f 195 int x_pos;
e25d2004 196 int half_width = (width - 2) / 2;
c906108c 197
c398c3d0 198 content.clear ();
e25d2004 199 if (handle != NULL)
c906108c 200 {
e25d2004
TT
201 werase (handle);
202 check_and_display_highlight_if_needed ();
caf0bc4e 203
e25d2004 204 if (strlen (str) >= half_width)
caf0bc4e
TT
205 x_pos = 1;
206 else
e25d2004
TT
207 x_pos = half_width - strlen (str);
208 mvwaddstr (handle,
209 (height / 2),
caf0bc4e 210 x_pos,
e25d2004 211 (char *) str);
93858ad3 212
e25d2004 213 refresh_window ();
93858ad3 214
e25d2004
TT
215 werase (execution_info->handle);
216 execution_info->refresh_window ();
c906108c 217 }
6ba8e26f 218}
c906108c
SS
219
220
bc712bbf
SC
221/* Redraw the complete line of a source or disassembly window. */
222static void
53e7cdba 223tui_show_source_line (struct tui_source_window_base *win_info, int lineno)
bc712bbf 224{
53e7cdba 225 struct tui_source_element *line;
798e1c30 226 int x;
bc712bbf 227
53e7cdba
TT
228 line = &win_info->content[lineno - 1];
229 if (line->is_exec_point)
cb2ce893 230 tui_set_reverse_mode (win_info->handle, true);
bc712bbf 231
cb2ce893 232 wmove (win_info->handle, lineno, 1);
53e7cdba 233 tui_puts (line->line,
cb2ce893 234 win_info->handle);
53e7cdba 235 if (line->is_exec_point)
cb2ce893 236 tui_set_reverse_mode (win_info->handle, false);
bc712bbf
SC
237
238 /* Clear to end of line but stop before the border. */
cb2ce893
TT
239 x = getcurx (win_info->handle);
240 while (x + 1 < win_info->width)
798e1c30 241 {
cb2ce893
TT
242 waddch (win_info->handle, ' ');
243 x = getcurx (win_info->handle);
798e1c30 244 }
bc712bbf
SC
245}
246
c906108c 247void
0bd27e07 248tui_source_window_base::show_source_content ()
c906108c 249{
0bd27e07 250 if (!content.empty ())
c906108c 251 {
bc712bbf
SC
252 int lineno;
253
0bd27e07
TT
254 for (lineno = 1; lineno <= content.size (); lineno++)
255 tui_show_source_line (this, lineno);
c906108c 256 }
bc712bbf 257 else
e25d2004 258 erase_source_content ();
bc712bbf 259
0bd27e07
TT
260 check_and_display_highlight_if_needed ();
261 refresh_window ();
bc712bbf 262}
c906108c 263
ad54d15b 264/* See tui-data.h. */
6f11e682 265
5104fe36
TT
266void
267tui_source_window_base::clear_detail ()
268{
269 gdbarch = NULL;
270 start_line_or_addr.loa = LOA_ADDRESS;
271 start_line_or_addr.u.addr = 0;
272 horizontal_offset = 0;
273}
274
275tui_source_window_base::tui_source_window_base (enum tui_win_type type)
276 : tui_win_info (type),
277 execution_info (new tui_exec_info_window ())
278{
279 gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
280 start_line_or_addr.loa = LOA_ADDRESS;
281 start_line_or_addr.u.addr = 0;
282}
283
284
285tui_source_window_base::~tui_source_window_base ()
286{
287 xfree (fullname);
288 delete execution_info;
289}
290
291void
ee556432
TT
292tui_source_window_base::resize (int height, int width,
293 int origin_x, int origin_y)
5104fe36 294{
ee556432
TT
295 tui_gen_win_info::resize (height, width - 3,
296 origin_x + 3, origin_y);
297 execution_info->resize (height, 3, origin_x, origin_y);
5104fe36
TT
298}
299
300/* See tui-data.h. */
301
302void
303tui_source_window_base::refresh_all ()
304{
0bd27e07 305 show_source_content ();
b4ef5aeb 306 check_and_display_highlight_if_needed ();
7ba913dc 307 update_exec_info ();
5104fe36
TT
308}
309
310/* See tui-data.h. */
311
312void
313tui_source_window_base::update_tab_width ()
314{
3df505f6
TT
315 werase (handle);
316 rerender ();
5104fe36
TT
317}
318
5104fe36 319void
3df505f6 320tui_source_window_base::rerender ()
5104fe36 321{
5104fe36
TT
322 if (!content.empty ())
323 {
324 struct tui_line_or_address line_or_addr;
325 struct symtab_and_line cursal
326 = get_current_source_symtab_and_line ();
327
328 line_or_addr = start_line_or_addr;
329 tui_update_source_window (this, gdbarch,
20149b6b 330 cursal.symtab, line_or_addr);
5104fe36
TT
331 }
332 else if (deprecated_safe_get_selected_frame () != NULL)
333 {
334 struct tui_line_or_address line;
335 struct symtab_and_line cursal
336 = get_current_source_symtab_and_line ();
337 struct frame_info *frame = deprecated_safe_get_selected_frame ();
338 struct gdbarch *gdbarch = get_frame_arch (frame);
339
340 struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
341 if (type == SRC_WIN)
342 {
343 line.loa = LOA_LINE;
344 line.u.line_no = cursal.line;
345 }
346 else
347 {
348 line.loa = LOA_ADDRESS;
349 find_line_pc (s, cursal.line, &line.u.addr);
350 }
20149b6b 351 tui_update_source_window (this, gdbarch, s, line);
5104fe36 352 }
3df505f6
TT
353 else
354 erase_source_content ();
5104fe36
TT
355}
356
357/* See tui-data.h. */
358
359void
360tui_source_window_base::make_visible (bool visible)
361{
362 execution_info->make_visible (visible);
363 tui_win_info::make_visible (visible);
364}
365
366/* See tui-data.h. */
367
368void
369tui_source_window_base::refresh_window ()
370{
371 execution_info->refresh_window ();
372 tui_win_info::refresh_window ();
373}
374
375/* See tui-data.h. */
376
6f11e682 377void
ad54d15b 378tui_source_window_base::refill ()
6f11e682
TT
379{
380 symtab *s = nullptr;
381
cb2ce893 382 if (type == SRC_WIN)
6f11e682
TT
383 {
384 symtab_and_line cursal = get_current_source_symtab_and_line ();
385 s = (cursal.symtab == NULL
386 ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
387 : cursal.symtab);
388 }
389
ad54d15b 390 tui_update_source_window_as_is (this, gdbarch, s,
20149b6b 391 content[0].line_or_addr);
6f11e682 392}
c906108c 393
f80bda8e 394/* Scroll the source forward or backward horizontally. */
6f11e682 395
c906108c 396void
c3bd716f 397tui_source_window_base::do_scroll_horizontal (int num_to_scroll)
c906108c 398{
53e7cdba 399 if (!content.empty ())
c906108c 400 {
c3bd716f
TT
401 int offset = horizontal_offset + num_to_scroll;
402 if (offset < 0)
403 offset = 0;
e6e41501 404 horizontal_offset = offset;
ad54d15b 405 refill ();
c906108c 406 }
6ba8e26f 407}
c906108c
SS
408
409
0598af48 410/* Set or clear the is_exec_point flag in the line whose line is
1cc6d956
MS
411 line_no. */
412
c906108c 413void
ad54d15b 414tui_source_window_base::set_is_exec_point_at (struct tui_line_or_address l)
c906108c 415{
02c28df0 416 bool changed = false;
c906108c 417 int i;
c906108c
SS
418
419 i = 0;
53e7cdba 420 while (i < content.size ())
c906108c 421 {
02c28df0 422 bool new_state;
362c05fe 423 struct tui_line_or_address content_loa =
53e7cdba 424 content[i].line_or_addr;
362c05fe
AS
425
426 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
427 gdb_assert (content_loa.loa == LOA_LINE
428 || content_loa.loa == LOA_ADDRESS);
429 if (content_loa.loa == l.loa
430 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
f7952c57 431 || (l.loa == LOA_ADDRESS && content_loa.u.addr == l.u.addr)))
02c28df0 432 new_state = true;
c906108c 433 else
02c28df0 434 new_state = false;
53e7cdba 435 if (new_state != content[i].is_exec_point)
00b90ae2 436 {
02c28df0 437 changed = true;
53e7cdba 438 content[i].is_exec_point = new_state;
ad54d15b 439 tui_show_source_line (this, i + 1);
00b90ae2 440 }
c906108c
SS
441 i++;
442 }
00b90ae2 443 if (changed)
ad54d15b 444 refill ();
00b90ae2 445}
c906108c 446
0807ab7b
TT
447/* See tui-winsource.h. */
448
c906108c 449void
0807ab7b 450tui_update_all_breakpoint_info (struct breakpoint *being_deleted)
c906108c 451{
ad54d15b 452 for (tui_source_window_base *win : tui_source_windows ())
c906108c 453 {
0807ab7b 454 if (tui_update_breakpoint_info (win, being_deleted, false))
00b2bad4 455 {
7ba913dc 456 win->update_exec_info ();
00b2bad4 457 }
c906108c 458 }
00b2bad4 459}
c906108c
SS
460
461
0807ab7b 462/* Scan the source window and the breakpoints to update the break_mode
1cc6d956
MS
463 information for each line.
464
0807ab7b 465 Returns true if something changed and the execution window must be
1cc6d956
MS
466 refreshed. */
467
0807ab7b
TT
468bool
469tui_update_breakpoint_info (struct tui_source_window_base *win,
470 struct breakpoint *being_deleted,
471 bool current_only)
c906108c
SS
472{
473 int i;
0807ab7b 474 bool need_refresh = false;
c906108c 475
53e7cdba 476 for (i = 0; i < win->content.size (); i++)
00b2bad4
SC
477 {
478 struct breakpoint *bp;
479 extern struct breakpoint *breakpoint_chain;
5b6fe301 480 struct tui_source_element *line;
00b2bad4 481
53e7cdba 482 line = &win->content[i];
6d012f14 483 if (current_only && !line->is_exec_point)
00b2bad4
SC
484 continue;
485
486 /* Scan each breakpoint to see if the current line has something to
487 do with it. Identify enable/disabled breakpoints as well as
488 those that we already hit. */
0598af48 489 tui_bp_flags mode = 0;
00b2bad4 490 for (bp = breakpoint_chain;
cafb3438 491 bp != NULL;
00b2bad4
SC
492 bp = bp->next)
493 {
f8eba3c6
TT
494 struct bp_location *loc;
495
362c05fe
AS
496 gdb_assert (line->line_or_addr.loa == LOA_LINE
497 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6 498
0807ab7b
TT
499 if (bp == being_deleted)
500 continue;
501
f8eba3c6
TT
502 for (loc = bp->loc; loc != NULL; loc = loc->next)
503 {
c2cd8994 504 if (win->location_matches_p (loc, i))
f8eba3c6
TT
505 {
506 if (bp->enable_state == bp_disabled)
507 mode |= TUI_BP_DISABLED;
508 else
509 mode |= TUI_BP_ENABLED;
510 if (bp->hit_count)
511 mode |= TUI_BP_HIT;
512 if (bp->loc->cond)
513 mode |= TUI_BP_CONDITIONAL;
514 if (bp->type == bp_hardware_breakpoint)
515 mode |= TUI_BP_HARDWARE;
516 }
517 }
00b2bad4 518 }
0598af48 519 if (line->break_mode != mode)
00b2bad4 520 {
0598af48
TT
521 line->break_mode = mode;
522 need_refresh = true;
00b2bad4
SC
523 }
524 }
525 return need_refresh;
526}
c906108c 527
6ba8e26f
AC
528/* Function to initialize the content of the execution info window,
529 based upon the input window which is either the source or
530 disassembly window. */
73fbdc65 531void
5216580d 532tui_source_window_base::update_exec_info ()
c906108c 533{
5216580d 534 werase (execution_info->handle);
37a4a131
TT
535 tui_update_breakpoint_info (this, nullptr, true);
536 for (int i = 0; i < content.size (); i++)
098f9ed4 537 {
5216580d
TT
538 struct tui_source_element *src_element = &content[i];
539 char element[TUI_EXECINFO_SIZE] = " ";
098f9ed4
TT
540
541 /* Now update the exec info content based upon the state
542 of each line as indicated by the source content. */
5216580d 543 tui_bp_flags mode = src_element->break_mode;
098f9ed4
TT
544 if (mode & TUI_BP_HIT)
545 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
546 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
547 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
548
549 if (mode & TUI_BP_ENABLED)
550 element[TUI_BP_BREAK_POS] = '+';
551 else if (mode & TUI_BP_DISABLED)
552 element[TUI_BP_BREAK_POS] = '-';
553
554 if (src_element->is_exec_point)
555 element[TUI_EXEC_POS] = '>';
c906108c 556
5216580d
TT
557 mvwaddstr (execution_info->handle, i + 1, 0, element);
558 }
559 execution_info->refresh_window ();
f80bda8e 560}
This page took 2.086474 seconds and 4 git commands to generate.