Commit Graph

98218 Commits

Author SHA1 Message Date
Simon Marchi
4838e44c8f arm-tdep: sort mapping symbols after parsing all minimal symbols
Somebody on IRC reported a while ago that loading a big ARM program in
GDB was very slow.  Their profiling pointed out that a big amount of
time was spent in

    VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);

I was able to verify this as well.

ARM mapping symbols are special ELF symbols named $a, $d and $t
indicating that symbols starting at this address up to the next mapping
symbol (in terms of address) are of type "ARM code", "data" and "Thumb
code", respectively.  GDB records these symbols in vectors (one for each
section) in arm-tdep.c.  These vectors are sorted by symbol address, to
allow for quick lookup.  The current approach is to insert new symbols
at the right position to keep the vectors sorted at all time.  This is
done based on the assumption that mapping symbols come already almost
sorted from the binary, as explains this comment in
arm_record_special_symbol:

  /* Assume that most mapping symbols appear in order of increasing
     value.  If they were randomly distributed, it would be faster to
     always push here and then sort at first use.  */

Well, it turns out this is not the case.  The original reporter
mentioned that mapping symbols in their binaries are not nearly sorted,
and this is not my experience either (at least in the binary used in the
benchmark below).  So if the values don't come nearly sorted, doing
insertions to keep the vectors sorted ends up being of the order of
number_of_mapping_symbols ^ 2.

This patch changes it just like the comment above says, to just append
to the vector in arm_record_special_symbol and sort the vector on first
use.

Benchmark
=========

I have done some benchmarks using an --enable-targets=all GDB, compiled
with -O2, running on x86-64 and parsing file
dce18d22e5c2ecb6a3a57372f4e6ef614130bc.debug from this package:

  https://launchpad.net/ubuntu/+source/firefox/66.0.3+build1-0ubuntu1/+build/16608691/+files/firefox-dbg_66.0.3+build1-0ubuntu1_armhf.deb

This file is the separate debug info for libxul.so (part of firefox) for
ARM.

I have added some traces to measure the execution time of just
elf_symtab_read and ran GDB like this:

  ./gdb --data-directory=data-directory -nx -batch  .../path/to/usr/lib/debug/.build-id/65/dce18d22e5c2ecb6a3a57372f4e6ef614130bc.debug

Since the new code sorts the vectors on first use, it would be difficult
to benchmark it as-is and be fair, since the "before" version does more
work in elf_symtab_read.  So I have actually benchmarked a version of
the patch that did sort all the vectors at the end of elf_symtab_read,
so the sorting would be considered in the measured execution time.

Here's the measured execution time of elf_symtab_read, averaged on 3
runs:

  insert sorted (before): 28.678s
  sort after (after):      1.760s

And here's the total execution time of the command above (just one run).
The time is now mostly spent in reading DWARF.

  insert sorted: 71.12s user 2.71s system 99% cpu 1:14.03 total
  sort after:    46.42s user 2.60s system 99% cpu  49.147 total

I tried for fun on my Raspberry Pi 3, the run time of
elf_symtab_read goes from ~259s to ~9s, reading the same file.

gdb/ChangeLog:

	* arm-tdep.c (struct arm_per_objfile) <section_maps_sorted>: New
	field.
	(arm_find_mapping_symbol): Sort mapping symbol vectors on first
	use.
	(arm_record_special_symbol): Don't insert new symbol in sorted
	position, push it at the end.
2019-06-25 14:22:30 -04:00
Simon Marchi
54cc7474d4 arm-tdep: replace arm_mapping_symbol VEC with std::vector
This patch replaces VEC (arm_mapping_symbol) with an std::vector.  No
functional changes intended.

gdb/ChangeLog:

	* arm-tdep.c (struct arm_mapping_symbol) (operator <): New.
	(arm_mapping_symbol_s): Remove.
	(DEF_VEC_O(arm_mapping_symbol_s)): Remove.
	(arm_mapping_symbol_vec): New typedef.
	(struct arm_per_objfile): Add constructor.
	<section_maps>: Change type to
	std::unique_ptr<arm_mapping_symbol_vec[]>.
	(arm_compare_mapping_symbols): Remove.
	(arm_find_mapping_symbol): Adjust to section_maps type change.
	(arm_objfile_data_free): Call delete on arm_per_objfile.
	(arm_record_special_symbol): Adjust to section_maps type change.
	Allocate arm_per_objfile with new.
2019-06-25 14:22:23 -04:00
Philippe Waroquiers
b65b566cdc Fix alias command not detecting non matching prefix & sometimes asserting.
alias_command does not detect that the prefixes of the alias command and the
aliased command are not matching: it is comparing the alias prefix
with itself, instead of comparing it with the aliased command prefix.

This causes either the alias command to silently do nothing,
or to have GDB asserting:
    (gdb) alias assigne imprime limite-elements = set print elements
    ../../binutils-gdb/gdb/cli/cli-cmds.c:1552: internal-error: void alias_command(const char*, int): Assertion `c_command != NULL && c_command != (struct cmd_list_element *) -1' failed.
    A problem internal to GDB has been detected,

Fix the logic, and update gdb.base/alias.exp to test these cases.

gdb/ChangeLog
2019-06-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* cli/cli-cmds.c (alias_command): Compare the alias prefix
	with the command prefix.

gdb/testsuite/ChangeLog
2019-06-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* gdb.base/alias.exp: Test non matching/non existing prefixes.
2019-06-25 19:15:16 +02:00
Faraz Shahbazker
9b444f9533 MIPS/gas: Fix order of instructions in LI macro expansion
When MTHC1 instruction is paired with MTC1 to write a value to a
64-bit FPR, the MTC1 must be executed first, because the semantic
definition of MTC1 is not aware that software will be using an MTHC1
to complete the operation, and sets the upper half of the 64-bit FPR
to an UNPREDICTABLE value[1].

Fix the order of MTHC1 and MTC1 instructions in LI macro expansion.
Modify the expansions to exploit moves from $zero directly by-passing
the use of $AT, where ever possible.

[1] "MIPS Architecture for Programmers Volume II-A: The MIPS32
     Instruction Set Manual", Wave Computing, Inc., Document
     Number: MD00086, Revision 5.04, December 11, 2013, Section 3.2
     "Alphabetical List of Instructions", pp. 217.

gas/
	* config/tc-mips.c (macro) <M_LI>: Re-order MTHC1 with
	respect to MTC1 and use $0 for either part where possible.
	* testsuite/gas/mips/li-d.s: Add test cases for non-zero
	words in double precision constants.
	* testsuite/gas/mips/li-d.d: Update reference output.
	* testsuite/gas/mips/micromips@isa-override-1.d: Likewise.
	* testsuite/gas/mips/mips32r2@isa-override-1.d: Likewise.
	* testsuite/gas/mips/mips64r2@isa-override-1.d: Likewise.
2019-06-25 09:29:55 -07:00
Tom de Vries
5c2c8c694d [gdb/testsuite] Regenerate dw2-restrict.S
When running gdb.dwarf2/dw2-restrict.exp with board cc-with-dwz, we run into:
...
dwz: dw2-restrict: DW_AT_stmt_list not DW_FORM_sec_offset or DW_FORM_data4
...

The problem is that the DW_AT_stmt_list is encoded using DW_FORM_addr, while
DW_FORM_sec_offset or DW_FORM_data4 would be appropriate.  The test-case uses
a dw2-restrict.S which was generated using clang 2.9, which contained a bug
( https://bugs.llvm.org/show_bug.cgi?id=9995 ) causing this problem.

Fix this by regenerating using clang 5.0.1.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-06-25  Tom de Vries  <tdevries@suse.de>

	PR testsuite/24727
	* gdb.dwarf2/dw2-restrict.S: Regenerate using clang 5.0.1.
2019-06-25 16:42:46 +02:00
Tom Tromey
c2fc64f54e Tidy tui_delete_win
tui_delete_win does its own NULL check, so ~tui_gen_win_info does not
need to do it.  Also, tui_delete_win has an extraneous "return".

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_delete_win): Remove "return".
	* tui/tui-data.c (~tui_gen_win_info): Remove "if".
2019-06-25 07:48:52 -06:00
Tom Tromey
fb54fa768d Make tui_gen_win_info constructor protected
Now that all the window types have their own concrete classes, the
tui_gen_win_info constructor can be protected.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-layout.c (init_and_make_win): Assert on unrecognized
	type.
	* tui/tui-data.h (struct tui_gen_win_info): Make constructor
	protected.
2019-06-25 07:48:51 -06:00
Tom Tromey
f7952c5774 Fix latent bug in set_is_exec_point_at
valgrind pointed out that the TUI was using uninitialized memory in
set_is_exec_point_at.  The bug is a missing check against LOA_ADDRESS,
causing gdb to examine the uninitialized bits of the "addr" field.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c
	(tui_source_window_base::set_is_exec_point_at): Add check against
	LOA_ADDRESS.
2019-06-25 07:48:51 -06:00
Tom Tromey
17568d782d Remove NULL checks before xfree
A couple of spots in the TUI did a NULL check before an xfree.  This
isn't necessary, and most other cases were removed from gdb a while
ago.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-source.c (tui_set_source_content): Don't check before
	xfree.
	* tui/tui-disasm.c (tui_disassemble): Don't check before xfree.
2019-06-25 07:48:51 -06:00
Tom Tromey
53e7cdbaa1 Remove union tui_which_element
This removes union tui_which_element, instead moving the content
directly into tui_source_window_base.  This allows for the deletion of
a fair amount of code.  Now the TUI window hierarchy is more
type-safe.  In particular, there is never any confusion now about
which members are in use by which subtype.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_update_source_window_as_is)
	(tui_alloc_source_buffer, tui_line_is_displayed)
	(tui_addr_is_displayed): Change type of win_info.
	* tui/tui-winsource.c (tui_update_source_window_as_is)
	(tui_clear_source_content, tui_show_source_line)
	(tui_show_source_content, tui_source_window_base::refill)
	(tui_source_window_base::set_is_exec_point_at)
	(tui_source_window_base::set_is_exec_point_at)
	(tui_update_breakpoint_info, tui_set_exec_info_content): Update.
	(tui_alloc_source_buffer, tui_line_is_displayed)
	(tui_addr_is_displayed): Change type of win_info.  Update.
	* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
	(tui_source_window_base::do_make_visible_with_new_height):
	Update.
	* tui/tui-source.c (tui_set_source_content)
	(tui_set_source_content_nil)
	(tui_source_window::do_scroll_vertical): Update.
	* tui/tui-layout.c (show_layout): Update.
	* tui/tui-disasm.c (tui_set_disassem_content)
	(tui_disasm_window::do_scroll_vertical): Update.
	* tui/tui-data.h (tui_win_content): Remove.
	(struct tui_gen_win_info) <content, content_size>: Remove.
	(struct tui_source_element): Add initializers and destructor.
	(union tui_which_element, struct tui_win_element): Remove.
	(struct tui_source_window_base) <content>: New field.
	(struct tui_data_window): Remove destructor.
	(tui_alloc_content, tui_free_win_content)
	(tui_free_all_source_wins_content): Don't declare.
	* tui/tui-data.c (tui_initialize_static_data): Update.
	(init_content_element, tui_alloc_content): Remove.
	(~tui_gen_win_info): Update.
	(~tui_data_window, tui_free_all_source_wins_content)
	(tui_free_win_content, free_content, free_content_elements):
	Remove.
2019-06-25 07:48:50 -06:00
Tom Tromey
7908abbf18 More type safety for TUI source window functions
A few functions can only operate on a source or disassembly window.
This patch adds a bit more type safety to a few of these functions.
This simplifies a subsequent patch.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_clear_source_content)
	(tui_erase_source_content, tui_show_source_content): Change type
	of win_info.
	* tui/tui-winsource.c (tui_clear_source_content)
	(tui_erase_source_content, tui_show_source_content): Change type
	of win_info.
	* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights): Update.
	* tui/tui-source.h (tui_set_source_content_nil): Change type of
	win_info.
	* tui/tui-source.c (tui_set_source_content_nil): Change type of
	win_info.
	* tui/tui-layout.c (show_source_or_disasm_and_command): Update.
2019-06-25 07:48:50 -06:00
Tom Tromey
02c28df011 Use bool for is_exec_point
This changes tui_source_element::is_exec_point to be a bool.  I looked
at also changing "has_break", but it turns out that this field is used
inconsistently (sometimes as flags and sometimes as a bool), and so
needs more invesstigation before it can be changed.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c (tui_clear_source_content)
	(tui_source_window_base::set_is_exec_point_at): Update.
	* tui/tui-source.c (tui_set_source_content_nil): Update.
	* tui/tui-data.h (struct tui_source_element) <is_exec_point>: Now
	a bool.
	* tui/tui-data.c (init_content_element): Update.
2019-06-25 07:48:49 -06:00
Tom Tromey
6658b1bf6c Fix "auxiliary" typo
The TUI has a function called tui_win_is_auxillary, but the word
should actually be spelled "auxiliary".  This fixes the typo.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_gen_win_info::make_visible): Update.
	* tui/tui-win.c (make_invisible_and_set_new_height): Update.
	* tui/tui-layout.c (init_and_make_win): Update.
	* tui/tui.h (enum tui_win_type): Update.
	* tui/tui-data.h (tui_win_is_auxiliary): Rename from
	tui_win_is_auxillary.
	* tui/tui-data.c (tui_win_is_auxiliary): Rename from
	tui_win_is_auxillary.
2019-06-25 07:48:49 -06:00
Tom Tromey
21e1c91ef9 Separate out data window
This removes "data_window" from union tui_which_element and updates
the uses.  It also changes how tui_data_window refers to the register
data, and changes it not to need the "content" field at all (though as
this is in a base class, it can't yet be removed).

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_data_window::refresh_window): Update.
	* tui/tui-windata.c (tui_data_window::first_data_item_displayed)
	(tui_delete_data_content_windows, tui_display_all_data)
	(tui_data_window::do_scroll_vertical, tui_display_data_from):
	Update.
	* tui/tui-win.c (tui_data_window::set_new_height): Simplify.
	* tui/tui-regs.c (tui_last_regs_line_no)
	(tui_line_from_reg_element_no, tui_first_reg_element_no_inline)
	(tui_show_registers): Update.
	(tui_show_register_group): Return void.  Update.
	(tui_display_registers_from, tui_display_reg_element_at_line)
	(tui_display_registers_from_line, tui_check_register_values):
	Update.
	* tui/tui-data.h (union tui_which_element) <data_window>: Remove
	member.
	(struct tui_data_window) <regs_content>: Now a std::vector.
	<regs_content_count>: Remove.
	(tui_add_content_elements, tui_free_data_content): Don't declare.
	* tui/tui-data.c (tui_data_window::clear_detail): Update.
	(init_content_element): Remove DATA_WIN case.  Add assert.
	(tui_add_content_elements): Remove.
	(tui_data_window): Update.
	(tui_free_data_content): Remove.
	(free_content_elements): Remove DATA_WIN case.
2019-06-25 07:48:48 -06:00
Tom Tromey
115ac53b85 Remove "data_content" and "data_content_count" from TUI data window
The TUI has some stub code for adding data other than registers to the
data window.  However, it doesn't do anything, and apparently never
has.  This removes the dead code.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-data.c (tui_data_item_window): Update.
	* tui/tui-windata.h (tui_check_data_values): Don't declare.
	* tui/tui-windata.c (tui_display_all_data)
	(tui_display_data_from_line): Update.
	(tui_check_data_values): Remove.
	* tui/tui-regs.c (tui_show_register_group)
	(tui_display_reg_element_at_line): Update.
	* tui/tui-hooks.c (tui_register_changed)
	(tui_refresh_frame_and_register_information): Call
	tui_check_register_values.
	* tui/tui-data.h (struct tui_data_window) <data_content,
	data_content_count, data_type>: Remove.
	(enum tui_data_type): Remove.
2019-06-25 07:48:48 -06:00
Tom Tromey
eaf9738bed Turn tui_first_data_item_displayed into a method
tui_first_data_item_displayed is only called from tui_data_window
methods, so turn it into a method as well.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-windata.h (tui_first_data_item_displayed): Don't
	declare.
	* tui/tui-windata.c (tui_data_window::first_data_item_displayed):
	Rename from tui_first_data_item_displayed.  Update.
	(tui_data_window::refresh_all)
	(tui_data_window::do_scroll_vertical): Update.
	* tui/tui-data.h (struct tui_data_window)
	<first_data_item_displayed>: Declare new method.
2019-06-25 07:48:48 -06:00
Tom Tromey
31ca47237f Remove tui_init_generic_part
tui_init_generic_part has a single caller, so simply inline it there.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-data.h (tui_init_generic_part): Don't declare.
	* tui/tui-data.c (tui_init_generic_part): Remove, moving
	contents...
	(tui_initialize_static_data): ...here.
2019-06-25 07:48:47 -06:00
Tom Tromey
41bcff7fee Separate out data item window
This introduces a new subclass of tui_gen_win_info for the data item
windows, letting us remove another element from tui_which_element.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-regs.c (tui_show_registers, tui_show_register_group)
	(tui_display_registers_from, tui_check_register_values): Update.
	(tui_display_register): Remove win_info parameter; update.
	(tui_get_register): Change type of parameters.
	* tui/tui-data.h (struct tui_data_element): Remove.
	(union tui_which_element) <data>: Remove.
	<data_window>: Change type.
	(struct tui_data_item_window): New.
	* tui/tui-data.c (init_content_element): Remove DATA_ITEM_WIN
	case.  Add assert.
	(~tui_data_item_window): New destructor.
	(free_content_elements): Remove DATA_ITEM_WIN case.
2019-06-25 07:48:47 -06:00
Tom Tromey
d2802c3342 Remove two unused enum constants from tui_win_type
This removes a couple of unused constants from enum tui_win_type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui.h (enum tui_win_type) <MAX_WINDOWS, UNDEFINED_WIN>:
	Remove.
2019-06-25 07:48:46 -06:00
Tom Tromey
dd835f8b70 Remove command from tui_which_element
union tui_which_element has a "command" member, but it is never used.
This removes it.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-data.h (struct tui_command_element): Remove.
	(union tui_which_element) <command>: Remove.
	* tui/tui-data.c (init_content_element): Remove CMD_WIN case.  Add
	assert.
	(free_content_elements): Remove CMD_WIN case.
2019-06-25 07:48:46 -06:00
Tom Tromey
bd7db367c4 Remove layout_def::split
The "split" field in struct layout_def is never used, so this patch
removes it.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-layout.c (tui_set_layout): Update.
	* tui/tui-data.h (struct tui_layout_def) <split>: Remove.
	* tui/tui-data.c (layout_def): Update.
2019-06-25 07:48:45 -06:00
Tom Tromey
3add462fff Separate out locator window
This introduces a new subclass of tui_gen_win_info for the locator,
letting us remove another element from union tui_which_element.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_refresh_all): Update.
	* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
	(tui_source_window_base::set_new_height): Update.
	* tui/tui-stack.c (tui_make_status_line): Change parameter type.
	Update.
	(tui_set_locator_fullname, tui_set_locator_info)
	(tui_show_frame_info): Update.
	* tui/tui-source.c (tui_set_source_content)
	(tui_source_is_displayed): Update.
	* tui/tui-layout.c (show_source_disasm_command, show_data)
	(show_source_or_disasm_and_command): Update.
	* tui/tui-disasm.c (tui_set_disassem_content)
	(tui_get_begin_asm_address): Update.
	* tui/tui-data.h (struct tui_locator_element): Remove.
	(union tui_which_element) <locator>: Remove.
	(struct tui_locator_window): New.
	(tui_locator_win_info_ptr): Change return type.
	* tui/tui-data.c (_locator): Change type.
	(tui_locator_win_info_ptr): Change return type.
	(init_content_element): Remove LOCATOR_WIN case.  Add assert.
	(tui_alloc_content): Add assert.
2019-06-25 07:48:45 -06:00
Tom Tromey
489e9d8b7b Separate out execution-info window
This pulls the EXEC_INFO_WIN case out into its own subclass of
tui_gen_win_info.  This lets us remove an element from
union tui_which_element.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c
	(tui_exec_info_window::maybe_allocate_content): New method.
	(tui_set_exec_info_content, tui_show_exec_info_content): Update.
	* tui/tui-layout.c (init_and_make_win): Add EXEC_INFO_WIN case.
	(make_source_or_disasm_window): Add cast.
	* tui/tui-data.h (union tui_which_element) <simple_string>:
	Remove.
	(struct tui_source_info): New.
	(struct tui_source_window_base) <execution_info>: Change type.
	* tui/tui-data.c (init_content_element): Remove EXEC_INFO_WIN
	case, and add assert.
	(tui_alloc_content): Add assert.
2019-06-25 07:48:44 -06:00
Tom Tromey
c3fabb7d69 Remove tui_alloc_win_info
There is only a single caller of tui_alloc_win_info, and we're going
to add more "new" cases to that caller, so remove tui_alloc_win_info
and inline it into init_and_make_win.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-data.h (tui_alloc_win_info): Don't declare.
	* tui/tui-layout.c (init_and_make_win): Use "new" directly.
	* tui/tui-data.c (tui_alloc_win_info): Remove.
2019-06-25 07:48:44 -06:00
Tom Tromey
bbc228ee05 Don't check window type in tui_set_win_focus_to
This changes tui_set_win_focus_to so that it no longer checks the
window type.  Instead, now tui_unhighlight_win also checks whether the
window can be highlighted.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_set_win_focus_to): Don't check window type.
	* tui/tui-wingeneral.c (tui_unhighlight_win): Check
	can_highlight.
2019-06-25 07:48:44 -06:00
Tom Tromey
5fcee43a96 Introduce tui_win_info::make_visible_with_new_height
This changes make_visible_with_new_height to be a method on
tui_win_info, letting us remove a spot that checks the window type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_source_window_base::update_tab_width): Call
	make_visible_with_new_height method.
	(tui_win_info::make_visible_with_new_height): New method.
	(tui_source_window_base::do_make_visible_with_new_height)
	(tui_data_window::do_make_visible_with_new_height)
	(tui_cmd_window::do_make_visible_with_new_height): New methods.
	(make_visible_with_new_height): Remove.
	(tui_resize_all, tui_adjust_win_heights): Use
	make_visible_with_new_height method.
	* tui/tui-data.h (struct tui_win_info)
	<do_make_visible_with_new_height, make_visible_with_new_height>:
	New methods.
	(struct tui_source_window_base, struct tui_data_window)
	(struct tui_cmd_window) <do_make_visible_with_new_height>: New
	methods.
2019-06-25 07:48:43 -06:00
Tom Tromey
d83f1fe65d Introduce tui_win_info::update_tab_width
This introduces a new tui_win_info::update_tab_width method, and
changes the TUI to call it.  This fixes another spot that was checking
the window type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_source_window_base::update_tab_width): New
	method.
	(update_tab_width): Call update_tab_width method.
	* tui/tui-data.h (struct tui_win_info)
	(struct tui_source_window_base) <update_tab_width>: New methods.
2019-06-25 07:48:43 -06:00
Tom Tromey
17374de40e Introduce enum tui_box
This adds a new enum to the TUI, replacing two #define constants,
providing better type safety.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.h (tui_make_window): Change type of "box_it"
	parameter.
	* tui/tui-wingeneral.c (tui_make_window): Change type of "box_it"
	parameter.
	(tui_gen_win_info::make_visible): Update.
	* tui/tui-layout.c (init_and_make_win): Change type of "box_it"
	parameter.
	* tui/tui-data.h (enum tui_box): New enum.
	(BOX_WINDOW, DONT_BOX_WINDOW): Remove defines.
2019-06-25 07:48:42 -06:00
Tom Tromey
f936bca26d Remove some TUI static allocations
The TUI statically allocates the "execution_info" for the source and
disassembly windows.  However, there's no deep reason to do this, and
this approach makes it harder to allow multiple such windows.

This patch removes the static data and changes the code to simply
allocate these windows as needed.  This required pushing some code
into the tui_gen_win_info destructor, but that seems like a good idea
anyhow.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-layout.c (make_source_or_disasm_window): Always use
	init_and_make_win for EXEC_INFO_WIN.
	* tui/tui-data.h (struct tui_gen_win_info) <~tui_gen_win_info>: No
	longer inline.
	(struct tui_win_info) <~tui_win_info>: Inline.
	(tui_source_exec_info_win_ptr, tui_disassem_exec_info_win_ptr):
	Don't declare.
	* tui/tui-data.c (source_win, disasm_win): Remove globals.
	(tui_source_exec_info_win_ptr, tui_disassem_exec_info_win_ptr):
	Remove.
	(tui_initialize_static_data): Update.
	(~tui_gen_win_info): Handle more cleanup here.
	(~tui_source_window_base): Delete "execution_info".
	(~tui_win_info): Move code to ~tui_gen_win_info; remove.
2019-06-25 07:48:42 -06:00
Tom Tromey
d6ba6a1164 Introduce tui_gen_win_info::reset method
This introduces the tui_gen_win_info::reset method and changes various
places to use it.  This led to the realization that the can_highlight
member only needs to be set during construction, so this patch makes
that change as well.  Finally, init_and_make_win is drastically
simplified.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-layout.c (make_command_window): Don't set
	can_highlight.
	(show_source_disasm_command): Call the reset method.
	(show_data): Don't set can_highlight.  Call the reset method.
	(tui_gen_win_info::reset): Rename from init_gen_win_info
	(init_and_make_win): Simplify.  Return tui_gen_win_info.
	(show_source_or_disasm_and_command): Call the reset method.
	* tui/tui-data.h (struct tui_gen_win_info) <reset>: New method.
	(struct tui_cmd_window): Set can_highlight.
2019-06-25 07:48:41 -06:00
Tom Tromey
48a3bd16c2 Move make_visible method to tui_gen_win_info
This moves the make_visible method from tui_win_info to its base
class, tui_gen_win_info.  This allows the removal of another window
type check.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_gen_win_info::make_visible): Rename
	from make_visible.
	(tui_make_visible, tui_make_invisible): Rewrite.
	(tui_win_info::make_visible): Remove.
	(tui_source_window_base::make_visible): Update.
	* tui/tui-data.h (struct tui_gen_win_info) <make_visible>: New
	method.  Moved from...
	(struct tui_win_info) <make_visible>: ...here.
2019-06-25 07:48:41 -06:00
Tom Tromey
c3bd716ffc Remove tui_scroll_direction enum
The tui_scroll_direction enum is not really needed, because it's
simple to adapt the various scrolling methods to use the sign of their
argument as the direction in which to scroll.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c
	(tui_source_window_base::do_scroll_horizontal): Remove direction
	parameter.
	* tui/tui-windata.c (tui_data_window::do_scroll_vertical): Remove
	direction parameter.
	* tui/tui-win.c (tui_win_info::forward_scroll)
	(tui_win_info::backward_scroll, tui_win_info::left_scroll)
	(tui_win_info::right_scroll): Update.
	* tui/tui-source.c (tui_source_window::do_scroll_vertical): Remove
	direction parameter.
	* tui/tui-disasm.c (tui_disasm_window::do_scroll_vertical): Remove
	direction parameter.
	* tui/tui-data.h (enum tui_scroll_direction): Remove.
	(struct tui_win_info) <do_scroll_vertical, do_scroll_horizontal>:
	Remove direction parameter.
	(struct tui_source_window_base, struct tui_source_window)
	(struct tui_disasm_window, struct tui_data_window)
	(struct tui_cmd_window): Update.
2019-06-25 07:48:41 -06:00
Tom Tromey
21c32dca76 Change more TUI functions to take a tui_source_window_base
Several more TUI functions should only be called with a source or
disassembly window.  This patch changes these functions so that this
can be caught at compile time.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_set_exec_info_content)
	(tui_show_exec_info_content, tui_erase_exec_info_content)
	(tui_clear_exec_info_content, tui_update_exec_info): Change
	argument to tui_source_window_base.
	* tui/tui-winsource.c (tui_set_exec_info_content)
	(tui_show_exec_info_content, tui_erase_exec_info_content)
	(tui_clear_exec_info_content, tui_update_exec_info): Change
	argument to tui_source_window_base.
2019-06-25 07:48:40 -06:00
Tom Tromey
73fbdc65a1 Change tui_set_exec_info_content to return void
tui_set_exec_info_content can't return an error, so change it to
return void instead.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_set_exec_info_content): Return void.
	* tui/tui-winsource.c (tui_set_exec_info_content): Return void.
2019-06-25 07:48:40 -06:00
Tom Tromey
3332534318 Remove NULL check from tui_set_exec_info_content
tui_set_exec_info_content ensures that the window's "execution_info"
is allocated, so the NULL check here is redundant and can be removed.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c (tui_set_exec_info_content): Remove NULL
	check.
2019-06-25 07:48:39 -06:00
Tom Tromey
29d2c474f5 Change tui_alloc_source_buffer return type to void
tui_alloc_source_buffer can't actually fail, so change its return type
to void and update the callers.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_alloc_source_buffer): Change return
	type to void.
	* tui/tui-winsource.c (tui_alloc_source_buffer): Change return
	type to void.
	* tui/tui-source.c (tui_set_source_content): Update.
	* tui/tui-disasm.c (tui_set_disassem_content): Update.
2019-06-25 07:48:39 -06:00
Tom Tromey
152f3f4b33 Introduce tui_gen_win_info::name method
This removes tui_win_name and replaces it with a method on
tui_gen_win_info, removing another spot that switched on window type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (window_name_completer, tui_set_focus)
	(tui_all_windows_info): Use name method.
	* tui/tui-data.h (struct tui_gen_win_info)
	(struct tui_source_window, struct tui_disasm_window)
	(struct tui_data_window, struct tui_cmd_window) <name>: New
	method.
	(tui_win_name): Don't declare.
	* tui/tui-data.c (tui_partial_win_by_name): Use name method.
	(tui_win_name): Remove.
2019-06-25 07:48:38 -06:00
Tom Tromey
be4da58857 Change tui_update_source_window for better type safety
tui_update_source_window can only be called for source and disassembly
windows, so change the argument type to enforce this at compile time.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_update_source_window)
	(tui_update_source_window_as_is): Change parameter type.
	* tui/tui-winsource.c (tui_update_source_window): Change win_info
	to be a tui_source_window_base.
	(tui_update_source_window_as_is): Likewise.
	* tui/tui-win.c (make_visible_with_new_height): Update.
2019-06-25 07:48:38 -06:00
Tom Tromey
5b81daba91 Introduce refresh_window method
This replaces tui_refresh_win with a new refresh_window method.  This
removes another spot that was checking the window's type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.c (tui_erase_source_content)
	(tui_show_source_content, tui_show_exec_info_content)
	(tui_erase_exec_info_content): Use refresh_window method.
	* tui/tui-wingeneral.h (tui_refresh_win): Don't declare.
	* tui/tui-wingeneral.c (tui_gen_win_info::refresh_window): Rename
	from tui_refresh_win.
	(tui_data_window::refresh_window): New method.
	(tui_win_info::refresh, tui_source_window_base::refresh)
	(tui_refresh_all): Use refresh_window method.
	* tui/tui-stack.c (tui_show_locator_content): Call refresh_window
	method.
	* tui/tui-regs.c (tui_display_register): Call refresh_window
	method.
	* tui/tui-layout.c (show_source_disasm_command)
	(show_source_or_disasm_and_command): Call refresh_window method.
	* tui/tui-data.h (struct tui_gen_win_info)
	(struct tui_data_window, struct tui_cmd_window) <refresh_window>:
	New method.
2019-06-25 07:48:38 -06:00
Tom Tromey
cb2ce89305 Derive tui_win_info from tui_gen_win_info
This changes tui_win_info to derive from tui_gen_win_info, rather than
having a tui_gen_win_info as a member.  This removes a layer of member
access from the entire TUI, which is why this patch is so large.  This
change will enable further removal of switches based on window type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui.c (tui_rl_other_window, tui_enable)
	(tui_is_window_visible, tui_get_command_dimension): Update.
	* tui/tui-winsource.c (tui_update_source_window_as_is)
	(tui_clear_source_content, tui_erase_source_content)
	(tui_show_source_line, tui_source_window_base::refill)
	(tui_source_window_base::do_scroll_horizontal)
	(tui_source_window_base::set_is_exec_point_at)
	(tui_update_breakpoint_info, tui_set_exec_info_content)
	(tui_alloc_source_buffer, tui_line_is_displayed)
	(tui_addr_is_displayed): Update.
	* tui/tui-wingeneral.c (tui_unhighlight_win, tui_highlight_win)
	(tui_check_and_display_highlight_if_needed)
	(tui_win_info::make_visible, tui_win_info::refresh)
	(tui_refresh_all): Update.
	* tui/tui-windata.c (tui_first_data_item_displayed)
	(tui_delete_data_content_windows, tui_erase_data_content)
	(tui_display_all_data, tui_data_window::refresh_all)
	(tui_check_data_values): Update.
	* tui/tui-win.c (window_name_completer, tui_update_gdb_sizes)
	(tui_set_win_focus_to, tui_win_info::forward_scroll)
	(tui_win_info::backward_scroll, tui_refresh_all_win)
	(tui_resize_all, tui_set_focus, tui_all_windows_info)
	(update_tab_width, tui_set_win_height, tui_adjust_win_heights)
	(tui_source_window_base::set_new_height)
	(tui_data_window::set_new_height)
	(make_invisible_and_set_new_height)
	(make_visible_with_new_height, new_height_ok)
	(parse_scrolling_args): Update.
	* tui/tui-stack.c (tui_show_frame_info): Update.
	* tui/tui-source.c (tui_set_source_content)
	(tui_set_source_content_nil, tui_source_is_displayed)
	(tui_source_window::do_scroll_vertical): Update.
	* tui/tui-regs.c (tui_show_registers, tui_show_register_group)
	(tui_display_registers_from, tui_display_reg_element_at_line)
	(tui_check_register_values, tui_reg_command): Update.
	* tui/tui-layout.c (tui_default_win_height)
	(show_source_disasm_command, show_data, init_and_make_win)
	(show_source_or_disasm_and_command): Update.
	* tui/tui-io.c (update_cmdwin_start_line, tui_putc, tui_puts)
	(tui_redisplay_readline, tui_mld_flush)
	(tui_mld_erase_entire_line, tui_mld_getc, tui_cont_sig)
	(tui_getc): Update.
	* tui/tui-disasm.c (tui_set_disassem_content)
	(tui_disasm_window::do_scroll_vertical): Update.
	* tui/tui-data.h (struct tui_gen_win_info) <~tui_gen_win_info>:
	Now virtual.
	(struct tui_win_info): Derive from tui_gen_win_info.
	<~tui_win_info>: Mark as override.
	<generic>: Remove member.
	* tui/tui-data.c (tui_cmd_window::clear_detail, tui_next_win)
	(tui_prev_win, tui_partial_win_by_name, tui_win_info)
	(~tui_data_window, ~tui_win_info)
	(tui_free_all_source_wins_content): Update.
	* tui/tui-command.c (tui_refresh_cmd_win): Update.
2019-06-25 07:48:37 -06:00
Tom Tromey
ab313b35e5 Use new and delete for tui_gen_win_info
This changes tui_gen_win_info to be allocated with new and destroyed
with delete.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-layout.c (init_and_make_win): Use new.
	* tui/tui-data.h (struct tui_gen_win_info): Add constructor,
	destructor, initializers.
	(tui_alloc_generic_win_info): Don't declare.
	* tui/tui-data.c (_locator): Add argument to constructor.
	(source_win, disasm_win): New globals.
	(exec_info): Remove.
	(tui_source_exec_info_win_ptr, tui_disassem_exec_info_win_ptr):
	Update.
	(tui_alloc_generic_win_info): Remove.
	(init_content_element): Use new.
	(tui_win_info::tui_win_info): Update.
	(free_content_elements) <case DATA_WIN>: Use delete.
2019-06-25 07:48:37 -06:00
Tom Tromey
dc2c33e456 Change tui_which_element::data_window to be a pointer
A coming patch will add a constructor to tui_gen_win_info.  However,
because the tui_which_element union contains an object of this type,
first something must be done here in order to avoid having a union
with a member that has a constructor.  This patch changes this element
to be a pointer instead.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_refresh_win): Update.
	* tui/tui-windata.c (tui_first_data_item_displayed)
	(tui_delete_data_content_windows): Update.
	* tui/tui-win.c (tui_data_window::set_new_height): Update.
	* tui/tui-regs.c (tui_show_registers, tui_show_register_group)
	(tui_display_registers_from, tui_check_register_values): Update.
	* tui/tui-data.h (union tui_which_element) <data_window>: Now a
	pointer.
	* tui/tui-data.c (init_content_element): Update.  Allocate the new
	window.
	(tui_free_data_content): Update.
	(free_content_elements) <case DATA_WIN>: Free the window.
2019-06-25 07:48:36 -06:00
Tom Tromey
214a5cbea6 Introduce set_highlight method
This introduces the tui_win_info::set_highlight method, and changes
the highlighting-related code to use bool rather than int.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_unhighlight_win, tui_highlight_win):
	Update.
	* tui/tui-layout.c (make_command_window)
	(show_source_disasm_command, show_data, init_and_make_win)
	(show_source_or_disasm_and_command): Update.
	* tui/tui-data.h (struct tui_win_info) <set_highlight>: New
	method.
	<can_highight, is_highlighted>: Now bool.
	(tui_set_win_highlight): Don't declare.
	* tui/tui-data.c (tui_set_win_highlight): Remove.
2019-06-25 07:48:36 -06:00
Tom Tromey
8e2daf1532 Remove redundant check from make_visible
This removes a check of the window type from make_visible.  This
function already checks that the window type is not CMD_WIN near the
top, so this condition can never be false.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (make_visible): Remove check of window
	type.
2019-06-25 07:48:35 -06:00
Tom Tromey
8903bd8a37 Introduce max_height method
This introduces the tui_win_info::max_height method and changes
new_height_ok to use it, rather than checking the window type
directly.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_win_info::max_height)
	(tui_cmd_window::max_height): New methods.
	(new_height_ok): Call max_height.
	* tui/tui-data.h (struct tui_win_info, struct tui_cmd_window)
	<max_height>: New method.
2019-06-25 07:48:35 -06:00
Tom Tromey
3f02ce1e3d Introduce set_new_height method
This introduces tui_win_info::set_new_height and implements it in the
subclasses as appropriate.  This removes another switch on the window
type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_source_window_base::set_new_height)
	(tui_data_window::set_new_height): New methods.
	(make_invisible_and_set_new_height): Call set_new_height method.
	* tui/tui-data.h (struct tui_win_info)
	(struct tui_source_window_base, struct tui_data_window)
	<set_new_height>: New method.
2019-06-25 07:48:34 -06:00
Tom Tromey
1825f487ae Introduce the refresh_all method
This introduces the tui_win_info::refresh_all method and implements it
as needed in subclasses.  The name and comment are a bit of a guess on
my part.  The main benefit of this patch is removing another switch on
the type of the window.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui.c (tui_rl_other_window): Call the refresh_all method.
	* tui/tui-windata.c (tui_data_window::refresh_all): Rename from
	tui_refresh_data_win.
	* tui/tui-win.c (tui_source_window_base::refresh_all): New
	method.
	(tui_refresh_all_win): Call the refresh_all method.
	(tui_set_focus): Likewise.
	* tui/tui-data.h (struct tui_win_info) <refresh_all>: New method.
	(struct tui_source_window_base, struct tui_data_window) <refresh>:
	Likewise.
2019-06-25 07:48:34 -06:00
Tom Tromey
ad54d15bdb Introduce two TUI source window methods
This adds two methods to the TUI source window.  These are just
renamings of existing functions.  It also changes the source window
list to have a more precise type, letting the code be more type-safe.
This will be useful again later.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_refill_source_window)
	(tui_set_is_exec_point_at): Don't declare.
	* tui/tui-winsource.c (tui_update_source_windows_with_addr)
	(tui_source_window_base::refill): Rename from
	tui_refill_source_window.
	(tui_source_window_base::do_scroll_horizontal): Update.
	(tui_source_window_base::set_is_exec_point_at): Rename from
	tui_set_is_exec_point_at.
	(tui_update_all_breakpoint_info): Update.
	* tui/tui-stack.c (tui_show_frame_info): Update.
	* tui/tui-layout.c (show_data): Add cast.
	* tui/tui-hooks.c (tui_redisplay_source): Call refill method.
	* tui/tui-data.h (struct tui_source_window_base) <refill,
	set_is_exec_point_at>: New methods.
	(tui_source_windows, tui_add_to_source_windows): Update types.
	(tui_add_to_source_windows): Remove redundant declaration.
	* tui/tui-data.c (source_windows): Store tui_source_window_base.
	(tui_source_windows): Change return type.
	(tui_clear_source_windows_detail): Update.
	(tui_add_to_source_windows): Change type of parameter.
	(tui_free_all_source_wins_content): Update.
2019-06-25 07:48:34 -06:00
Tom Tromey
2042b506c8 Introduce the refresh method
This adds tui_win_info::refresh and updates tui_source_window_base to
implement it as well.  This lets us simplify tui_refresh_all, removing
a check of the window type.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.c (tui_win_info::refresh)
	(tui_source_window_base::refresh): New methods.
	(tui_refresh_all): Call the refresh method.
	* tui/tui-data.h (struct tui_win_info)
	(struct tui_source_window_base) <refresh>: New method.
2019-06-25 07:48:33 -06:00
Tom Tromey
56122977c0 Use bool for visibility
This changes the visibility-related functions and data members in the
TUI to use bool rather than int.

gdb/ChangeLog
2019-06-25  Tom Tromey  <tom@tromey.com>

	* tui/tui.h (tui_is_window_visible): Return bool.
	* tui/tui.c (tui_is_window_visible): Return bool.
	* tui/tui-wingeneral.c (tui_make_window, make_visible)
	(tui_make_visible, tui_make_invisible)
	(tui_win_info::make_visible)
	(tui_source_window_base::make_visible, make_all_visible)
	(tui_make_all_visible, tui_make_all_invisible): Update.
	* tui/tui-windata.c (tui_delete_data_content_windows): Update.
	* tui/tui-data.h (struct tui_gen_win_info) <is_visible>: Now
	bool.
	(struct tui_win_info, struct tui_source_window_base)
	(struct tui_cmd_window) <make_visible>: Change parameter to bool.
	* tui/tui-data.c (tui_init_generic_part): Update.
2019-06-25 07:48:33 -06:00