diff options
Diffstat (limited to 'gdb/testsuite/gdb.base')
| -rw-r--r-- | gdb/testsuite/gdb.base/list-multi-source.c | 60 | ||||
| -rw-r--r-- | gdb/testsuite/gdb.base/list-multi-source.exp | 129 | ||||
| -rw-r--r-- | gdb/testsuite/gdb.base/long_long.exp | 32 |
3 files changed, 196 insertions, 25 deletions
diff --git a/gdb/testsuite/gdb.base/list-multi-source.c b/gdb/testsuite/gdb.base/list-multi-source.c new file mode 100644 index 0000000..ab2b6a0 --- /dev/null +++ b/gdb/testsuite/gdb.base/list-multi-source.c @@ -0,0 +1,60 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2025 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/>. */ + +extern int function_a (void); +extern int function_b (void); + +#ifdef MAIN +int +main (void) +{ + int res; + + res = function_a (); + + res += function_b (); + + return res; +} +#endif + +#if defined FILE_A || defined FILE_B +static int +get_value_common (void) +{ + /* NOTE: When reading this file in the source tree, the variable used in + the return statement below will be replaced by a constant value when + the file is copied into the source tree. */ + return value_to_return; /* List this line. */ +} +#endif + +#ifdef FILE_A +int +function_a (void) +{ + return get_value_common (); +} +#endif + +#ifdef FILE_B +int +function_b (void) +{ + return get_value_common (); +} +#endif diff --git a/gdb/testsuite/gdb.base/list-multi-source.exp b/gdb/testsuite/gdb.base/list-multi-source.exp new file mode 100644 index 0000000..887ff96 --- /dev/null +++ b/gdb/testsuite/gdb.base/list-multi-source.exp @@ -0,0 +1,129 @@ +# Copyright 2025 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 that 'list FILE:LINE' can print multiple results if FILE +# matches multiple files from the source tree. +# +# Then test that we can use 'list DIR/FILE:LINE' to restrict the +# results to a single source file. + +# With a remote host, source files are automatically copied to the +# host by dejagnu, and this drops the directory structure that is +# needed for this test to work, i.e. we need a/foo.c and b/foo.c, but +# dejagnu's automatic copying just gives us a single foo.c. Instead +# of trying to fix this, for now at least, just skip remote host +# testing. +require {!is_remote host} + +# This test uses a single source file that is copied into the build +# tree 3 times. The three copies are then copied with different +# defines set so that we see different functions in each copy. +standard_testfile .c + +# Create the source tree within the build directory. +set src_root [standard_output_file "src"] +set src_a "$src_root/a" +set src_b "$src_root/b" +set file_a "$src_a/foo.c" +set file_b "$src_b/foo.c" +set file_main "$src_root/main.c" +file mkdir "$src_root" +file mkdir "$src_a" +file mkdir "$src_b" + +# Helper proc. Copy global SRCFILE to DEST, replacing +# 'value_to_return' with VALUE during the copy. +proc copy_and_update_source_file { dest value } { + # Open the source file for reading. + set in [open "$::srcdir/$::subdir/$::srcfile" r] + + # Read in the entire contents of the file. This should be fine as + # the input file is not large. + set file_content [read $in] + + # Close the input file. + close $in + + # Perform the replacement over the entire file contents. + set updated_content [string map \ + [list "value_to_return" $value] \ + $file_content] + + # Open the destination file for writing. + set out [open $dest w] + + # Write the modified content to the destination file. + puts -nonewline $out $updated_content + + # Close the output file. + close $out +} + +# Make three copies of the single source file in the build directory +# based source tree. Two of the source files are modified slighly to +# make the output of 'list' unique for each copy. +file copy "$srcdir/$subdir/$srcfile" "$file_main" +copy_and_update_source_file $file_a "3" +copy_and_update_source_file $file_b "-3" + +# Build the executable. Use defines to make the source files +# different. +if { [prepare_for_testing_full "failed to prepare" \ + [list $testfile debug \ + $file_main [list debug additional_flags=-DMAIN] \ + $file_a [list debug additional_flags=-DFILE_A] \ + $file_b [list debug additional_flags=-DFILE_B]]]} { + return +} + +# The LINENUM we should list, and the first and last lines that should +# appear in the list output. +set linenum [gdb_get_line_number "List this line"] +set first_linenum [expr {$linenum - 5}] +set last_linenum [expr {$linenum + 4}] + +# List using FILE:LINE for a filename that is ambiguous. +gdb_test "list foo.c:$linenum" \ + [multi_line \ + "file: \"\[^\r\n\]+/a/foo.c\", line number: $linenum, symbol: \"get_value_common\"" \ + "$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return 3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+" \ + "file: \"\[^\r\n\]+/b/foo.c\", line number: $linenum, symbol: \"get_value_common\"" \ + "$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return -3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] + +# Now list using a more acurate filename, we should only get a single +# result. +gdb_test "list a/foo.c:$linenum" \ + [multi_line \ + "^$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return 3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] + +gdb_test "list b/foo.c:$linenum" \ + [multi_line \ + "^$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return -3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] diff --git a/gdb/testsuite/gdb.base/long_long.exp b/gdb/testsuite/gdb.base/long_long.exp index a28e07a..38d1934 100644 --- a/gdb/testsuite/gdb.base/long_long.exp +++ b/gdb/testsuite/gdb.base/long_long.exp @@ -133,25 +133,11 @@ gdb_test_ptr "p/a val.oct" "" "" "0x77053977" "0xa72ee53977053977" gdb_test "p/c val.oct" "'w'" if { $sizeof_double == 8 || $sizeof_long_double == 8 } { - # ARM FPA floating point numbers are not strictly little endian or big - # endian, but a hybrid. They are in little endian format with the two - # words swapped in big endian format. - # EABI targets default to natural-endian VFP format. - - if { ([istarget "arm*-*-*"]) \ - && !([istarget "*-*-*eabi*"] || \ - [istarget "*-*-mingw32ce*"] || \ - [istarget "*-*-openbsd*"]) } then { - # assume the long long represents a floating point double in ARM format - gdb_test "p/f val.oct" "2.1386676354387559e\\+265" - } else { - # assume the long long represents a floating point double in little - # endian format - gdb_test "p/f val.oct" "-5.9822653797615723e-120" - } + set re_val_oct_f [string_to_regexp "-5.9822653797615723e-120"] } else { - gdb_test "p/f val.oct" "-2.42716126e-15" + set re_val_oct_f [string_to_regexp "-2.42716126e-15"] } +gdb_test "p/f val.oct" $re_val_oct_f gdb_test_char "p/x *(char *)c" "0x1" gdb_test_char "p/d *(char *)c" "1" @@ -208,11 +194,7 @@ gdb_test "x/o w" "0110642547" gdb_test "x/t w" "00000001001000110100010101100111" gdb_test_xptr "x/a" { b "" } { h "" } { w "0x1234567" } { g "0x123456789abcdef" } gdb_test "x/c b" "1 '.001'" -if { $sizeof_double == 8 || $sizeof_long_double == 8 } { - gdb_test "x/f &val.oct" "-5.9822653797615723e-120" -} else { - gdb_test "x/f &val.oct" "-2.42716126e-15" -} +gdb_test "x/f &val.oct" $re_val_oct_f # Implicit Giant size (except for a, c, and f) @@ -225,9 +207,9 @@ gdb_test "x/2t g" "0000000100100011010001010110011110001001101010111100110111101 gdb_test_xptr "x/2a" { b "" } { h "" } { w "0x1234567.*0xa72ee539" } { g "0x123456789abcdef.*0xa72ee53977053977" } gdb_test "x/2c b" "1 '.001'.*-89 '.\[0-9\]*'" if { $sizeof_double == 8 || $sizeof_long_double == 8 } { - gdb_test "x/2f &val.oct" "-5.9822653797615723e-120.*-5.9041889495880968e-100" + gdb_test "x/2f &val.oct" "$re_val_oct_f.*-5.9041889495880968e-100" } else { - gdb_test "x/2f &val.oct" "-2.42716126e-15" + gdb_test "x/2f &val.oct" "$re_val_oct_f" } # Explicit sizes, and two memory locations ... @@ -266,7 +248,7 @@ gdb_test "x/2go g" "04432126361152746757.*01234567123456701234567" gdb_test "x/2gt g" "0000000100100011010001010110011110001001101010111100110111101111.*1010011100101110111001010011100101110111000001010011100101110111" gdb_test_ptr "x/2ga g" "" "" "0x89abcdef.*0x77053977" "0x123456789abcdef.*0xa72ee53977053977" gdb_test "x/2gc g" "-17 '.\[0-9\]*'.*119 'w'" -gdb_test "x/2gf g" "3.5127005640885037e-303.*-5.9822653797615723e-120" +gdb_test "x/2gf g" "3.5127005640885037e-303.*$re_val_oct_f" # Repeat behavior. gdb_test "x/2bx b" "0x01.*0xa7" "set up for repeat" |
