After seeing Simon's patch to change arm_per_objfile to use new and
delete, I realized it is now simple to change arm_objfile_data_key to
use the type-safe registry.
gdb/ChangeLog
2019-06-27 Tom Tromey <tromey@adacore.com>
* arm-tdep.c (arm_objfile_data_key): Move lower. Change type to
objfile_key.
(arm_find_mapping_symbol, arm_record_special_symbol)
(_initialize_arm_tdep): Update.
(arm_objfile_data_free): Remove.
Pedro and Tom both pointed out issues in the cp_print_value_fields
patch, aka the fix for PR c++/20020.
This patch addresses both issues. Tested on x86-64 Fedora 29.
gdb/ChangeLog
2019-06-27 Tom Tromey <tromey@adacore.com>
* cp-valprint.c (cp_print_value_fields): Pass opts, not options,
to cp_print_static_field.
gdb/testsuite/ChangeLog
2019-06-27 Tom Tromey <tromey@adacore.com>
* gdb.cp/constexpr-field.exp: Use setup_xfail.
For example, this code is invalid:
smc #0x6951
The code would previously check for and encode for up to 16 bit immediate values, however
this immediate should instead be only a 4 bit value
(as documented herehttps://static.docs.arm.com/ddi0406/c/DDI0406C_C_arm_architecture_reference_manual.pdf ).
Fixed this by adding range checks in the relevant areas and also removing code that would
encode more than the first 4 bits of the immediate (code that is now redundant, as any immediate operand
larger than 0xF would error now anyway).
gas * config/tc-arm.c (do_smc): Add range check for immediate operand.
(do_t_smc): Add range check for immediate operand. Remove
obsolete immediate encoding.
(md_apply_fix): Fix range check. Remove obsolete immediate encoding.
* testsuite/gas/arm/arch6zk.d: Fix test.
* testsuite/gas/arm/arch6zk.s: Fix test.
* testsuite/gas/arm/smc-bad.d: New test.
* testsuite/gas/arm/smc-bad.l: New test.
* testsuite/gas/arm/smc-bad.s: New test.
* testsuite/gas/arm/thumb32.d: Fix test.
* testsuite/gas/arm/thumb32.s: Fix test.
These encodings aren't valid in real and VM86 modes, but they are very
well usable in 16-bit protected mode.
A few adjustments in the disassembler tables are needed where Ev or Gv
were wrongly used. Additionally an adjustment is needed to avoid
printing "addr32" when that's already recognizable by the use of %eiz.
Furthermore the Iq operand template was wrong for XOP:0Ah encoding
insns: They're having a uniform 32-bit immediate. Drop Iq and introduce
Id instead.
Clone a few existing test cases to exercise assembler and disassembler.
Noticed by a customer while looking at a tangentially related problem. The
gas testsuite for xstormy16 has two scripts that have a typo on the first
line, they are missing the !. They also use shell syntax that doesn't work
on a system where /bin/sh is dash. So I fixed the typo, changed the shell
to bash, and made them executable, so that they now work when run directly
even if /bin/sh is dash.
gas/
* testsuite/gas/xstormy16/allinsn.sh: Change first line to
#!/bin/bash and make it executable.
* testsuite/gas/xstormy16/gcc.sh: Likewise.
Without the ELF header to set info->endian, it ends up as BFD_UNKNOWN_ENDIAN
which gets printed as big-endian. But RISC-V instructions are always little
endian, so we can set endian_code correctly, and then set display_endian from
that. This is similar to how the aarch64 support works, but without the
support for constant pools, as we don't have that on RISC-V.
opcodes/
PR binutils/24739
* riscv-dis.c (riscv_disasemble_insn): Set info->endian_code.
Set info->display_endian to info->endian_code.
PR 24703
binutils* bucomm.c (bfd_nonfatal): If no bfd error code has been set then
indicate this in the output.
(bfd_nonfatal_message): Likewise.
bfd * mach-o-arm.c (bfd_mach_o_arm_canonicalize_one_reloc): Add error
messages for failures.
* mach-o.c (bfd_mach_o_canonicalize_relocs): Set an bfd error code
if returning an error value.
lookup_minimal_symbol_solib_trampoline is unused, so this patch
removes it. The last use was apparently removed in
commit 61a12cfa ("Remove HPUX").
gdb/ChangeLog
2019-06-26 Tom Tromey <tromey@adacore.com>
* minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove.
* minsyms.h (lookup_minimal_symbol_solib_trampoline): Don't
declare.
Add all the CPSR flags for Armv8.1-A through to Armv8.4-A.
In addition, document all the existing flags, and remove
the superfluous empty spaces.
gdb/ChangeLog:
* features/aarch64-core.c (create_feature_aarch64_core):
Regenerate.
* features/aarch64-core.xml: Add cpsr flags.
On Arm, the OS may use the full version string for the arch name when
installing the compiler, for example armv7hl-redhat-linux-gnueabi-gcc.
Implement gdbarch_gnu_triplet_regexp for Arm to allow this to be detected.
Ensure that other Arm targets (eg iwmmxt) are not affected.
This fixes the compile/ set of tests on those systems.
gdb/ChangeLog:
2019-06-26 Alan Hayward <alan.hayward@arm.com>
* arm-tdep.c (arm_gnu_triplet_regexp): New function.
(arm_gdbarch_init): Add arm_gnu_triplet_regexp.
When we run gdb.dwarf2/varval.exp with board cc-with-dwz, we run into:
...
gdb compile failed, dwz: varval: Couldn't find DIE referenced by \
DW_OP_GNU_variable_value
cc-with-tweaks.sh: dwz did not modify varval.
UNTESTED: gdb.dwarf2/varval.exp: failed to prepare
...
The problem is that varval contains some bad DWARF, which has been added
intentionally to test GDB, but that bad DWARF causes dwz to error out, which
has the consequence that the test-case remains untested with cc-with-dwz,
while the test-case contains also correct DWARF that does not occur in any
other test, and which we would really like to test with board cc-with-dwz.
Fix this by compiling varval twice, once without and once with the bad DWARF,
such that we have at least:
...
PASS: gdb.dwarf2/varval.exp: print varval
PASS: gdb.dwarf2/varval.exp: print varval2
PASS: gdb.dwarf2/varval.exp: print constval
PASS: gdb.dwarf2/varval.exp: print mixedval
PASS: gdb.dwarf2/varval.exp: print pointerval
PASS: gdb.dwarf2/varval.exp: print *pointerval
PASS: gdb.dwarf2/varval.exp: print structval
PASS: gdb.dwarf2/varval.exp: print untypedval
gdb compile failed, dwz: varval: Couldn't find DIE referenced by \
DW_OP_GNU_variable_value
cc-with-tweaks.sh: dwz did not modify varval.
UNTESTED: gdb.dwarf2/varval.exp: failed to prepare
...
Tested on x86_64-linux.
gdb/testsuite/ChangeLog:
2019-06-26 Tom de Vries <tdevries@suse.de>
* gdb.dwarf2/varval.exp: Compile twice, once without bad DWARF.
The proc prepare_for_testing has "debug" as default argument for the options
parameter.
In the commit c596f180a1 "[gdb/testsuite] Compile index-cache.c with
-Wl,--build-id", by setting the options argument we've effectively dropped
"debug". This causes index-cache.exp to not contain any debug info anymore on
most systems (though not on openSUSE), which causes index-cache.exp FAILs.
Fix this by adding back the missing "debug" option.
Tested on x86_64-linux.
gdb/testsuite/ChangeLog:
2019-06-26 Tom de Vries <tdevries@suse.de>
* gdb.base/index-cache.exp: Add back missing debug option.
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.
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.
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.
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.
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.
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".
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.