]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Simplify gdb.tui/tui-layout-asm.exp
authorTom de Vries <tdevries@suse.de>
Fri, 2 May 2025 20:21:36 +0000 (22:21 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 2 May 2025 20:21:36 +0000 (22:21 +0200)
On x86_64-cygwin, with test-case gdb.tui/tui-layout-asm.exp I run into:
...
WARNING: The following failure is probably due to the TUI window
         width.  See the comments in the test script for more
         details.
FAIL: $exp: scroll to end of assembler (scroll failed)
...

The problem is as follows.

On the TUI screen, we have:
1 | 0x1004010ff <__gdb_set_unbuffered_output+95> nop                         |
2 | 0x100401100 <__cxa_atexit>                   jmp *0x6fc2(%rip) # 0x10040 |
...

We send the down key, which should have the effect of scrolling up.  So, we
expect that the second line moves to the first line.

That seems to be the case indeed:
...
1 | 0x100401100 <__cxa_atexit> jmp *0x6fc2(%rip) # 0x1004080c8 <__imp___cxa_ |
...
but the line has changed somewhat, so the matching fails.

We could increase the width of the screen, as suggested in the test-case, but
I think that approach is fragile.

Instead, fix this by relaxing the matching: just check that the line before
scrolling is fully contained in the line after scrolling, or the other way
around.

Doing so gets us the next failure:
...
FAIL: $exp: scroll to end of assembler (too much assembler)
...

The test-case states:
...
    if { $down_count > 250 } {
# Maybe we should accept this as a pass in case a target
# really does have loads of assembler to scroll through.
fail "$testname (too much assembler)"
...
and I agree, so fix this by issuing a pass.

This results in the test-case taking ~20 seconds, so reduce the maximum number
of scrolls from 250 to 25, bringing that down to ~10 seconds.

Tested on x86_64-cygwin and x86_64-linux.

PR testsuite/32898
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32898

gdb/testsuite/gdb.tui/tui-layout-asm.exp

index ec78a0c018fb6a5647a1602b4612c15bc210a307..333276ecc271ff54dd2257700154a029b5c4b6a4 100644 (file)
@@ -24,7 +24,9 @@ if {[build_executable "failed to prepare" ${testfile} ${srcfile}] == -1} {
     return -1
 }
 
-# PPC currently needs a minimum window width of 90 to work correctly.
+# The wider the window is, the less line truncation happens, so matching
+# pre-scroll to post-scroll lines is more accurate.  But 100% accurate line
+# matching isn't a goal of the test-case.
 set tui_asm_window_width 90
 
 Term::clean_restart 24 ${tui_asm_window_width} $testfile
@@ -33,15 +35,41 @@ if {![Term::prepare_for_tui]} {
     return
 }
 
-# Helper proc, returns a count of the ' ' characters in STRING.
-proc count_whitespace { string } {
-    return [expr {[llength [split $string { }]] - 1}]
-}
-
 # This puts us into TUI mode, and should display the ASM window.
 Term::command_no_prompt_prefix "layout asm"
 Term::check_box_contents "check asm box contents" 0 0 ${tui_asm_window_width} 15 "<main>"
 
+set re_border [string_to_regexp "|"]
+
+proc drop_borders { line } {
+    # Drop left border.
+    set line [regsub -- ^$::re_border $line {}]
+    # Drop right border.
+    set line [regsub -- $::re_border$ $line {}]
+
+    return $line
+}
+
+proc lines_match { line1 line2 } {
+    set line1 [drop_borders $line1]
+    set line2 [drop_borders $line2]
+
+    foreach line [list $line1 $line2] re [list $line2 $line1] {
+       # Convert to regexp.
+       set re [string_to_regexp $re]
+
+       # Ignore whitespace mismatches.
+       regsub -all {\s+} $re {\s+} re
+
+       # Allow a substring match.
+       if { [regexp -- $re $line] } {
+           return 1
+       }
+    }
+
+    return 0
+}
+
 # Scroll the ASM window down using the down arrow key.  In an ideal
 # world we'd like to use PageDown here, but currently our terminal
 # library doesn't support such advanced things.
@@ -58,51 +86,55 @@ while (1) {
     # below will just timeout.  So for now we avoid testing the edge
     # case.
     if {[regexp -- "^\\| +\\|$" $line]} {
-       # Second line is blank, we're at the end of the assembler.
-       pass $testname
+       # Second line is blank, we're at the end of the assembly.
+       pass "$testname (end of assembly reached)"
        break
     }
 
     # Send the down key to GDB.
     send_gdb "\033\[B"
     incr down_count
-    set re_line [string_to_regexp $line]
-    # Ignore whitespace mismatches.
-    regsub -all {\s+} $re_line {\s+} re_line
+
+    # Get address from the line.
+    regexp \
+       [join \
+            [list \
+                 ^ \
+                 $re_border \
+                 {\s+} \
+                 ($hex) \
+                 {\s+}] \
+            ""] \
+       $line \
+       match \
+       address
+
+    # Regexp to match line containing address.
+    set re_line \
+       [join \
+            [list \
+                 ^ \
+                 $re_border \
+                 {\s+} \
+                 $address \
+                 {\s+} \
+                 {[^\r\n]+} \
+                 $re_border \
+                 $] \
+            ""]
+
     if {[Term::wait_for $re_line] \
-           && [regexp $re_line [Term::get_line 1]]} {
+           && [lines_match $line [Term::get_line 1]]} {
        # We scrolled successfully.
     } else {
-       if {[count_whitespace ${line}] != \
-               [count_whitespace [Term::get_line 1]]} {
-           # GDB's TUI assembler display will widen columns based on
-           # the longest item that appears in a column on any line.
-           # As we have just scrolled, and so revealed a new line, it
-           # is possible that the width of some columns has changed.
-           #
-           # As a result it is possible that part of the line we were
-           # expected to see in the output is now off the screen. And
-           # this test will fail.
-           #
-           # This is unfortunate, but, right now, there's no easy way
-           # to "lock" the format of the TUI assembler window.  The
-           # only option appears to be making the window width wider,
-           # this can be done by adjusting TUI_ASM_WINDOW_WIDTH.
-           verbose -log "WARNING: The following failure is probably due to the TUI window"
-           verbose -log "         width.  See the comments in the test script for more"
-           verbose -log "         details."
-       }
-
        fail "$testname (scroll failed)"
        Term::dump_screen
        break
     }
 
-    if { $down_count > 250 } {
-       # Maybe we should accept this as a pass in case a target
-       # really does have loads of assembler to scroll through.
-       fail "$testname (too much assembler)"
-       Term::dump_screen
+    if { $down_count > 25 } {
+       # We've scrolled enough, we're done.
+       pass "$testname (scroll limit reached)"
        break
     }
 }