blob: 771505add1f638aae5abe663bc6a15708d683b30 [file]
# Copyright (C) 2026 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/>.
# Test the gdb.Symtab.source_lines method.
load_lib gdb-python.exp
require allow_python_tests
standard_testfile
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
if {[build_executable "failed to build" $testfile $srcfile]} {
return
}
# Start with a fresh GDB, but enable color support.
with_ansi_styling_terminal {
clean_restart $testfile
}
if {![runto_main]} {
return
}
set lineno_a [gdb_get_line_number "Location A"]
set lineno_b [gdb_get_line_number "Location B"]
set lineno_c [gdb_get_line_number "Location C"]
# Run CMD, either 'list' or a Python replacement for that command,
# passing in ARGS. Collect all of the command output and return it.
# Requires that the command output not be empty (otherwise this will
# emit a FAIL).
proc list_lines { cmd args testname } {
if { $args ne "" } {
set args " $args"
}
set content ""
gdb_test_multiple "$cmd$args" $testname {
-re "$cmd$args\r\n" {
exp_continue
}
-re "^$::gdb_prompt $" {
gdb_assert { $content ne "" } $gdb_test_name
}
-re "(^\[^\r\n\]*\r\n)" {
set content $content$expect_out(1,string)
exp_continue
}
}
return $content
}
# Run 'list' and compare the output to the output of 'py-list' or
# 'py-list-unstyled', which are commands implemented in this tests
# Python script file.
#
# CLI_ARGS is a string passed to 'list', and PY_ARGS is a string
# passed to the two 'py-list*' commands. Passing the empty string to
# the py-list* commands is a valid possibility, which is why the
# default here is "NONE". If PY_ARGS is the default value then
# CLI_ARGS is used for both.
proc compare_list_cmds { cli_args { py_args "NONE" } } {
if { $py_args eq "NONE" } {
set py_args $cli_args
}
with_test_prefix "styling on" {
set content_cli_styled [list_lines list $cli_args \
"get lines from builtin list command"]
set content_py_styled [list_lines py-list $py_args \
"get lines from python list command"]
gdb_assert { $content_cli_styled == $content_py_styled } \
"cli and py commands gave same output"
}
gdb_test_no_output -nopass "set style enabled off"
with_test_prefix "styling off" {
set content_cli_unstyled [list_lines list $cli_args \
"get lines from builtin list command"]
set content_py_unstyled [list_lines py-list $py_args \
"get lines from python list command"]
gdb_assert { $content_cli_unstyled == $content_py_unstyled } \
"cli and py commands gave same output"
}
gdb_test_no_output -nopass "set style enabled on"
with_test_prefix "force unstyled" {
set content_py_unstyled [list_lines py-list-unstyled $py_args \
"get lines from python list command"]
gdb_assert { $content_cli_unstyled == $content_py_unstyled } \
"cli and py commands gave same output"
}
}
gdb_test_no_output -nopass "source $pyfile"
foreach {first last} [list $lineno_a $lineno_b \
$lineno_a $lineno_c \
1 $lineno_b \
1 999] {
with_test_prefix "$first..$last" {
compare_list_cmds $first,$last
}
}
# This invokes the Python py-list command with no arguments. This
# then exercises the Symtab.source_lines method with no arguments
# being passed.
compare_list_cmds 1,999 ""
# Now some error checking.
foreach_with_prefix cmd { py-list py-list-unstyled } {
gdb_test "$cmd -1,5" \
"Error occurred in Python: Invalid value -1 for first line number, minimum value is 1\\."
gdb_test "$cmd 10,5" \
"Error occurred in Python: First line 10 is after the last line 5\\."
gdb_test "$cmd 999,10" \
"Error occurred in Python: Line number 999 out of range, file has $lineno_c lines\\."
gdb_test "$cmd 10,-10" \
"Error occurred in Python: Invalid value -10 for last line number\\."
}
# Now test the case where the source file is missing. To achieve this
# we first need to compile a new executable using a copy of the source
# file.
set srcfile2 [standard_output_file $testfile-copy.c]
file copy ${srcdir}/${subdir}/${srcfile} $srcfile2
set testfile2 ${testfile}-missing-src
if {[build_executable "failed to build" $testfile2 $srcfile2]} {
return
}
file delete $srcfile2
# Start with a fresh GDB, but enable color support.
with_ansi_styling_terminal {
clean_restart $testfile2
}
if {![runto_main]} {
return
}
gdb_test_no_output -nopass "source $pyfile"
foreach_with_prefix cmd { py-list py-list-unstyled } {
gdb_test "$cmd 5,10" \
"^Source file [string_to_regexp $srcfile2] not found\\."
}