From: Andrew Burgess <andrew.burgess@embecosm.com>
To: gdb-patches@sourceware.org
Cc: Shahab.Vahedi@synopsys.com, palves@redhat.com, tom@tromey.com,
Andrew Burgess <andrew.burgess@embecosm.com>
Subject: [PATCH 2/2] gdb/tui: Disassembler scrolling of very small programs
Date: Fri, 24 Jan 2020 21:29:00 -0000 [thread overview]
Message-ID: <3073ce5588097f61f2391bdfad015a31665ce50d.1579900754.git.andrew.burgess@embecosm.com> (raw)
In-Reply-To: <cover.1579900754.git.andrew.burgess@embecosm.com>
In-Reply-To: <cover.1579900754.git.andrew.burgess@embecosm.com>
In TUI mode, if the disassembly output for the program is less than
one screen long, then currently if the user scrolls down until on the
last assembly instruction is displayed and then tries to scroll up
using Page-Up, the display doesn't update - they are stuck viewing the
last line.
If the user tries to scroll up using the Up-Arrow, then the display
scrolls normally.
What is happening is on the Page-Up we ask GDB to scroll backward the
same number of lines as the height of the TUI ASM window. The back
scanner, which looks for a good place to start disassembling, fails to
find a starting address which will provide the requested number of new
lines before we get back to the original starting address (which is
not surprising, our whole program contains less than a screen height
of instructions), as a result the back scanner gives up and returns
the original starting address.
When we scroll with Up-Arrow we only ask the back scanner to find 1
new instruction, which it manages to do, so this scroll works.
The solution here is, when we fail to find enough instructions, to
return the lowest address we did manage to find. This will ensure we
jump to the lowest possible address in the disassembly output.
gdb/ChangeLog:
PR tui/9765
* tui/tui-disasm.c (tui_find_disassembly_address): If we don't
have enough lines to fill the screen, still return the lowest
address we found.
gdb/testsuite/ChangeLog:
PR tui/9765
* gdb.tui/tui-layout-asm-short-prog.S: New file.
* gdb.tui/tui-layout-asm-short-prog.exp: New file.
Change-Id: I6a6a7972c68a0559e9717fd8d82870b669a40af3
---
gdb/ChangeLog | 7 +++
gdb/testsuite/ChangeLog | 6 +++
gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S | 22 ++++++++++
.../gdb.tui/tui-layout-asm-short-prog.exp | 51 ++++++++++++++++++++++
gdb/tui/tui-disasm.c | 2 +-
5 files changed, 87 insertions(+), 1 deletion(-)
create mode 100644 gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
create mode 100644 gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
diff --git a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
new file mode 100644
index 00000000000..7705ef139aa
--- /dev/null
+++ b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2020 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .global _start
+_start:
+ .rept 5
+ nop
+ .endr
diff --git a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
new file mode 100644
index 00000000000..d0b871ff762
--- /dev/null
+++ b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
@@ -0,0 +1,51 @@
+# Copyright 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Ensure that 'layout asm' can scroll away from the last line of a
+# very short program using a page up sized scroll.
+
+load_lib "tuiterm.exp"
+
+standard_testfile tui-layout-asm-short-prog.S
+
+if {[build_executable "failed to prepare" ${testfile} ${srcfile} \
+ {debug additional_flags=-nostdlib \
+ additional_flags=-nostartfiles}] == -1} {
+ return -1
+}
+
+Term::clean_restart 24 80 $testfile
+if {![Term::prepare_for_tui]} {
+ unsupported "TUI not supported"
+}
+
+# This puts us into TUI mode, and should display the ASM window.
+Term::command "layout asm"
+Term::check_box_contents "check asm box contents" 0 0 80 15 "<_start>"
+
+# Record the first line of output, we'll need this later.
+set first_line [Term::get_line 1]
+
+# Scroll forward a large amount, this should take us to the last
+# instruction in the program.
+Term::command "+ 13"
+Term::check_box_contents "check asm box contents again" 0 0 80 15 \
+ "^ *$hex\[^\n\]+\n +\n"
+
+# Now scroll backward again, we should return to the start of the
+# program.
+Term::command "- 13"
+gdb_assert {[string eq "$first_line" [Term::get_line 1]]} \
+ "check first line is back"
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index 726b7c27d60..547d2c9e6d6 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -268,7 +268,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
if (asm_lines.size () < max_lines)
{
if (!possible_new_low.has_value ())
- return pc;
+ return new_low;
/* Take the best possible match we have. */
new_low = *possible_new_low;
--
2.14.5
next prev parent reply other threads:[~2020-01-24 21:22 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20200110115728.13940-1-shahab.vahedi@gmail.com>
2020-01-10 12:53 ` [PATCH v2][PR tui/9765] Fix segfault in asm TUI when reaching end of file Pedro Alves
2020-01-10 13:37 ` [PATCH] Don't let TUI exceptions escape to readline (PR tui/9765) Pedro Alves
2020-01-10 14:31 ` Shahab Vahedi
2020-01-13 20:46 ` [PATCH 2/2] gdb/tui: asm window handles invalid memory and scrolls better Andrew Burgess
2020-01-15 0:57 ` Tom Tromey
2020-01-13 22:04 ` [PATCH 1/2] gdb/tui: Prevent exceptions from trying to cross readline Andrew Burgess
2020-01-15 0:56 ` Tom Tromey
[not found] ` <cover.1578948166.git.andrew.burgess@embecosm.com>
2020-01-14 14:19 ` [PATCH 0/2] gdb/tui: Assembler window scrolling fixes Shahab Vahedi
2020-01-16 0:48 ` [PATCHv2 2/2] gdb/tui: asm window handles invalid memory and scrolls better Andrew Burgess
2020-01-21 16:27 ` Shahab Vahedi
2020-01-22 13:30 ` Shahab Vahedi
2020-01-22 16:32 ` Andrew Burgess
2020-01-22 19:26 ` Pedro Alves
2020-01-16 0:48 ` [PATCHv2 0/2] gdb/tui: Assembler window scrolling fixes Andrew Burgess
2020-01-24 11:22 ` Shahab Vahedi
2020-01-24 21:22 ` [PATCH 0/2] Further Assembler Scrolling Fixes Andrew Burgess
2020-01-24 21:22 ` [PATCH 1/2] gdb/tui: Update help text for scroll commands Andrew Burgess
2020-01-26 16:07 ` Tom Tromey
2020-01-24 21:29 ` Andrew Burgess [this message]
2020-01-26 16:10 ` [PATCH 2/2] gdb/tui: Disassembler scrolling of very small programs Tom Tromey
2020-01-31 10:10 ` Shahab Vahedi
2020-01-16 2:55 ` [PATCHv2 1/2] gdb/tui: Prevent exceptions from trying to cross readline Andrew Burgess
2020-01-10 14:42 ` [PATCH] Don't let TUI exceptions escape to readline (PR tui/9765) Tom Tromey
2020-01-10 13:47 ` [PATCH v2][PR tui/9765] Fix segfault in asm TUI when reaching end of file Shahab Vahedi
2020-01-11 2:00 ` Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3073ce5588097f61f2391bdfad015a31665ce50d.1579900754.git.andrew.burgess@embecosm.com \
--to=andrew.burgess@embecosm.com \
--cc=Shahab.Vahedi@synopsys.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox