Tom Tromey [Mon, 1 Jul 2019 20:41:28 +0000 (14:41 -0600)]
Remove tui_make_visible and tui_make_invisible
tui_make_visible and tui_make_invisible are just wrappers for a method
call, so remove them and have the callers simply make the method call
themselves.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-wingeneral.h (tui_make_visible, tui_make_invisible):
Don't declare.
* tui/tui-wingeneral.c (tui_make_visible, tui_make_invisible):
Remove.
* tui/tui-win.c (tui_source_window_base::set_new_height)
(tui_source_window_base::set_new_height)
(make_invisible_and_set_new_height)
(tui_source_window_base::do_make_visible_with_new_height)
(tui_source_window_base::do_make_visible_with_new_height):
Update.
* tui/tui-layout.c (show_source_disasm_command, show_data)
(show_source_or_disasm_and_command): Update.
* tui/tui-layout.c (show_layout): Update.
Tom Tromey [Mon, 1 Jul 2019 20:37:38 +0000 (14:37 -0600)]
Remove make_data_window
As with the previous patches, unifying the creation and
re-initialization cases for the data window lets us remove
make_data_window in favor of simply using "new".
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (make_data_window): Remove.
(show_data): Unify creation and re-initialization cases.
Tom Tromey [Mon, 1 Jul 2019 20:37:04 +0000 (14:37 -0600)]
Remove make_source_window and make_disasm_window
This unifies the remaining creation and re-initialization cases for
the source and disassembly windows. Once this is done, it's clear
that make_source_window and make_disasm_window aren't needed any more,
so remove them.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (make_source_window, make_disasm_window):
Remove.
(show_data): Unify creation and re-initialization cases.
Tom Tromey [Mon, 1 Jul 2019 20:26:42 +0000 (14:26 -0600)]
Remove make_command_window
This unifies the creation and re-initialization cases for the command
window. When this is done, it becomes clear that make_command_window
isn't needed -- it can be replaced with a simple "new", so this is
removed as well.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (make_command_window): Remove.
(show_source_disasm_command, show_source_or_disasm_and_command):
Unify creation and re-initialization cases.
Tom Tromey [Mon, 1 Jul 2019 06:55:14 +0000 (00:55 -0600)]
Simplify show_source_or_disasm_and_command
This changes show_source_or_disasm_and_command to unify the creation
and re-initialization cases.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (show_source_or_disasm_and_command): Unify
creation and re-initialization cases.
Tom Tromey [Mon, 1 Jul 2019 06:51:20 +0000 (00:51 -0600)]
Change tui_get_register to return void
tui_get_register returns a tui_status, but nothing checks this, so it
can return void instead.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.c (tui_get_register): Return void.
Tom Tromey [Mon, 1 Jul 2019 05:30:28 +0000 (23:30 -0600)]
Simplify tui_gen_win_info::make_visible
I noticed that tui_gen_win_info::make_visible was much wordier than it
needed to be. This simplifies it.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-wingeneral.c (tui_gen_win_info::make_visible):
Simplify.
Tom Tromey [Mon, 1 Jul 2019 02:46:18 +0000 (20:46 -0600)]
Simplify show_source_disasm_command
This is the first of a few patches to further simplify window
(re-)initialization in tui-layout.c. When changing the layout, a
window may be created or, if it already exists, simply resized. These
two cases normally are identical, but this was obscured by the way the
code was written. This patch changes show_source_disasm_command to
unify the creation and re-initialization cases.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (show_source_disasm_command): Simplify window
resetting.
Tom Tromey [Mon, 1 Jul 2019 02:43:32 +0000 (20:43 -0600)]
Clean up tui_layout_command
tui_layout_command is a simple wrapper for tui_set_layout_by_name.
This removes the extra layer and cleans up the resulting function a
bit -- changing it to call error rather than return a result. This
necessitated a small change to tui-regs.c, to avoid calling the
function that is being removed.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui.h (tui_set_layout_by_name): Don't declare.
* tui/tui-regs.c (tui_reg_layout): New function.
(tui_show_registers, tui_reg_command): Use it.
* tui/tui-layout.c (LAYOUT_USAGE): Remove.
(tui_layout_command): Rename from tui_set_layout_by_name. Change
parameters.
(tui_layout_command): Remove.
Tom Tromey [Mon, 1 Jul 2019 02:34:57 +0000 (20:34 -0600)]
Change tui_set_layout to return void
tui_set_layout can't meaningfully be called with UNDEFINED_LAYOUT; and
instead of trying to handle this case, simply assert and have the
function return void. No caller was checking the return value anyway.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.h (tui/tui-layout): Return void.
* tui/tui-layout.c (tui_set_layout): Return void. Add assert.
Tom Tromey [Mon, 1 Jul 2019 02:32:35 +0000 (20:32 -0600)]
Remove reset_locator
reset_locator was introduced just a few patches ago, but it's already
time to remove it. It consists of a call to the locator's "reset"
method, plus a call to tui_make_window; but the latter is redundant at
all the places that call reset_locator.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (show_source_disasm_command, show_data):
Update.
(reset_locator): Remove.
(show_source_or_disasm_and_command): Update.
Tom Tromey [Sat, 29 Jun 2019 13:32:47 +0000 (07:32 -0600)]
Remove the win_type parameter from tui_gen_win_info::reset
tui_gen_win_info::reset has a window type parameter that is only used
for an assertion. This made sense as a defensive measure when window
creation was more dynamic -- it ensured that one did not make
mistakes. However, there's no need for it any more, so this removes
it.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-source.c (tui_source_window_base::reset): Remove
win_type parameter.
* tui/tui-layout.c (make_command_window, make_source_window)
(make_disasm_window, make_data_window)
(show_source_disasm_command, show_data, tui_gen_win_info::reset)
(reset_locator, show_source_or_disasm_and_command): Update.
* tui/tui-data.h (struct tui_gen_win_info) <reset>: Remove
win_type parameter.
(struct tui_source_window_base) <reset>: Likewise.
Tom Tromey [Sat, 29 Jun 2019 05:56:25 +0000 (23:56 -0600)]
Introduce reset_locator function in tui-layout.c
init_and_make_win in tui-layout.c is now only called for the locator
-- earlier changes have made most of the cases here obsolete. This
patch removes init_and_make_win and introduces a reset_locator
function. Window creation is now much simpler to follow, because it
is no longer quite so dynamic. (Though it will become even simpler in
coming patches.)
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (show_source_disasm_command): Use
reset_locator.
(reset_locator): New function.
(init_and_make_win): Remove.
(show_source_or_disasm_and_command): Use reset_locator.
Tom Tromey [Sat, 29 Jun 2019 05:54:25 +0000 (23:54 -0600)]
Always create an execution info window for a source window
A source or disassembly window will always have an "execution info"
window (the window along the side that displays breakpoint info), but
this isn't immediately clear from the source. As a result, some code
has checks to see whether the execution_info is NULL.
This changes the source window base class to always instantiate an
execution_info window, then updates the rest of the code. It also
simplifies window creation in tui-layout.c.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_set_exec_info_content): Remove
condition.
* tui/tui-wingeneral.c (tui_source_window_base::make_visible):
Remove condition.
* tui/tui-source.c (tui_source_window_base::reset): New method.
* tui/tui-layout.c (make_command_window): Don't call
init_and_make_win.
(make_source_window, make_disasm_window): Don't call
make_source_or_disasm_window.
(make_data_window): Don't call init_and_make_win. Change calling
convention.
(show_source_disasm_command, show_data): Simplify.
(make_source_or_disasm_window): Remove.
(show_source_or_disasm_and_command): Simplify.
* tui/tui-data.h (struct tui_gen_win_info) <reset>: Now virtual.
(struct tui_source_window_base) <reset>: Likewise.
<execution_info>: Remove initializer.
* tui/tui-data.c (tui_source_window_base): Initialize
execution_info.
Tom Tromey [Sat, 29 Jun 2019 05:35:31 +0000 (23:35 -0600)]
Remove some dead code from tui_set_layout
tui_set_layout sets regs_populate using:
regs_populate = (new_layout == SRC_DATA_COMMAND
|| new_layout == DISASSEM_DATA_COMMAND);
Then later it checks this variable:
if (!regs_populate
&& (new_layout == SRC_DATA_COMMAND
|| new_layout == DISASSEM_DATA_COMMAND))
However, this is equivalent to "!regs_populate && regs_populate",
which can never be true. So, remove the dead code and the variable.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (tui_set_layout): Remove regs_populate
variable.
Tom Tromey [Sat, 29 Jun 2019 05:32:05 +0000 (23:32 -0600)]
Remove TUI data window special case
The TUI has a couple of special cases for updating the data window:
one in tui_rl_other_windowand one in tui_set_focus_command. As part
of the project to remove references to globals, I wanted to remove
these calls; but when I did, some simple operations (like "C-x o")
would cause the register window to blank.
This fixes the underlying problem by arranging for the data window's
refresh_window method to call the superclass method first, and then to
refresh the child windows. Then the special cases can be removed.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui.c (tui_rl_other_window): Update.
* tui/tui-wingeneral.c (tui_data_window::refresh_window): Call
superclass method first. Always iterate over regs_content.
(tui_unhighlight_win, tui_highlight_win): Use refresh_window
method.
* tui/tui-win.c (tui_set_focus_command): Update.
Tom Tromey [Sat, 29 Jun 2019 05:23:37 +0000 (23:23 -0600)]
Remove tui_set_focus
tui_set_focus_command is a simple wrapper for tui_set_focus, so rename
the latter and remove the wrapper function.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-win.c (tui_set_focus_command): Rename from
tui_set_focus. Call tui_enable.
(tui_set_focus_command): Remove.
Tom Tromey [Sat, 29 Jun 2019 05:17:24 +0000 (23:17 -0600)]
Merge refresh and refresh_window methods
Earlier refactorings introduced the refresh and refresh_window
methods, following the previous TUI code. However, these methods are
essentially the same, so this patch merges them. It also removes some
redundant refresh_window calls, because the execution window is
updated automatically by the corresponding source (or disassembly)
window.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_show_exec_info_content): Don't call
refresh_window.
* tui/tui-wingeneral.c (tui_gen_win_info::refresh_window): Call
touchwin.
(tui_data_window::refresh_window): Call refresh_window on data
items. Always call superclass refresh_window.
(tui_win_info::refresh): Remove.
(tui_source_window_base::refresh_window): Update.
(tui_refresh_all): Update.
* tui/tui-layout.c (show_source_disasm_command): Remove call to
refresh_window.
(show_source_or_disasm_and_command): Likewise.
* tui/tui-data.h (struct tui_win_info) <refresh>: Remove.
(struct tui_source_window_base) <refresh>: Likewise.
Tom Tromey [Sat, 29 Jun 2019 04:57:37 +0000 (22:57 -0600)]
Remove tui_source_window::content_in_use
Now that source window clearing has been simplified, we don't need a
special flag to say whether the source window is in use -- we can
simply check whether the contents are set. This patch implements this
idea, removing the content_in_use field.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_clear_source_content)
(tui_show_source_content): Update.
* tui/tui-source.c (tui_source_window::showing_source_p): Check
whether content is empty.
* tui/tui-data.h (struct tui_source_window_base) <content_in_use>:
Remove.
Tom Tromey [Sat, 29 Jun 2019 04:55:45 +0000 (22:55 -0600)]
Simplify source window clearing
When a TUI source window is empty, it displays a "No Source Available"
message. The function tui_set_source_content_nil also made sure to
put this message into the window's "content" field.
However, I believe this isn't really necessary. Instead, it's simpler
to just empty the contents and let curses handle the refreshing.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_erase_source_content): Clear the
window's contents.
* tui/tui-source.h (tui_set_source_content_nil): Don't declare.
* tui/tui-source.c (tui_set_source_content_nil): Remove.
Tom Tromey [Sat, 29 Jun 2019 04:51:20 +0000 (22:51 -0600)]
Remove UNDEFINED_ITEM define from TUI
The TUI defined UNDEFINED_ITEM, but only used it in a single spot. I
think this isn't very useful, so this removes the define.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-data.h (UNDEFINED_ITEM): Remove define.
(struct tui_data_item_window): Update.
Tom Tromey [Sat, 29 Jun 2019 04:49:10 +0000 (22:49 -0600)]
Remove unused TUI defines
This removes some #defines that were unused in the TUI.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-data.h (MAX_CONTENT_COUNT, TUI_NULL_STR)
(DEFAULT_HISTORY_COUNT, WITH_LOCATOR, NO_LOCATOR): Remove
defines.
Tom Tromey [Sat, 29 Jun 2019 04:48:33 +0000 (22:48 -0600)]
Remove unused parameter from two TUI functions
The "display_prompt" parameter of tui_erase_source_content and
tui_clear_source_content was never passed the NO_EMPTY_SOURCE_PROMPT
value, so remove the parameter. Once this is done, the
EMPTY_SOURCE_PROMPT and NO_EMPTY_SOURCE_PROMPT defines are unused, so
remove those as well.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.h (tui_erase_source_content)
(tui_clear_source_content): Remove "display_prompt" parameter.
* tui/tui-winsource.c (tui_update_source_window_as_is)
(tui_update_source_windows_with_addr): Update.
(tui_clear_source_content): Remove "display_prompt" parameter.
(tui_erase_source_content): Likewise. Simplify.
(tui_show_source_content): Update.
* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights): Update.
* tui/tui-stack.c (tui_show_frame_info): Update.
* tui/tui-data.h (EMPTY_SOURCE_PROMPT, NO_EMPTY_SOURCE_PROMPT):
Remove defines.
Tom Tromey [Fri, 28 Jun 2019 22:58:16 +0000 (16:58 -0600)]
Add win_info parameter to tui_set_disassem_content
This adds a win_info parameter to tui_set_disassem_content, removing
uses of the TUI_DISASM_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_update_source_window_as_is): Update.
* tui/tui-disasm.h (tui_set_disassem_content): Add win_info
parameter.
* tui/tui-disasm.c (tui_set_disassem_content): Add win_info
parameter.
Tom Tromey [Fri, 28 Jun 2019 22:44:23 +0000 (16:44 -0600)]
Move content_in_use to tui_source_window class
From scanning the source now, it's clear that the content_in_use field
is only used for the source window. This patch moves the field there,
and changes it to be a bool at the same time. (A future patch will
clean this up further, removing the field entirely.)
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_clear_source_content)
(tui_show_source_content, tui_show_exec_info_content)
(tui_clear_exec_info_content): Update.
* tui/tui-stack.c (tui_show_locator_content): Update.
(tui_show_frame_info): Update.
* tui/tui-source.h (tui_source_window): Don't declare.
* tui/tui-source.c (tui_source_window::showing_source_p): Rename
from tui_source_is_displayed.
* tui/tui-data.h (struct tui_gen_win_info) <content_in_use>:
Remove field.
(struct tui_source_window_base) <content_in_use>: New field. Now
bool.
(struct tui_source_window) <showing_source_p>: New method.
(TUI_SRC_WIN): Change cast.
* tui/tui-data.c (tui_initialize_static_data): Update.
Tom Tromey [Fri, 28 Jun 2019 21:19:10 +0000 (15:19 -0600)]
Introduce tui_source_window_base::location_matches_p method
This introduces the location_matches_p method, removing a spot that
explicitly examines a window's type.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_update_breakpoint_info): Use
location_matches_p.
* tui/tui-source.c (tui_source_window::location_matches_p): New
method.
* tui/tui-disasm.c (tui_disasm_window::location_matches_p): New
method.
* tui/tui-data.h (struct tui_source_window_base)
<location_matches_p>: New method.
(struct tui_source_window, struct tui_disasm_window)
<location_matches_p>: Likewise.
Tom Tromey [Fri, 28 Jun 2019 21:01:11 +0000 (15:01 -0600)]
Remove tui_set_win_height
tui_set_win_height_command is just a simple wrapper for
tui_set_win_height, so rename the latter and remove the wrapper.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-win.c (tui_set_win_height_command): Rename from
tui_set_win_height.
(tui_set_win_height_command): Remove.
Tom Tromey [Fri, 28 Jun 2019 20:48:45 +0000 (14:48 -0600)]
Make source windows be self-updating
This changes the TUI source window to register itself on the
source_styling_changed observable, and removes a bit of code from
tui-hooks.c. This reduces the number of uses of the TUI_SRC_WIN
global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-source.c (tui_source_window): New constructor. Add
observer.
(~tui_source_window): New destructor.
(tui_source_window::style_changed): New method.
* tui/tui-hooks.c (tui_redisplay_source): Remove.
(tui_attach_detach_observers): Update.
* tui/tui-data.h (struct tui_source_window): Make constructor not
inline. Add destructor.
(struct tui_source_window) <style_changed>: New method.
<m_observable>: New member.
Tom Tromey [Thu, 27 Jun 2019 22:05:25 +0000 (16:05 -0600)]
Fix comment typos
This fixes a couple of comment typos that I noticed.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-data.c (tui_clear_source_windows_detail): Fix typo.
* tui/tui-win.c (tui_resize_all): Fix typo.
Tom Tromey [Thu, 27 Jun 2019 22:04:26 +0000 (16:04 -0600)]
Introduce TUI window iterator
This introduces an iterator class and a range adapter to make it
simpler to iterate over TUI windows.
One explicit iteration remains, in tui-win.c, because that spot is
deleting windows as well.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-wingeneral.h (tui_refresh_all): Update.
* tui/tui-wingeneral.c (make_all_visible): Use foreach.
(tui_refresh_all): Remove "list" parameter. Use foreach.
* tui/tui-win.c (window_name_completer): Use foreach.
(tui_refresh_all_win, tui_rehighlight_all, tui_all_windows_info)
(update_tab_width): Likewise.
* tui/tui-layout.c (show_layout): Update.
* tui/tui-data.h (class tui_window_iterator): New.
(struct all_tui_windows): New.
* tui/tui-data.c (tui_partial_win_by_name): Use foreach.
Tom Tromey [Thu, 27 Jun 2019 01:45:53 +0000 (19:45 -0600)]
Minor tui_reg_next / tui_reg_prev cleanup
This changes tui_reg_next and tui_reg_prev so that they don't need to
reference the TUI_DATA_WIN globals.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.c (tui_reg_next, tui_reg_prev): Add "current_group"
parameter. Don't reference globals.
(tui_reg_command): Update.
Tom Tromey [Wed, 26 Jun 2019 22:26:39 +0000 (16:26 -0600)]
Simplify tui_show_registers
tui_show_registers keeps a local status variable, but it is not
actually needed. This rearranges the function to remove the variable.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.c (tui_show_registers): Simplify.
Tom Tromey [Wed, 26 Jun 2019 22:25:40 +0000 (16:25 -0600)]
Parameterize tui_show_register_group with window
This changes tui_show_register_group not to reference the TUI_DATA_WIN
global, instead leaving that to its caller.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.c (tui_show_registers): Update.
(tui_show_register_group): Add win_info parameter.
Tom Tromey [Wed, 26 Jun 2019 22:15:46 +0000 (16:15 -0600)]
Introduce tui_data_window::display_reg_element_at_line method
This changes tui_display_reg_element_at_line to be a method on
tui_data_window, allowing for the removal of some uses of the
TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.c (tui_data_window::display_reg_element_at_line):
Rename from tui_display_reg_element_at_line.
(tui_data_window::display_registers_from_line): Update.
* tui/tui-data.h (struct tui_data_window)
<display_reg_element_at_line>: New method.
Tom Tromey [Wed, 26 Jun 2019 22:13:39 +0000 (16:13 -0600)]
Introduce two more tui_data_window methods
This changes tui_display_registers_from and
tui_display_registers_from_line to be methods on tui_data_window,
allowing for the removal of more uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (tui_display_registers_from)
(tui_display_registers_from_line): Don't declare.
* tui/tui-windata.c (tui_data_window::display_all_data)
(tui_data_window::refresh_all)
(tui_data_window::do_scroll_vertical): Update.
* tui/tui-regs.c (tui_data_window::display_registers_from): Rename
from tui_display_registers_from.
(tui_display_reg_element_at_line): Update.
(tui_data_window::display_registers_from_line): Rename from
tui_display_registers_from_line.
* tui/tui-data.h (struct tui_data_window) <display_registers_from,
display_registers_from_line>: New methods.
Tom Tromey [Wed, 26 Jun 2019 22:07:45 +0000 (16:07 -0600)]
Introduce tui_data_window::erase_data_content method
This changes tui_erase_data_content to be a method on tui_data_window,
allowing for the removal of some uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_erase_data_content): Don't declare.
* tui/tui-windata.c (tui_data_window::erase_data_content): Rename
from tui_erase_data_content.
(tui_data_window::display_all_data)
(tui_data_window::refresh_all)
(tui_data_window::do_scroll_vertical): Update.
* tui/tui-regs.c (tui_show_registers): Update.
* tui/tui-data.h (struct tui_data_window) <erase_data_content>:
New method.
Tom Tromey [Wed, 26 Jun 2019 22:04:37 +0000 (16:04 -0600)]
Introduce tui_data_window::delete_data_content_windows method
This changes tui_delete_data_content_windows to be a method on
tui_data_window, removing some uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_delete_data_content_windows): Don't
declare.
* tui/tui-windata.c
(tui_data_window::delete_data_content_windows): Rename from
tui_delete_data_content_windows.
(tui_data_window::display_all_data)
(tui_data_window::do_scroll_vertical): Update.
* tui/tui-data.h (struct tui_data_window)
<delete_data_content_windows>: New method.
Tom Tromey [Wed, 26 Jun 2019 22:03:12 +0000 (16:03 -0600)]
Don't declare unimplemented functions
A couple of functions were declared but never defined. This removes
the declarations.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_refresh_data_win): Don't declare.
* tui/tui-regs.h (tui_first_reg_element_inline): Don't declare.
Tom Tromey [Wed, 26 Jun 2019 22:02:36 +0000 (16:02 -0600)]
Introduce tui_data_window::display_all_data method
This changes tui_display_all_data to be a method on tui_data_window.
This helps cluster uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_display_all_data): Don't declare.
* tui/tui-windata.c (tui_data_window::display_all_data): Rename
from tui_display_all_data.
* tui/tui-win.c
(tui_data_window::do_make_visible_with_new_height): Update.
* tui/tui-regs.c (tui_show_registers): Update.
* tui/tui-layout.c (tui_set_layout): Update.
* tui/tui-data.h (struct tui_data_window) <display_all_data>: New
method.
Tom Tromey [Wed, 26 Jun 2019 22:00:05 +0000 (16:00 -0600)]
Remove tui_display_data_from
tui_display_data_from is only called from a single place. Inlining it
there lets us remove some uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_display_data_from): Don't declare.
* tui/tui-windata.c (tui_display_data_from): Remove.
(tui_data_window::refresh_all): Update.
Tom Tromey [Wed, 26 Jun 2019 21:56:56 +0000 (15:56 -0600)]
Remove tui_display_data_from_line
tui_display_data_from_line is just a wrapper for
tui_display_registers_from_line, so remove it. Also, nothing passed 0
as the "force_display" parameter to tui_display_registers_from_line,
so remove that parameter as well.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.h (tui_display_data_from_line): Don't declare.
* tui/tui-windata.c (tui_display_data_from_line): Remove.
(tui_display_data_from, tui_data_window::do_scroll_vertical): Call
tui_display_registers_from_line.
* tui/tui-regs.h (tui_display_registers_from_line): Update.
* tui/tui-regs.c (tui_display_registers_from_line): Remove
"force_display" parameter.
Tom Tromey [Wed, 26 Jun 2019 21:49:00 +0000 (15:49 -0600)]
Introduce tui_data_window::first_reg_element_no_inline
This changes tui_first_reg_element_no_inline to be a method on
tui_data_window. This again moves uses of the TUI_DATA_WIN global
from this function into other functions that are already using the
global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (tui_first_reg_element_no_inline): Don't
declare.
* tui/tui-regs.c (tui_data_window::first_reg_element_no_inline):
Rename from tui_first_reg_element_no_inline.
(tui_display_reg_element_at_line)
(tui_display_registers_from_line): Update.
* tui/tui-data.h (struct tui_data_window)
<first_reg_element_no_inline>: New method.
Tom Tromey [Wed, 26 Jun 2019 21:46:38 +0000 (15:46 -0600)]
Introduce tui_data_window::line_from_reg_element_no method
This changes tui_line_from_reg_element_no to be a method on
tui_data_window, allowing for the removal of some uses of the
TUI_DATA_WIN global. (Actually, in this particular patch, the number
of uses is not decreased, but rather the uses are moved to spots that
are already using the global, i.e., increasing the clustering.)
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-windata.c (tui_display_data_from)
(tui_data_window::do_scroll_vertical): Update.
* tui/tui-regs.h (tui_line_from_reg_element_no): Don't declare.
* tui/tui-regs.c (tui_data_window::line_from_reg_element_no):
Rename from tui_line_from_reg_element_no.
(tui_display_registers_from_line): Update.
* tui/tui-data.h (struct tui_data_window)
<line_from_reg_element_no>: New method.
Tom Tromey [Wed, 26 Jun 2019 21:44:51 +0000 (15:44 -0600)]
Introduce tui_data_window::last_regs_line_no method
This changes tui_last_regs_line_no into a method on tui_data_window,
allowing the removal of uses of the TUI_DATA_WIN global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (tui_last_regs_line_no): Don't declare.
* tui/tui-regs.c (tui_data_window::last_regs_line_no): Rename from
tui_last_regs_line_no.
(tui_display_reg_element_at_line)
(tui_display_registers_from_line): Update.
* tui/tui-data.h (struct tui_data_window) <last_regs_line_no>: New
method.
Tom Tromey [Mon, 24 Jun 2019 03:25:46 +0000 (21:25 -0600)]
Remove deleted breakpoint from TUI display
PR tui/24722 points out that deleting a breakpoint does not cause the
"b" to be removed from the breakpoint display. The issue here was
that the breakpoint still exists at the moment the breakpoint-deleted
observer is notified. This fixes the problem by specially handling
the case where a breakpoint is being removed.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
PR tui/24722:
* tui/tui-winsource.h (tui_update_all_breakpoint_info)
(tui_update_breakpoint_info): Add "being_deleted" parameter.
* tui/tui-winsource.c (tui_update_source_window_as_is): Update.
(tui_update_all_breakpoint_info): Add "being_deleted" parameter.
(tui_update_breakpoint_info): Likewise.
* tui/tui-hooks.c (tui_event_create_breakpoint)
(tui_event_delete_breakpoint, tui_event_modify_breakpoint):
Update.
Tom Tromey [Mon, 24 Jun 2019 03:00:01 +0000 (21:00 -0600)]
Consolidate "if"s in tui_show_frame_info
tui_show_frame_info has two parallel "if"s with the same condition and
no intervening code. The second "if" perhaps wasn't obviously
identical, but earlier refactorings made it clearer, by pointing out
that only source and disassembly windows can be handled here. This
merges the two statements.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-stack.c (tui_show_frame_info): Consolidate "if"s.
Tom Tromey [Mon, 24 Jun 2019 02:57:09 +0000 (20:57 -0600)]
Remove some uses of TUI_WIN_SRC
This adds a 'win_info' parameter to a couple of functions. This
reduces the number of references to the TUI_WIN_SRC global.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.c (tui_update_source_window_as_is)
(tui_update_source_windows_with_addr): Update.
* tui/tui-source.h (tui_set_source_content)
(tui_show_symtab_source): Add "win_info" parameter.
* tui/tui-source.c (tui_set_source_content): Add "win_info"
parameter.
(tui_show_symtab_source): Likewise.
Tom Tromey [Mon, 24 Jun 2019 02:48:59 +0000 (20:48 -0600)]
Check can_highlight in tui_check_and_display_highlight_if_needed
tui_check_and_display_highlight_if_needed currently checks the
window's type; but this can be replaced with a check of
"can_highlight", making it more polymorphically-correct.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-wingeneral.c
(tui_check_and_display_highlight_if_needed): Check can_highlight.
Tom Tromey [Mon, 24 Jun 2019 02:39:57 +0000 (20:39 -0600)]
Introduce can_scroll method
This introduces a "can_scroll" method, removing a spot that explicitly
checks a window's type.
gdb/ChangeLog
2019-07-17 Tom Tromey <tom@tromey.com>
* tui/tui-data.h (struct tui_win_info) <can_scroll>: New method.
(struct tui_cmd_window) <can_scroll>: New method.
* tui/tui-command.c (tui_dispatch_ctrl_char): Use can_scroll
method.
Tom Tromey [Wed, 17 Jul 2019 14:34:23 +0000 (08:34 -0600)]
Rename field_int to field_signed
This renames ui_out::field_int to field_signed, and field_fmt_int to
field_fmt_signed; and changes the type of the "value" parameter from
int to LONGEST.
Tested by the buildbot.
gdb/ChangeLog
2019-07-17 Tom Tromey <tromey@adacore.com>
* ui-out.h (class ui_out) <field_signed, field_fmt_signed,
do_field_signed>: Rename. Change type of "value".
* ui-out.c (ui_out::field_signed): Rename from field_int.
Change type of "value".
(ui_out::field_fmt_signed): Rename from field_fmt_int. Change
type of "value".
* tui/tui-out.h (class tui_ui_out) <do_field_signed>: Rename from
do_field_int. Change type of "value".
* tui/tui-out.c (tui_ui_out::do_field_signed): Rename from
do_field_int. Change type of "value".
* tracepoint.c (trace_status_mi, tfind_1)
(print_one_static_tracepoint_marker): Update.
* thread.c (print_thread_info_1, print_selected_thread_frame):
Update.
* stack.c (print_frame, print_frame_info): Update.
* spu-tdep.c (info_spu_signal_command, info_spu_dma_cmdlist):
Update.
* source.c (print_source_lines_base): Update.
* skip.c (info_skip_command): Update.
* record-btrace.c (btrace_ui_out_decode_error)
(btrace_call_history_src_line): Update.
* python/py-framefilter.c (py_print_single_arg, py_print_frame):
Update.
* progspace.c (print_program_space): Update.
* mi/mi-symbol-cmds.c (mi_cmd_symbol_list_lines): Update.
* mi/mi-out.h (class mi_ui_out) <do_field_signed>: Rename from
do_field_int. Change type of "value".
* mi/mi-out.c (mi_ui_out::do_table_begin)
(mi_ui_out::do_table_header): Update.
(mi_ui_out::do_field_signed): Rename from do_field_int. Change
type of "value".
* mi/mi-main.c (mi_cmd_thread_list_ids, print_one_inferior)
(mi_cmd_data_list_changed_registers, output_register)
(mi_cmd_data_read_memory, mi_load_progress)
(mi_cmd_trace_frame_collected): Update.
* mi/mi-interp.c (mi_on_normal_stop_1, mi_output_solib_attribs):
Update.
* mi/mi-cmd-var.c (print_varobj, mi_cmd_var_create)
(mi_cmd_var_delete, mi_cmd_var_info_num_children)
(mi_cmd_var_list_children, varobj_update_one): Update.
* mi/mi-cmd-stack.c (mi_cmd_stack_info_depth)
(mi_cmd_stack_list_args, list_arg_or_local): Update.
* mi/mi-cmd-file.c (mi_cmd_file_list_exec_source_file): Update.
* inferior.c (print_inferior): Update.
* gdb_bfd.c (print_one_bfd): Update.
* disasm.c (gdb_pretty_print_disassembler::pretty_print_insn):
Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* cli-out.h (class cli_ui_out) <do_field_signed>: Rename from
do_field_int. Change type of "value".
* cli-out.c (cli_ui_out::do_field_signed): Rename from
do_field_int. Change type of "value".
* breakpoint.c (watchpoint_check, print_breakpoint_location)
(print_one_breakpoint_location, print_it_catch_fork)
(print_one_catch_fork, print_it_catch_vfork)
(print_one_catch_vfork, print_it_catch_solib)
(print_it_catch_exec, print_it_ranged_breakpoint)
(print_mention_watchpoint, print_mention_masked_watchpoint)
(bkpt_print_it, update_static_tracepoint): Update.
* break-catch-throw.c (print_it_exception_catchpoint): Update.
* break-catch-syscall.c (print_it_catch_syscall): Update.
* ada-tasks.c (print_ada_task_info): Update.
* ada-lang.c (print_it_exception, print_mention_exception):
Update.
Andrew Burgess [Tue, 2 Jul 2019 11:06:06 +0000 (12:06 +0100)]
gdb: Remove a non-const reference parameter
Non-const reference parameter should be avoided according to the GDB
coding standard:
https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#Avoid_non-const_reference_parameters.2C_use_pointers_instead
This commit updates the gdbarch method gdbarch_stap_adjust_register,
and the one implementation i386_stap_adjust_register to avoid using a
non-const reference parameter.
I've also removed the kfail from the testsuite for bug 24541, as this
issue is now resolved.
gdb/ChangeLog:
PR breakpoints/24541
* gdbarch.c: Regenerate.
* gdbarch.h: Regenerate.
* gdbarch.sh: Adjust return type and parameter types for
'stap_adjust_register'.
(i386_stap_adjust_register): Adjust signature and return new
register name.
* stap-probe.c (stap_parse_register_operand): Adjust use of
'gdbarch_stap_adjust_register'.
gdb/testsuite/ChangeLog:
PR breakpoints/24541
* gdb.mi/mi-catch-cpp-exceptions.exp: Remove kfail due to 24541.
Tom Tromey [Mon, 15 Jul 2019 17:52:02 +0000 (11:52 -0600)]
Remove a VEC from s390-linux-nat.c
This removes a use of VEC fro s390-linux-nat.c, replacing it with
std::vector.
Tested using the Fedora-s390x-m64 buildbot builder.
gdb/ChangeLog
2019-07-17 Tom Tromey <tromey@adacore.com>
* s390-linux-nat.c (s390_watch_area): Remove typedef. Don't
declare VEC.
(struct s390_debug_reg_state) <watch_areas, break_areas>: Now
std::vector.
(struct s390_process_info): Add initializers.
(s390_add_process): Use new.
(s390_linux_nat_target::low_forget_process): Use delete.
(s390_linux_nat_target::low_new_fork)
(s390_linux_nat_target::stopped_by_watchpoint)
(s390_linux_nat_target::low_prepare_to_resume)
(s390_linux_nat_target::insert_watchpoint)
(s390_linux_nat_target::insert_hw_breakpoint)
(s390_linux_nat_target::remove_watchpoint)
(s390_linux_nat_target::remove_hw_breakpoint): Update.
Jan Beulich [Wed, 17 Jul 2019 07:16:31 +0000 (09:16 +0200)]
x86: replace "anymem" checks where possible
Once operand parsing has completed, the simpler check of Operand_Mem can
be used in places where i.types[] got passed to operand_type_check().
Note that this has shown a couple of omissions of adjusting i.flags[]
when playing with i.op[] / i.types[] / i.tm.operand_types[]. Not all of
them get added here, just all of the ones needed in process_operands().
Jan Beulich [Wed, 17 Jul 2019 07:15:49 +0000 (09:15 +0200)]
x86: drop stale Mem enumerator
This was supposed to also be removed by
c48dadc9a8 ('x86: drop "mem"
operand type attribute'). It's odd enough that this hasn't caused
build issues, considering the careful use of OTunused (apparently to
avoid "missing initializer" warnings).
To avoid such happening again introduce compile time consistency
checks.
GDB Administrator [Wed, 17 Jul 2019 00:00:22 +0000 (00:00 +0000)]
Automatic date update in version.in
Jan Beulich [Tue, 16 Jul 2019 07:31:36 +0000 (09:31 +0200)]
x86: make RegMem an opcode modifier
... instead of an operand type bit: It's an insn property, not an
operand one. There's just one actual change to be made to the
templates: Most are now required to have the (unswapped) destination go
into ModR/M.rm, so VMOVD template needs its opcode adjusted accordingly
and its operands swapped. {,V}MOVS{S,D}, otoh, are left alone in this
regard, as otherwise generated code would differ from what we've been
producing so far (which I don't think is wanted).
Take the opportunity and add a missing IgnoreSize to pextrb (leading to
an error in 16-bit mode), and take the liberty to once again drop stray
IgnoreSize attributes from lines changed and neighboring related ones.
Jan Beulich [Tue, 16 Jul 2019 07:30:29 +0000 (09:30 +0200)]
x86: fold SReg{2,3}
They're the only exception to there generally being no mix of register
kinds possible in an insn operand template, and there being two bits per
operand for their representation is also quite wasteful, considering the
low number of uses. Fold both bits and deal with the little bit of
fallout.
Also take the liberty and drop dead code trying to set REX_B: No segment
register has RegRex set on it.
Additionally I was quite surprised that PUSH/POP with the permitted
segment registers is not covered by the test cases. Add the missing
pieces.
John Baldwin [Tue, 16 Jul 2019 00:21:36 +0000 (17:21 -0700)]
Fix build for aarch64, arm, and riscv FreeBSD native targets.
Remove unused gdbarch argument to helper functions originally
copied from mips-fbsd-nat.c. Include regcache.h previously
included from defs.h via gdbarch.h.
gdb/ChangeLog:
* aarch64-fbsd-nat.c: Include regcache.h.
(getregs_supplies, getfpregs_supplies): Remove unused gdbarch
argument.
(aarch64_fbsd_nat_target::fetch_registers)
(aarch64_fbsd_nat_target::store_registers): Remove gdbarch
variable.
* arm-fbsd-nat.c, riscv-fbsd-nat.c: Likewise.
John Baldwin [Tue, 16 Jul 2019 00:21:36 +0000 (17:21 -0700)]
Add include of gdbarch.h.
gdb/ChangeLog:
* fbsd-nat.c: Include gdbarch.h.
GDB Administrator [Tue, 16 Jul 2019 00:00:27 +0000 (00:00 +0000)]
Automatic date update in version.in
Tom Tromey [Tue, 2 Jul 2019 15:13:53 +0000 (09:13 -0600)]
Fix a FIXME in mi-out.c
This removes a FIXME comment from mi_ui_out::do_field_int, by
replacing a printf with a use of plongest.
2019-07-15 Tom Tromey <tromey@adacore.com>
* mi/mi-out.c (mi_ui_out::do_field_int): Use plongest.
Tom Tromey [Mon, 1 Jul 2019 18:14:48 +0000 (12:14 -0600)]
Introduce field_unsigned
This adds field_unsigned and changes various places using field_fmt
with "%u" to use this instead. This also replaces an existing
equivalent helper function in record-btrace.c.
2019-07-15 Tom Tromey <tromey@adacore.com>
* mi/mi-out.h (class mi_ui_out) <do_field_unsigned>: Declare.
* mi/mi-out.c (mi_ui_out::do_field_unsigned): New method.
* cli-out.h (class cli_ui_out) <do_field_unsigned>: Declare.
* cli-out.c (cli_ui_out::do_field_int): New method.
* ui-out.c (ui_out::field_unsigned): New method.
* symfile.c (generic_load): Use field_unsigned.
(print_transfer_performance): Likewise.
* record-btrace.c (ui_out_field_uint): Remove.
(btrace_call_history_insn_range, btrace_call_history): Use
field_unsigned.
* disasm.c (gdb_pretty_print_disassembler::pretty_print_insn): Use
field_unsigned.
* ui-out.h (class ui_out) <field_unsigned>: New method.
<do_field_unsigned>: Likewise.
Tom Tromey [Mon, 1 Jul 2019 18:08:15 +0000 (12:08 -0600)]
Use field_string in more places
This replaces uses of field_fmt with a "%s" format string to use
field_string instead. Also, one use of "%9lx" is replaced with a call
to phex_nz; the '9' is dropped as it is implicit in the field width.
2019-07-15 Tom Tromey <tromey@adacore.com>
* mi/mi-main.c (list_available_thread_groups): Use field_string.
* mi/mi-interp.c (mi_memory_changed): Use field_string.
* target.c (flash_erase_command): Use field_string.
* infrun.c (print_signal_received_reason): Use field_string.
* i386-tdep.c (i386_mpx_print_bounds): Use field_string.
* breakpoint.c (maybe_print_thread_hit_breakpoint): Use
field_string.
* ada-tasks.c (print_ada_task_info): Use field_string.
Tom Tromey [Mon, 1 Jul 2019 18:02:37 +0000 (12:02 -0600)]
Use field_core_addr in more places
This changes a few spots that use field_fmt to use field_core_addr
instead.
gdb/ChangeLog
2019-07-15 Tom Tromey <tromey@adacore.com>
* target.c (flash_erase_command): Use field_core_addr.
* symfile.c (generic_load): Use field_core_addr.
* sparc64-linux-tdep.c (sparc64_linux_handle_segmentation_fault):
Use field_core_addr.
* i386-linux-tdep.c (i386_linux_handle_segmentation_fault): Use
field_core_addr.
Jose E. Marchesi [Mon, 15 Jul 2019 14:00:28 +0000 (16:00 +0200)]
cpu,opcodes,gas: fix explicit arguments to eBPF ldabs instructions
This patch fixes the eBPF CPU description in order to reflect the
right explicit arguments passed to the ldabs{b,h,w,dw} instructions,
updates the corresponding GAS tests, and updates the BPF section of
the GAS manual.
cpu/ChangeLog:
2019-07-15 Jose E. Marchesi <jose.marchesi@oracle.com>
* bpf.cpu (dlabs): New pmacro.
(dlind): Likewise.
opcodes/ChangeLog:
2019-07-15 Jose E. Marchesi <jose.marchesi@oracle.com>
* bpf-desc.c: Regenerate.
* bpf-opc.c: Likewise.
* bpf-opc.h: Likewise.
gas/ChangeLog:
2019-07-15 Jose E. Marchesi <jose.marchesi@oracle.com>
* testsuite/gas/bpf/mem.s: ldabs instructions do not take a `src'
register as an argument.
* testsuite/gas/bpf/mem.d: Updated accordingly.
* testsuite/gas/bpf/mem-be.d: Likewise.
* doc/c-bpf.texi (BPF Opcodes): Update to reflect the correct
explicit arguments to ldabs and ldind instructions.
Alan Modra [Fri, 12 Jul 2019 05:58:19 +0000 (15:28 +0930)]
Fix __bss_start assertion failure in _bfd_elf_fix_symbol_flags
> Building LLVM 6.0 on FreeBSD/powerpc (devel/llvm60 port) the assertion
> in the subject trips (displays twice) when linking libLTO.so.1. The
> issue has been filed in FreeBSD's bugzilla, at
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=237068 . It appears
> the 'llvm::hashing::detail::get_execution_seed()::seed@@JL_LLVM_6.0'
> symbol is being weakly aliased to an indirect symbol
> __bss_start@@JL_LLVM_6.0. Since __bss_start@@JL_LLVM_6.0 is an
> indirect symbol, it fails the assertion.
I haven't looked under a debugger at your testcase but I think I know
what is going on here. You have a shared library with a weakly
defined llvm::hashing::detail::get_execution_seed()::seed which
happens to be at the same location as __bss_start in that library. At
the time the linker loads symbols for that library, it sees they are
both versioned and thus introduces non-versioned indirect symbols for
them. The linker considers the symbols as possibly being aliases,
setting up h->u.alias and h->is_weakalias such that
__bss_start@@JL_LLVM_6.0 is the definition. No real problem so far,
the definition is bfd_link_hash_defined, except that the zero size, no
type __bss_start symbol possibly should not be considered an alias in
the first place.
Later, __bss_start as defined by the linker script is entered into the
linker symbol table. This is similar to __bss_start being defined by
a regular object file in that ELF symbol resolution rules say that the
value of __bss_start in the library is overridden by __bss_start in
the executable/library being produced. So to accomplish the override,
ld flips __bss_start from being an indirect symbol pointing at
__bss_start@@JL_LLVM_6.0 to __bss_start@@JL_LLVM_6.0 being an indirect
symbol pointing at __bss_start. That's how we get an unexpected
indirect symbol and hit the assert.
What should happen I think, is for the def->def_regular code above the
assert to run in this case. The symbols are no longer aliases.
* elflink.c (_bfd_elf_fix_symbol_flags): If the def for an
alias is no longer bfd_link_hash_defined, clear the alias.
GDB Administrator [Mon, 15 Jul 2019 00:00:42 +0000 (00:00 +0000)]
Automatic date update in version.in
Jose E. Marchesi [Sun, 14 Jul 2019 12:45:31 +0000 (14:45 +0200)]
cpu,opcodes,gas: fix arguments to ldabs and ldind eBPF instructions
The eBPF non-generic load instructions ldind{b,h,w,dw} and
ldabs{b,h,w,dw} do not take an explicit destination register as an
argument. Instead, they put the loaded value in %r0, implicitly.
This patch fixes the CPU BPF description to not expect a 'dst'
argument in these arguments, regenerates the corresponding files in
opcodes, and updates the impacted GAS tests.
Tested in a x86-64 host.
cpu/ChangeLog:
2019-07-14 Jose E. Marchesi <jose.marchesi@oracle.com>
* bpf.cpu (dlsi): ldabs and ldind instructions do not take an
explicit 'dst' argument.
opcodes/ChangeLog:
2019-07-14 Jose E. Marchesi <jose.marchesi@oracle.com>
* bpf-desc.c: Regenerate.
* bpf-opc.c: Likewise.
gas/ChangeLog:
2019-07-14 Jose E. Marchesi <jose.marchesi@oracle.com>
* testsuite/gas/bpf/mem.s: Do not use explicit arguments for
ldabs and ldind instructions.
* testsuite/gas/bpf/mem.d: Updated accordingly.
* testsuite/gas/bpf/mem-be.d: Likewise.
Tom de Vries [Sun, 14 Jul 2019 11:23:04 +0000 (13:23 +0200)]
[gdb/testsuite] Fix unterminated string in gdb.objc/basicclass.exp
The test-case gdb.objc/basicclass.exp contains an unterminated string,
introduced in refactoring commit
fa43b1d7ca "after gdb_run_cmd, gdb_expect ->
gdb_test_multiple/gdb_test".
Fix the unterminated string.
gdb/testsuite/ChangeLog:
2019-07-14 Tom de Vries <tdevries@suse.de>
PR testsuite/24760
* gdb.objc/basicclass.exp: Fix unterminated string.
Joel Brobecker [Sun, 14 Jul 2019 01:00:32 +0000 (18:00 -0700)]
adjust src-release following the renaming of gdb/common/ to gdb/gdbsupport/
A recent change renamed the common/ directory into gdbsupport/ in gdb.
This causes problems in the getver function in the src-release script
which doesn't find the create-version.sh script anymore. As a result,
it falls back on using the version.in file verbatim, meaning that
the "DATE" placeholder doesn't get replaced with the snapshot date,
and the "-git" suffix doesn't get stripped. More precisely, we get
snapshots called "gdb-8.3.50-DATE-git.tar" instead of (e.g.)
"gdb-8.3-
20190712.tar".
This commit fixes the issue by adding support for this situation.
I left the support for $tool/common/create-version.sh, because
the sim still uses that directory structure.
ChangeLog:
* src-release (getver): If $tool/gdbsupport/create-version.sh
exists, use that to determine the version number.
GDB Administrator [Sun, 14 Jul 2019 00:00:54 +0000 (00:00 +0000)]
Automatic date update in version.in
Alan Modra [Thu, 11 Jul 2019 12:38:39 +0000 (22:08 +0930)]
Dynamic TLS section symbols
It is possible to create shared libraries on PowerPC using
-ftls-model=inital-exec or -ftls-model=local-exec. The first is half
reasonable, getting you a shared library that can't be dlopen'd but
otherwise is reasonable. The second is quite bad. Not only do you
lose being able to dlopen, the library also has dynamic text
relocations. Worse, the TPREL16_LO, TPREL16_HA and other TPREL16
dynamic relocs emitted were wrong, resulting in wrong values being
applied by ld.so.
Using the first TLS section symbol in dynamic relocations for local
TLS symbols doesn't work. It's wrong because TLS symbols used by TLS
relocs have values relative to the TLS segment, whereas the TLS
section symbols are addresses. This patch instead uses a symbol index
of zero which is used elsewhere by PowerPC on dynamic TLS relocs.
It's not strictly ABI compliant to use a non-TLS symbol with TLS
relocs but symbol index zero can be interpreted as "no symbol". Not
using the first TLS section symbol means it doesn't need to be dynamic.
The patch also fixes a further problem with PowerPC32 dynamic TPREL16*
relocs, which shouldn't have the symbol value in the addend as we do
for non-TLS symbols.
bfd/
* elflink.c (_bfd_elf_omit_section_dynsym_default): Don't keep
tls_sec.
(_bfd_elf_init_1_index_section): Prefer not using TLS sections.
(_bfd_elf_init_2_index_sections): Likewise.
* elf64-ppc.c (ppc64_elf_relocate_section): When emitting dynamic
relocations for local TLS symbols, use STN_UNDEF as the relocation
symbol.
* elf32-ppc.c (ppc_elf_relocate_section): Likewise, and don't
leave TLS symbol value in the addend.
ld/
* testsuite/ld-powerpc/tlsso.r: Update.
* testsuite/ld-powerpc/tlsso32.g: Update.
* testsuite/ld-powerpc/tlsso32.r: Update.
* testsuite/ld-powerpc/tlstocso.r: Update.
* testsuite/ld-cris/tls-dso-dtpoffd2.d: Update.
* testsuite/ld-cris/tls-dso-dtpoffd4.d: Update.
* testsuite/ld-cris/tls-dso-tpoffgotcomm1.d: Update.
* testsuite/ld-cris/tls-gd-1.d: Update.
* testsuite/ld-cris/tls-gd-1h.d: Update.
* testsuite/ld-cris/tls-gd-2.d: Update.
* testsuite/ld-cris/tls-gd-2h.d: Update.
* testsuite/ld-cris/tls-ie-10.d: Update.
* testsuite/ld-cris/tls-ie-11.d: Update.
* testsuite/ld-cris/tls-ie-8.d: Update.
* testsuite/ld-cris/tls-ie-9.d: Update.
* testsuite/ld-cris/tls-js1.d: Update.
* testsuite/ld-cris/tls-ld-4.d: Update.
* testsuite/ld-cris/tls-ld-5.d: Update.
* testsuite/ld-cris/tls-ld-6.d: Update.
* testsuite/ld-cris/tls-ld-7.d: Update.
* testsuite/ld-cris/tls-ldgd-14.d: Update.
* testsuite/ld-cris/tls-ldgd-15.d: Update.
* testsuite/ld-cris/tls-ldgdx-14.d: Update.
* testsuite/ld-cris/tls-ldgdx-15.d: Update.
* testsuite/ld-cris/tls-local-54.d: Update.
* testsuite/ld-cris/tls-local-60.d: Update.
* testsuite/ld-cris/tls-local-61.d: Update.
* testsuite/ld-cris/tls-local-63.d: Update.
* testsuite/ld-cris/tls-local-64.d: Update.
* testsuite/ld-cris/tls-ok-30.d: Update.
* testsuite/ld-cris/tls-ok-32.d: Update.
* testsuite/ld-cris/tls-ok-34.d: Update.
* testsuite/ld-mips-elf/tls-multi-got-1.got: Update.
* testsuite/ld-mips-elf/tls-multi-got-1.r: Update.
* testsuite/ld-mips-elf/tlsdyn-pie-o32.d: Update.
* testsuite/ld-mips-elf/tlsdyn-pie-o32.got: Update.
* testsuite/ld-mips-elf/tlslib-o32-hidden.got: Update.
* testsuite/ld-mips-elf/tlslib-o32-ver.got: Update.
* testsuite/ld-mips-elf/tlslib-o32.got: Update.
* testsuite/ld-s390/tlspic.rd: Update.
* testsuite/ld-s390/tlspic_64.rd: Update.
* testsuite/ld-sparc/tlssunnopic32.rd: Update.
* testsuite/ld-sparc/tlssunnopic64.rd: Update.
* testsuite/ld-sparc/tlssunpic32.rd: Update.
* testsuite/ld-sparc/tlssunpic64.rd: Update.
Alan Modra [Wed, 10 Jul 2019 14:05:18 +0000 (23:35 +0930)]
PR24786, wrong LMA if first section in overlay is empty
This stops the first overlay section being ignored when empty,
losing its LMA assignment
PR 24786
* ldlang.h (enum section_type): Add first_overlay_section.
* ldlang.c (lang_add_section): Adjust switch statement.
(map_input_to_output_sections): Likewise.
(lang_size_sections_1): Always set last_os for first overlay section.
(lang_leave_overlay): Set sectype to first_overlay_section.
Alan Modra [Thu, 27 Jun 2019 00:05:15 +0000 (09:35 +0930)]
[GOLD] PowerPC R_PPC64_PCREL_OPT support
* powerpc.cc (xlate_pcrel_opt): New function.
(Target_powerpc::Relocate::relocate): Optimise PCREL34 and
GOT_PCREL34 sequences marked with PCREL_OPT.
Alan Modra [Wed, 26 Jun 2019 12:38:54 +0000 (22:08 +0930)]
[GOLD] PowerPC got reloc optimisation
Note that gold won't remove unused GOT entries, in contrast to ld.bfd
which will.
* powerpc.cc (Powerpc_relobj::make_got_relative): New function.
(relative_value_is_known): New functions.
(Target_powerpc::Relocate::relocate): Edit code using
GOT16_HA, GOT16_LO_DS, and GOT_PCREL34 relocs.
Alan Modra [Mon, 3 Jun 2019 02:18:43 +0000 (11:48 +0930)]
[GOLD] PowerPC relocations for prefix insns
Also use pc-relative instructions for notoc stubs.
elfcpp/
* powerpc.h (R_PPC64_PCREL_OPT, R_PPC64_D34, R_PPC64_D34_LO),
(R_PPC64_D34_HI30, R_PPC64_D34_HA30, R_PPC64_PCREL34),
(R_PPC64_GOT_PCREL34, R_PPC64_PLT_PCREL34, R_PPC64_PLT_PCREL34_NOTOC),
(R_PPC64_ADDR16_HIGHER34, R_PPC64_ADDR16_HIGHERA34),
(R_PPC64_ADDR16_HIGHEST34, R_PPC64_ADDR16_HIGHESTA34),
(R_PPC64_REL16_HIGHER34, R_PPC64_REL16_HIGHERA34),
(R_PPC64_REL16_HIGHEST34, R_PPC64_REL16_HIGHESTA34),
(R_PPC64_D28, R_PPC64_PCREL28): Define.
gold/
* powerpc.cc (Target_powerpc): Add powerxx_stubs_ and accessor
functions.
(Target_powerpc::maybe_skip_tls_get_addr_call): Handle PLT_PCREL34
and PLT_PCREL34_NOTOC relocs.
(Powerpc_relocate_functions): Add addr34, addr34_hi, addr34_ha,
addr28, addr16_higher34, addr16_highera34, addr16_highest34,
addr16_highest34a functions.
(li_11_0, ori_11_11_0, sldi_11_11_34): Define.
(paddi_12_pc, pld_12_pc, pnop): Define.
(d34, ha34): New inline functions.
(Stub_table::add_plt_call_entry): Handle powerxx_stubs.
(Stub_table::add_eh_frame): Likewise.
(build_powerxx_offset): New function.
(Stub_table::plt_call_size): Handle powerxx_stubs.
(Stub_table::branch_stub_size): Likewise.
(Stub_table::do_write): Likewise.
(Target_powerpc::Scan::get_reference_flags): Handle new relocs.
(Target_powerpc::Scan::reloc_needs_plt_for_ifunc: Likewise.
(Target_powerpc::Scan::local, global, relocate): Likewise.
Alan Modra [Mon, 1 Jul 2019 05:07:49 +0000 (14:37 +0930)]
[GOLD] PowerPC notoc eh_frame
When generating notoc call and branch stubs without the benefit of
pc-relative insns, the stubs need to use LR to access the run time PC.
All LR changes must be described in .eh_frame if we're to support
unwinding through asynchronous exceptions. That's what this patch
does.
The patch has gone through way too many iterations. At first I
attempted to add multiple FDEs, one for each stub. That ran into
difficulties with do_plt_fde_location which is only capable of setting
the address of a single FDE per Output_data section, and with removing
any FDEs added on a previous do_relax pass. Removing FDEs (git commit
be897fb774) went overboard in matching the FDE contents. That means
either stashing the contents created for add_eh_frame_for_plt to use
when calling remove_eh_frame_for_plt, or recreating contents on the
fly (*) just to remove FDEs. In fact, FDE content matching is quite
unnecesary. FDEs added by a previous do_relax pass are those with
u_.from_linker.post_map set. So they can easily be recognised just by
looking at that flag. This patch keeps that part of the multiple FDE
changes.
In the end I went for just one FDE per stub group to describe the call
stubs. That's reasonably efficient for the common case of only
needing to describe the __tls_get_addr_opt call stub. We don't expect
to be making many calls using notoc stubs without pc-relative insns.
*) Which has it's own set of problems. The contents must be recreated
using the old stub layout, but .eh_frame size can affect stub
requirements so you need to temporarily keep the old .eh_frame size
when creating new stubs, then reset .eh_frame size before adding new
FDEs.
* ehframe.cc (Fde::operator==): Delete.
(Cie::remove_fde): Delete.
(Eh_frame::remove_ehframe_for_plt): Delete fde_data and fde_length
parameters. Remove all post-map plt FDEs.
* ehframe.h (Fde:post_map): Make const, add variant to compare plt.
(Fde::operator==): Delete.
(Cie::remove_fde): Implement here.
(Cie::last_fde): New accessor.
(Eh_frame::remove_ehframe_for_plt): Update prototype.
* layout.cc (Layout::remove_eh_frame_for_plt): Delete fde_data and
fde_length parameters.
* layout.h (Layout::remove_eh_frame_for_plt): Update prototype.
* powerpc.cc (Stub_table::tls_get_addr_opt_bctrl_): Delete.
(Stub_table::plt_fde_len_, plt_fde_, init_plt_fde): Delete.
(Stub_table::add_plt_call_entry): Don't set tls_get_addr_opt_bctrl_.
(eh_advance): New function.
(stub_sort): New function.
(Stub_table::add_eh_frame): Emit eh_frame for notoc plt calls and
branches as well as __tls_get_addr_opt plt call stub.
(Stub_table::remove_eh_frame): Update to suit.
Alan Modra [Tue, 18 Jun 2019 06:03:38 +0000 (15:33 +0930)]
[GOLD] PowerPC64 ELFv2 notoc support
Calls from notoc functions via the PLT need different stubs. Even
calls to local functions requiring a valid toc pointer must go via a
stub. This patch provides the support in gold.
elfcpp/
* powerpc.h (R_PPC64_PLTSEQ_NOTOC, R_PPC64_PLTCALL_NOTOC): Define.
gold/
* powerpc.cc (Target_powerpc::maybe_skip_tls_get_addr_call): Handle
notoc calls.
(is_branch_reloc): Template on size. Return true for REL24_NOTOC.
Update all callers.
(max_branch_delta): Likewise.
(Target_powerpc::Branch_info::make_stub): Add a stub for notoc
calls to functions needing a valid toc pointer.
(Target_powerpc::do_relax): Layout stubs again if any need resize.
(add_12_11_12, addi_12_11, addis_12_11, ldx_12_11_12, ori_12_12_0),
(oris_12_12_0, sldi_12_12_32): Define.
(Stub_table::Plt_stub_ent): Add notoc_ and iter_ fields.
(Stub_table::Branch_stub_key, Branch_stub_key_hash): Rename from
Branch_stub_ent and Branch_stub_ent hash. Remove save_res_ from key.
(Stub_table::Branch_stub_ent): New struct.
(class Stub_table): Add need_resize and resizing vars.
(Stub_table::need_resize, branch_size): New accessors.
(Stub_table::set_resizing): New function.
(Stub_table::add_plt_call_entry): Handle notoc calls and resizing
on seeing such or a tocsave stubs after a normal stub using the
same sym.
(Stub_table::add_long_branch_entry): Similarly.
(Stub_table::find_long_branch_entry): Return a Branch_stub_ent*.
(Stub_table::define_stub_syms): Adjust
(Stub_table::build_tls_opt_head, build_tls_opt_tail): New functions.
(build_notoc_offset): New function.
(Stub_table::plt_call_size): Move out of line. Handle notoc calls.
(Stub_table::branch_stub_size): Similarly.
(Stub_table::do_write): Separate loop for ELFv2 stubs, handling
notoc calls. Simplify ELFv1 loop. Output notoc branch stubs.
Use build_tls_opt_head and build_tls_opt_tail.
(Target_powerpc::Scan::get_reference_flags): Handle REL24_NOTOC.
(Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Likewise,
and PLTSEQ_NOTOC and PLTCALL_NOTOC.
(Target_powerpc::Scan::local, global, relocate): Likewise.
GDB Administrator [Sat, 13 Jul 2019 00:00:14 +0000 (00:00 +0000)]
Automatic date update in version.in
Andrew Burgess [Fri, 1 Mar 2019 11:06:23 +0000 (11:06 +0000)]
gdb: Better support for dynamic properties with negative values
When the type of a property is smaller than the CORE_ADDR in which the
property value has been placed, and if the property is signed, then
sign extend the property value from its actual type up to the size of
CORE_ADDR.
gdb/ChangeLog:
* dwarf2loc.c (dwarf2_evaluate_property): Sign extend property
value if its desired type is smaller than a CORE_ADDR and signed.
gdb/testsuite/ChangeLog:
* gdb.fortran/vla-ptype.exp: Print array with negative bounds.
* gdb.fortran/vla-sizeof.exp: Print the size of an array with
negative bounds.
* gdb.fortran/vla-value.exp: Print elements of an array with
negative bounds.
* gdb.fortran/vla.f90: Setup an array with negative bounds for
testing.
Andrew Burgess [Wed, 8 May 2019 12:16:03 +0000 (13:16 +0100)]
gdb: Carry default property type around with dynamic properties
This commit is preparation for the next one, with the aim of better
supporting signed dynamic properties on targets where the address size
specified in the DWARF headers is smaller than a CORE_ADDR, for
example debugging an i386 application on x86-64.
Consider this small Fortran program 'bounds.f90':
program test
integer, allocatable :: array (:)
allocate (array (-5:5))
array(3) = 1
end program test
Compiled with 'gfortran -m32 -g3 -O0 -o bounds bounds.f90'. The DWARF
for 'array' looks like this:
<2><97>: Abbrev Number: 10 (DW_TAG_variable)
<98> DW_AT_name : (indirect string, offset: 0x0): array
<9c> DW_AT_decl_file : 1
<9d> DW_AT_decl_line : 2
<9e> DW_AT_type : <0xaf>
<a2> DW_AT_location : 2 byte block: 91 58 (DW_OP_fbreg: -40)
<2><a5>: Abbrev Number: 11 (DW_TAG_lexical_block)
<a6> DW_AT_low_pc : 0x80485c3
<aa> DW_AT_high_pc : 0x8b
<2><ae>: Abbrev Number: 0
<1><af>: Abbrev Number: 12 (DW_TAG_array_type)
<b0> DW_AT_data_location: 2 byte block: 97 6 (DW_OP_push_object_address; DW_OP_deref)
<b3> DW_AT_allocated : 4 byte block: 97 6 30 2e (DW_OP_push_object_address; DW_OP_deref; DW_OP_lit0; DW_OP_ne)
<b8> DW_AT_type : <0x2a>
<2><bc>: Abbrev Number: 13 (DW_TAG_subrange_type)
<bd> DW_AT_lower_bound : 4 byte block: 97 23 10 6 (DW_OP_push_object_address; DW_OP_plus_uconst: 16; DW_OP_deref)
<c2> DW_AT_upper_bound : 4 byte block: 97 23 14 6 (DW_OP_push_object_address; DW_OP_plus_uconst: 20; DW_OP_deref)
<c7> DW_AT_byte_stride : 6 byte block: 97 23 c 6 34 1e (DW_OP_push_object_address; DW_OP_plus_uconst: 12; DW_OP_deref; DW_OP_lit4; DW_OP_mul)
<2><ce>: Abbrev Number: 0
If we look at the DW_AT_lower_bound attribute, which will become a
dynamic property that GDB evaluates when needed by calling
dwarf2_evaluate_property.
The process of evaluating a dynamic property requires GDB to execute
each DW_OP_* operation, the results of these operations is held on a
stack of 'struct value *'s.
When the entire expression is evaluated the result is on top of the
stack.
If we look at DW_AT_lower_bound then the last operation is
DW_OP_deref, this loads a signed address the size of which matches the
DWARF address size, and so in our i386 on x86-64 situation, the top of
the stack will be a signed 4-byte value.
The problem is how these values are fetched from the stack. Currently
they are always fetched by a call to dwarf_expr_context::fetch_address,
which converts the value to an unsigned value with a length matching
the values current length, before converting to a CORE_ADDR. This
means we loose the signed nature of the property.
I wonder if the best solution for dealing with signed properties will
be to move away from an over reliance on fetch_address, and instead
come up with a new solution that considers the current type of the
value on the stack, and the type that the value needs to become;
basically a solution built around casting rather than assuming we
always want an address.
However, before we can start to even think about moving away from
fetch_address, there is a more urgent issue to fix, which is we don't
currently know what type each property should be. We just hold the
value of the property in a CORE_ADDR as returned by fetch_address, and
rely on higher level code (outside of the DWARF expression evaluation
code) to fix things up for us. This is what this patch aims to
address.
When creating a dynamic property (see attr_to_dynamic_prop in
dwarf2read.c) we can sometimes figure out the type of a property; if
the property is a reference to another DIE then it will have a
DW_AT_type attribute.
However, the DW_AT_lower_bound case above isn't a reference to another
DIE, it's just a DWARF expression. We don't have any indication for
what type the property should have.
Luckily, the DWARF spec helps us out, for the lower and upper bounds
5.13 of the DWARFv5 spec tells us that without any other type
information the bounds are signed integers the same size as a DWARF
address.
It is my belief that we can find a suitable default type for every
dynamic property, either specified explicitly in the DWARF spec, or we
can infer an obvious choice if the spec doesn't help us.
This commit extends the creation of all dynamic properties to include
suggesting a suitable default type, all dynamic properties now always
carry their type around with them.
In later commits we can use this property type to ensure that the
value we extract from the DWARF stack is handled in a suitable manor
to correctly maintain its sign extension.
There should be no user visible changes from this commit. The actual
fix to correctly support negative array bounds will come later.
gdb/ChangeLog:
* dwarf2loc.c (dwarf2_evaluate_property): Update to take account
of changes to field names, and use new is_reference field to
decide if a property is a reference or not.
* dwarf2loc.h (struct dwarf2_locexpr_baton): Add 'is_reference'
field.
(struct dwarf2_property_baton): Update header comment, rename
'referenced_type' to 'property_type' and update comments.
* dwarf2read.c (attr_to_dynamic_prop): Add extra parameter to hold
default property type, store in property baton, update to take
accound of renamed field.
(read_func_scope): Update call to attr_to_dynamic_prop.
(read_array_type): Likewise.
(dwarf2_per_cu_addr_sized_int_type): New function.
(read_subrange_index_type): Move type finding code to
dwarf2_per_cu_addr_sized_int_type.
(read_subrange_type): Update calls to attr_to_dynamic_prop.
(dwarf2_per_cu_addr_type): New function.
(set_die_type): Update calls to attr_to_dynamic_prop.
Andrew Burgess [Tue, 7 May 2019 23:01:14 +0000 (00:01 +0100)]
gdb/dwarf: Ensure the target type of ranges is not void
If a DW_TAG_subrange_type DWARF entry has no DW_AT_type then a default
type based on the size of an address on the current target is assumed.
We store this type as the target type for GDB's range types.
Currently GDB can create ranges for which the target type is VOID,
this is incorrect but seems to cause no problems. I believe the reason
this doesn't cause any issues is because the languages (for example
Ada) that actually make use of a ranges target type also have
compilers that generate DWARF that includes a DW_AT_type attribute.
However, gfortran does not include a DW_AT_type, its DWARF instead
relies on the default target type. This isn't currently a problem for
GDB as gfortran doesn't make use of the target type when printing
subranges, but it shouldn't hurt to fix this issue now.
I've added an assert into create_range_type that will catch this issue
if it comes up again.
This was tested on an x86-64/GNU-Linux machine with both the Ada and
gfortran compilers available with both '--target_board=unix' and
'--target_board=unix/-m32'. There are no user visible changes after
this commit.
gdb/ChangeLog:
* dwarf2read.c (read_subrange_index_type): New function.
(read_subrange_type): Move code into new function and call it.
* gdbtypes.c (create_range_type): Add some asserts.
Andrew Burgess [Sat, 4 May 2019 23:15:07 +0000 (00:15 +0100)]
gdb: Convert dwarf2_evaluate_property to return bool
Convert dwarf2_evaluate_property to return a bool, there should be no
user visible change after this commit.
gdb/ChangeLog:
* dwarf2loc.c (dwarf2_evaluate_property): Change return type, and
update return statements.
* dwarf2loc.h (dwarf2_evaluate_property): Update return type on
declaration, and update comment to match.
* gdbtypes.c (resolve_dynamic_array): Update call to
dwarf2_evaluate_property to match new return type.
Andrew Burgess [Wed, 24 Apr 2019 16:50:40 +0000 (17:50 +0100)]
gdb: Update type of lower bound in value_subscripted_rvalue
The dynamic lower (and upper) bounds of ranges are stored as type
LONGEST (see union dynamic_prop_data in gdbtypes.h). In most places
that range bounds are handled they are held in a LONGEST, however in
value_subscripted_rvalue the bound is placed into an int.
This commit changes value_subscripted_rvalue to use LONGEST, there
should be no user visible changes after this commit.
gdb/ChangeLog:
* valarith.c (value_subscripted_rvalue): Change lowerbound
parameter type from int to LONGEST.
* value.h (value_subscripted_rvalue): Likewise in declaration.
Tom de Vries [Fri, 12 Jul 2019 07:53:02 +0000 (09:53 +0200)]
[readline] Fix heap-buffer-overflow in update_line
When:
- building trunk gdb with '-fsanitize=address -lasan',
- running gdb tests with "export ASAN_OPTIONS=detect_leaks=0",
I run into a heap-buffer-overflow failure for
gdb.base/utf8-identifiers.exp.
In more detail, the libasan error report looks like this:
...
=================================================================
==22340==ERROR: AddressSanitizer: heap-buffer-overflow on address
0x619000054a80 at pc 0x7fcd0306b4c9 bp 0x7fffb1a8d880 sp 0x7fffb1a8d030
READ of size 32766 at 0x619000054a80 thread T0
#0 0x7fcd0306b4c8 (/usr/lib64/libasan.so.4+0xae4c8)
#1 0x15f12a1 in update_line
/data/gdb_versions/devel/src/readline/display.c:1377
#2 0x15f03cb in rl_redisplay
/data/gdb_versions/devel/src/readline/display.c:1204
#3 0x15bf932 in readline_internal_setup
/data/gdb_versions/devel/src/readline/readline.c:394
#4 0x15fe723 in _rl_callback_newline
/data/gdb_versions/devel/src/readline/callback.c:89
#5 0x15fe7ef in rl_callback_handler_install
/data/gdb_versions/devel/src/readline/callback.c:102
#6 0xd7bce6 in gdb_rl_callback_handler_install(char const*)
/data/gdb_versions/devel/src/gdb/event-top.c:319
#7 0xd7c0c6 in display_gdb_prompt(char const*)
/data/gdb_versions/devel/src/gdb/event-top.c:409
#8 0xd7d6c1 in command_line_handler(std::unique_ptr<char,
gdb::xfree_deleter<char> >&&)
/data/gdb_versions/devel/src/gdb/event-top.c:776
#9 0xd7b92a in gdb_rl_callback_handler
/data/gdb_versions/devel/src/gdb/event-top.c:217
#10 0x15ff479 in rl_callback_read_char
/data/gdb_versions/devel/src/readline/callback.c:220
#11 0xd7b4d5 in gdb_rl_callback_read_char_wrapper_noexcept
/data/gdb_versions/devel/src/gdb/event-top.c:175
#12 0xd7b6b5 in gdb_rl_callback_read_char_wrapper
/data/gdb_versions/devel/src/gdb/event-top.c:192
#13 0xd7c8aa in stdin_event_handler(int, void*)
/data/gdb_versions/devel/src/gdb/event-top.c:514
#14 0xd76ca7 in handle_file_event
/data/gdb_versions/devel/src/gdb/event-loop.c:731
#15 0xd7751f in gdb_wait_for_event
/data/gdb_versions/devel/src/gdb/event-loop.c:857
#16 0xd7547e in gdb_do_one_event()
/data/gdb_versions/devel/src/gdb/event-loop.c:321
#17 0xd75526 in start_event_loop()
/data/gdb_versions/devel/src/gdb/event-loop.c:370
#18 0x101b04c in captured_command_loop
/data/gdb_versions/devel/src/gdb/main.c:331
#19 0x101de73 in captured_main
/data/gdb_versions/devel/src/gdb/main.c:1173
#20 0x101df03 in gdb_main(captured_main_args*)
/data/gdb_versions/devel/src/gdb/main.c:1188
#21 0x872dba in main /data/gdb_versions/devel/src/gdb/gdb.c:32
#22 0x7fcd00f2ff49 in __libc_start_main (/lib64/libc.so.6+0x20f49)
#23 0x872bc9 in _start (/data/gdb_versions/devel/build/gdb/gdb+0x872bc9)
0x619000054a80 is located 0 bytes to the right of 1024-byte region
[0x619000054680,0x619000054a80)
allocated by thread T0 here:
#0 0x7fcd03099510 in malloc (/usr/lib64/libasan.so.4+0xdc510)
#1 0xae0078 in xmalloc
/data/gdb_versions/devel/src/gdb/common/common-utils.c:44
#2 0x15eaccb in init_line_structures
/data/gdb_versions/devel/src/readline/display.c:458
#3 0x15eb4d8 in rl_redisplay
/data/gdb_versions/devel/src/readline/display.c:526
#4 0x15bf932 in readline_internal_setup
/data/gdb_versions/devel/src/readline/readline.c:394
#5 0x15fe723 in _rl_callback_newline
/data/gdb_versions/devel/src/readline/callback.c:89
#6 0x15fe7ef in rl_callback_handler_install
/data/gdb_versions/devel/src/readline/callback.c:102
#7 0xd7bce6 in gdb_rl_callback_handler_install(char const*)
/data/gdb_versions/devel/src/gdb/event-top.c:319
#8 0xd7c0c6 in display_gdb_prompt(char const*)
/data/gdb_versions/devel/src/gdb/event-top.c:409
#9 0xaa041b in cli_interp_base::pre_command_loop()
/data/gdb_versions/devel/src/gdb/cli/cli-interp.c:286
#10 0xf5342a in interp_pre_command_loop(interp*)
/data/gdb_versions/devel/src/gdb/interps.c:320
#11 0x101b047 in captured_command_loop
/data/gdb_versions/devel/src/gdb/main.c:328
#12 0x101de73 in captured_main
/data/gdb_versions/devel/src/gdb/main.c:1173
#13 0x101df03 in gdb_main(captured_main_args*)
/data/gdb_versions/devel/src/gdb/main.c:1188
#14 0x872dba in main /data/gdb_versions/devel/src/gdb/gdb.c:32
#15 0x7fcd00f2ff49 in __libc_start_main (/lib64/libc.so.6+0x20f49)
SUMMARY: AddressSanitizer: heap-buffer-overflow
(/usr/lib64/libasan.so.4+0xae4c8)
Shadow bytes around the buggy address:
0x0c3280002900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c3280002950:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3280002960: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3280002970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3280002990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c32800029a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==22340==ABORTING
...
I've written an assert in rl_redisplay that formulates the error condition:
...
@@ -1387,6 +1389,10 @@ rl_redisplay (void)
cpos_adjusted = 0;
+ assert (last_lmargin + (_rl_screenwidth + visible_wrap_offset)
+ <= line_size);
+ assert (lmargin + (_rl_screenwidth + (lmargin ? 0 : wrap_offset))
+ <= line_size);
update_line (&visible_line[last_lmargin],
&invisible_line[lmargin],
0,
_rl_screenwidth + visible_wrap_offset,
_rl_screenwidth + (lmargin ? 0 : wrap_offset),
0);
...
which triggers without needing the address sanitizer (or even an executable),
like this:
...
$ TERM=dumb gdb -q -ex "set width 0"
gdb: src/display.c:1393: rl_redisplay: Assertion
`last_lmargin + (_rl_screenwidth + visible_wrap_offset) <= line_size'
failed.
Aborted (core dumped)
...
The basic problem is this: visible_line and invisible_line have length
line_size, but the update_line call assumes that line_size is at least
_rl_screenwidth + 1. Executing "set width 0" sets _rl_screenwidth to 32766 but
doesn't affect line_size, which is initialized to 1024.
Fix this by ensuring in init_line_structures and rl_redisplay that line_size
is at least _rl_screenwidth + 1.
Tested on x86_64-linux.
Reviewed by readline maintainer (
https://sourceware.org/ml/gdb-patches/2019-05/msg00566.html ).
readline/ChangeLog.gdb:
2019-07-12 Tom de Vries <tdevries@suse.de>
Chet Ramey <chet.ramey@case.edu>
PR cli/24514
* readline/display.c (init_line_structures, rl_redisplay): Ensure
line_size is at least _rl_screenwidth + 1.
GDB Administrator [Fri, 12 Jul 2019 00:00:19 +0000 (00:00 +0000)]
Automatic date update in version.in
Andrew Burgess [Thu, 11 Jul 2019 14:39:55 +0000 (15:39 +0100)]
gdb: Add command completers for some info commands
Add command completion for info variables, functions, args, and
locals. This completer only completes the command line options as
these commands all take a regexp which GDB can't really offer
completions for.
gdb/ChangeLog:
* cli/cli-utils.c (info_print_command_completer): New function.
* cli/cli-utils.h: Add 'completer.h' include, and forward
declaration for 'struct cmd_list_element'.
(info_print_command_completer): Declare.
* stack.c (_initialize_stack): Add completer for 'info locals' and
'info args'.
* symtab.c (_initialize_symtab): Add completer for 'info
variables' and 'info functions'.
* NEWS: Mention completion for additional info commands.
Andrew Burgess [Wed, 10 Jul 2019 21:52:38 +0000 (22:52 +0100)]
gdb: Make use of gdb::option framework for some info commands
Update the 'info variables', 'info functions', 'info locals', and
'info args' commands to make use of the gdb::options framework.
There should be no user visible changes after this commit as I have
left the help text generation using the existing mechanism, which
already tries to customise the text for each of the commands.
gdb/ChangeLog:
* cli/cli-utils.c (extract_info_print_args): Delete.
(extract_arg_maybe_quoted): Delete.
(info_print_options_defs): New variable.
(make_info_print_options_def_group): New function.
(extract_info_print_options): Define new function.
* cli/cli-utils.h (extract_info_print_args): Delete.
(struct info_print_options): New structure.
(extract_info_print_options): Declare new function.
* stack.c (info_locals_command): Update to use new
extract_info_print_options, also add a header comment.
(info_args_command): Likewise.
* symtab.c (info_variables_command): Likewise.
(info_functions_command): Likewise.
Andrew Burgess [Thu, 11 Jul 2019 10:08:42 +0000 (11:08 +0100)]
gdb: Allow quoting around string options in the gdb::option framework
Currently string options must be a single string with no whitespace,
this limitation prevents the gdb::option framework being used in some
places.
After this commit, string options can be quoted in single or double
quotes, and quote characters can be escaped with a backslash if needed
to either place them within quotes, or to avoid starting a quoted
argument.
This test adds a new function extract_string_maybe_quoted which is
basically a copy of extract_arg_maybe_quoted from cli/cli-utils.c,
however, the cli-utils.c function will be deleted in the next commit.
There are tests to exercise the new quoting mechanism.
gdb/ChangeLog:
* cli/cli-option.c (parse_option): Use extract_string_maybe_quoted
to extract string arguments.
* common/common-utils.c (extract_string_maybe_quoted): New function.
* common/common-utils.h (extract_string_maybe_quoted): Declare.
gdb/testsuite/ChangeLog:
* gdb.base/options.exp (expect_string): Dequote strings in
results.
(test-string): Test strings with different quoting and reindent.
Tom Tromey [Thu, 11 Jul 2019 14:54:17 +0000 (08:54 -0600)]
Remove init_cli_cmds
I noticed that init_cli_cmds only installs a command, and so doesn't
need to be handled specially. This patch merges it into
_initialize_cli_cmds.
The help text is constructed dynamically, which is sometimes an
indication that special treatment is needed; but in this case it is
just to insert the value of "gdbinit", which is created at
compile-time and not modified; so this doesn't affect the result.
This version also removes the "gdbinit" global. There's no need for
it, as GDBINIT can be used instead. Note, though, that the help text
in question must still be dynamically constructed, in order to be
i18n-friendly.
gdb/ChangeLog
2019-07-11 Tom Tromey <tromey@adacore.com>
* main.c (get_init_files): Use GDBINIT, not gdbinit.
* auto-load.c (file_is_auto_load_safe): Use GDBINIT, not gdbinit.
* top.h (gdbinit): Don't declare.
* cli/cli-cmds.c (init_cli_cmds): Remove, merging contents
into...
(_initialize_cli_cmds): ...here. Use GDBINIT, not gdbinit.
* top.c (gdb_init): Don't call init_cli_cmds.
(gdbinit): Remove.
* cli/cli-cmds.h (init_cli_cmds): Don't declare.
Tom Tromey [Thu, 11 Jul 2019 15:09:52 +0000 (09:09 -0600)]
Fix use-after-move bug in add_thread_object
commit
05b08ac1608 ("Reduce manual reference counting in
py-inferior.c") introduced a use-after-move bug in add_thread_object,
causing a test suite failure. This patch fixes the bug.
Tested on x86-64 Fedora 29.
gdb/ChangeLog
2019-07-11 Tom Tromey <tromey@adacore.com>
* python/py-inferior.c (add_thread_object): Don't use thread_obj
after it has been moved.
Simon Marchi [Thu, 11 Jul 2019 01:49:32 +0000 (21:49 -0400)]
Make value_must_coerce_to_target return a bool
... and move comment to header file.
gdb/ChangeLog:
* valops.c (value_must_coerce_to_target): Change return type to
bool.
* value.h (value_must_coerce_to_target): Likewise.
Simon Marchi [Thu, 11 Jul 2019 01:20:38 +0000 (21:20 -0400)]
breakpoint: Make is_*point functions return bool
This includes changing the FILTER parameters of two functions
accordingly. I also tried to normalize the function comments to our
current standards.
gdb/ChangeLog:
* breakpoint.c (is_hardware_watchpoint): Remove
forward-declaration.
(is_masked_watchpoint): Change return type to bool.
(is_tracepoint): Likewise.
(is_breakpoint): Likewise.
(is_hardware_watchpoint): Likewise.
(is_watchpoint): Likewise.
(is_no_memory_software_watchpoint): Likewise.
(is_catchpoint): Likewise.
(breakpoint_1): Make FILTER parameter's return type bool.
is_masked_watchpoint): Change return type to bool.
(save_breakpoints): Make FILTER parameter's return type bool.
* breakpoint.h (is_breakpoint): Change return type to bool.
(is_watchpoint): Likewise.
(is_catchpoint): Likewise.
(is_tracepoint): Likewise.
GDB Administrator [Thu, 11 Jul 2019 00:00:37 +0000 (00:00 +0000)]
Automatic date update in version.in
Tom Tromey [Sun, 9 Jun 2019 21:21:02 +0000 (15:21 -0600)]
Don't include gdbarch.h from defs.h
I touched symtab.h and was surprised to see how many files were
rebuilt. I looked into it a bit, and found that defs.h includes
gdbarch.h, which in turn includes many things.
gdbarch.h is only needed by a minority ofthe files in gdb, so this
patch removes the include from defs.h and updates the fallout.
I did "wc -l" on the files in build/gdb/.deps; this patch reduces the
line count from 139935 to 137030; so there are definitely future
build-time savings here.
Note that while I configured with --enable-targets=all, it's possible
that some *-nat.c file needs an update. I could not test all of
these. The buildbot caught a few problems along these lines.
gdb/ChangeLog
2019-07-10 Tom Tromey <tom@tromey.com>
* defs.h: Don't include gdbarch.h.
* aarch64-ravenscar-thread.c, aarch64-tdep.c, alpha-bsd-tdep.h,
alpha-linux-tdep.c, alpha-mdebug-tdep.c, arch-utils.h, arm-tdep.h,
ax-general.c, btrace.c, buildsym-legacy.c, buildsym.h, c-lang.c,
cli/cli-decode.h, cli/cli-dump.c, cli/cli-script.h,
cli/cli-style.h, coff-pe-read.h, compile/compile-c-support.c,
compile/compile-cplus.h, compile/compile-loc2c.c, corefile.c,
cp-valprint.c, cris-linux-tdep.c, ctf.c, d-lang.c, d-namespace.c,
dcache.c, dicos-tdep.c, dictionary.c, disasm-selftests.c,
dummy-frame.c, dummy-frame.h, dwarf2-frame-tailcall.c,
dwarf2expr.c, expression.h, f-lang.c, frame-base.c,
frame-unwind.c, frv-linux-tdep.c, gdbarch-selftests.c, gdbtypes.h,
go-lang.c, hppa-nbsd-tdep.c, hppa-obsd-tdep.c, i386-dicos-tdep.c,
i386-tdep.h, ia64-vms-tdep.c, interps.h, language.c,
linux-record.c, location.h, m2-lang.c, m32r-linux-tdep.c,
mem-break.c, memattr.c, mn10300-linux-tdep.c, nios2-linux-tdep.c,
objfiles.h, opencl-lang.c, or1k-linux-tdep.c, p-lang.c,
parser-defs.h, ppc-tdep.h, probe.h, python/py-record-btrace.c,
record-btrace.c, record.h, regcache-dump.c, regcache.h,
riscv-fbsd-tdep.c, riscv-linux-tdep.c, rust-exp.y,
sh-linux-tdep.c, sh-nbsd-tdep.c, source-cache.c,
sparc-nbsd-tdep.c, sparc-obsd-tdep.c, sparc-ravenscar-thread.c,
sparc64-fbsd-tdep.c, std-regs.c, target-descriptions.h,
target-float.c, tic6x-linux-tdep.c, tilegx-linux-tdep.c, top.c,
tracefile.c, trad-frame.c, type-stack.h, ui-style.c, utils.c,
utils.h, valarith.c, valprint.c, varobj.c, x86-tdep.c,
xml-support.h, xtensa-linux-tdep.c, cli/cli-cmds.h: Update.
* s390-linux-nat.c, procfs.c, inf-ptrace.c: Likewise.
Tom Tromey [Wed, 10 Jul 2019 17:05:20 +0000 (11:05 -0600)]
Change Ada catchpoints to be bp_catchpoint
Like Pedro's earlier patches to change catchpoint to be of type
bp_catchpoint, this changes the Ada catchpoints to follow.
Tested on x86-64 Fedora 29.
gdb/ChangeLog
2019-07-10 Tom Tromey <tromey@adacore.com>
* ada-lang.h (is_ada_exception_catchpoint): Declare.
* breakpoint.c (init_ada_exception_breakpoint): Register as
bp_catchpoint.
(print_one_breakpoint_location, print_one_breakpoint): Use
is_ada_exception_catchpoint.
* ada-lang.c (class ada_catchpoint_location): Pass
bp_loc_software_breakpoint to bp_location constructor.
(is_ada_exception_catchpoint): New function.
gdb/testsuite/ChangeLog
2019-07-10 Tom Tromey <tromey@adacore.com>
* gdb.ada/mi_ex_cond.exp: Update expected results.
* gdb.ada/mi_catch_ex_hand.exp: Update expected results.
* gdb.ada/mi_catch_ex.exp: Update expected results.
* gdb.ada/mi_catch_assert.exp: Update expected results.
* gdb.ada/catch_ex.exp (catch_exception_info)
(catch_exception_entry, catch_assert_entry)
(catch_unhandled_entry): Update.
* gdb.ada/catch_assert_if.exp: Update expected results.
Tom Tromey [Tue, 2 Jul 2019 19:45:28 +0000 (13:45 -0600)]
Change arm-tdep.c to use type-safe registry
This changes arm-tdep.c to use the type-safe registry, removing a use
of VEC in the process.
2019-07-10 Tom Tromey <tromey@adacore.com>
* arm-tdep.c (arm_exidx_entry_s): Remove typedef. Don't define
VEC.
(struct arm_exidx_entry): New method operator<.
(struct arm_exidx_data) <section_maps>: Change type.
(arm_exidx_data_free): Remove.
(arm_exidx_data_key): Change type. Move lower.
(arm_exidx_new_objfile): Update.
(arm_compare_exidx_entries): Remove.
(arm_find_exidx_entry, _initialize_arm_tdep)
Tom Tromey [Thu, 27 Jun 2019 19:52:42 +0000 (13:52 -0600)]
Change solib-spu.c to use type-safe registry
This changes solib-spu.c to use the type-safe registry.
2019-07-10 Tom Tromey <tromey@adacore.com>
* solib-spu.c (ocl_program_data_key): Change type.
(append_ocl_sos, ocl_enable_break, _initialize_spu_solib):
Update.
Tom Tromey [Thu, 27 Jun 2019 19:48:44 +0000 (13:48 -0600)]
Change solib-aix.c to use type-safe registry
This changes solib-aix.c to use the type-safe registry, and removes a
use of VEC in the process.
gdb/ChangeLog
2019-07-10 Tom Tromey <tromey@adacore.com>
* solib-aix.c (lm_info_aix_p): Remove typedef. Don't define VEC.
(struct solib_aix_inferior_data) <library_list>: Change type.
(solib_aix_inferior_data_handle): Change type.
(get_solib_aix_inferior_data): Update.
(solib_aix_free_library_list): Remove.
(library_list_start_library): Update.
(solib_aix_parse_libraries, solib_aix_get_library_list): Change
return type.
(solib_aix_get_library_list)
(solib_aix_solib_create_inferior_hook, solib_aix_current_sos)
(solib_aix_normal_stop_observer, _initialize_solib_aix): Update.
Tom Tromey [Wed, 26 Jun 2019 19:16:18 +0000 (13:16 -0600)]
Change solib-dsbt.c to use type-safe registry
This changes solib-dsbt.c to use the type-safe registry.
2019-07-10 Tom Tromey <tromey@adacore.com>
* solib-dsbt.c (struct dsbt_info): Add initializers.
(solib_dsbt_pspace_data): Change type.
(dsbt_pspace_data_cleanup): Remove.
(get_dsbt_info, _initialize_dsbt_solib): Update.