# Copyright 2021-2023 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 . # Test 'info sources' when the test file makes use of a shared # library. require allow_shlib_tests set is_remote_target [is_remote target] standard_testfile -test.c -lib.c set solib_name [standard_output_file ${testfile}-lib.so] if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile2} ${solib_name} \ {debug}] != "" } { untested "failed to compile shared library" return -1 } if {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable \ [list debug shlib=${solib_name} ]] != ""} { untested "failed to compile executable" return -1 } clean_restart ${binfile} set solib_name [gdb_load_shlib $solib_name] if ![runto foo] { untested "failed to run to function foo" return -1 } # Invoke 'info sources EXTRA_ARGS' and extract the results. # The results are then compared to the list ARGS. # # The list ARGS should consist of pairs of values, the first item being the # path to an object file, and the second item being the name of a source file. # This proc checks that source file was listed as being a source file for the # given object file. # # If the name of the source file starts with the character "!" (exclamation # character, without the quotes) then the check is inverted, that the source # file is NOT listed for the given object file. proc run_info_sources { extra_args args } { global gdb_prompt srcdir subdir global is_remote_target with_test_prefix "args: ${extra_args}" { # The results of running info sources will be placed into this local. array set info_sources {} # The command we are going to run. set cmd "info sources ${extra_args}" set command_regex [string_to_regexp $cmd] # Run the command and extract the results into INFO_SOURCES. set objfile_name "" set source_files {} set files {} gdb_test_multiple $cmd "" { -re "${command_regex}\r\n" { exp_continue } -re "^(\[^\r\n\]+):\r\n" { set objfile_name $expect_out(1,string) if { $is_remote_target } { set objfile_name [file tail $objfile_name] } exp_continue } -re "^\\(Full debug information has not yet been read for this file\\.\\)\r\n" { exp_continue } -re "^\\(Objfile has no debug information\\.\\)\r\n" { exp_continue } -re "^\r\n" { exp_continue } -re "^$gdb_prompt $" { pass $gdb_test_name } -re "^(\[^,\r\n\]+), " { set f $expect_out(1,string) lappend files $f exp_continue } -re "^(\[^\r\n\]+)\r\n" { if { $objfile_name == "" } { fail "${gdb_test_name} (no objfile name)" return } set f $expect_out(1,string) lappend files $f set info_sources($objfile_name) $files set $objfile_name "" set files {} exp_continue } } # Now check ARGS agaisnt the values held in INFO_SOURCES map. foreach {objfile sourcefile} $args { # First, figure out if we're expecting SOURCEFILE to be present, # or not. set present True set match_type "is" if {[string index $sourcefile 0] == "!"} { set present False set match_type "is not" set sourcefile [string range $sourcefile 1 end] } # Figure out the path for SOURCEFILE that we're looking for. set sourcepath [file normalize ${srcdir}/${subdir}/${sourcefile}] if { $is_remote_target } { set objfile [file tail $objfile] } # Make sure we handle the case where there are no source files # associated with a particular objfile. set source_list {} if [info exists info_sources($objfile)] { set source_list $info_sources($objfile) } # Now perform the search, and check the results. set idx [lsearch -exact $source_list $sourcepath] gdb_assert {($present && $idx >= 0) || (!$present && $idx == -1)} \ "source file '$sourcefile' ${match_type} present for '[file tail $objfile]'" } } } # The actual tests. run_info_sources "" \ ${binfile} ${srcfile} \ ${binfile} ${testfile}-header.h \ ${solib_name} ${srcfile2} \ ${solib_name} ${testfile}-header.h run_info_sources "-basename info_sources_2" \ ${binfile} ${srcfile} \ ${binfile} ${testfile}-header.h \ ${solib_name} ${srcfile2} \ ${solib_name} ${testfile}-header.h run_info_sources "-basename \\.c" \ ${binfile} ${srcfile} \ ${binfile} !${testfile}-header.h \ ${solib_name} ${srcfile2} \ ${solib_name} !${testfile}-header.h run_info_sources "-basename -- -test\\.c" \ ${binfile} ${srcfile} \ ${binfile} !${testfile}-header.h \ ${solib_name} !${srcfile2} \ ${solib_name} !${testfile}-header.h run_info_sources "-basename -- -lib\\.c" \ ${binfile} !${srcfile} \ ${binfile} !${testfile}-header.h \ ${solib_name} ${srcfile2} \ ${solib_name} !${testfile}-header.h