| # Copyright 2014-2021 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/>. |
| |
| standard_testfile |
| |
| # Take a list of directories DIRS, and return a regular expression |
| # that will match against the output of the 'directory' command |
| # assuming that DIRS are all of the directories that should appear in |
| # the results. |
| proc search_dir_list { dirs } { |
| set output "\r\nSource directories searched: " |
| append output [join $dirs "\[:;\]"] |
| |
| return ${output} |
| } |
| |
| # Check that adding directories to the search path changes the order |
| # in which directories are searched. |
| proc test_changing_search_directory {} { |
| gdb_start |
| |
| set foo "/nOtExStInG" |
| |
| gdb_test "directory $foo/a $foo/b $foo/c" \ |
| [search_dir_list [list \ |
| "$foo/a" \ |
| "$foo/b" \ |
| "$foo/c" \ |
| "\\\$cdir" \ |
| "\\\$cwd"]] |
| gdb_test "directory $foo/b $foo/d $foo/c" \ |
| [search_dir_list [list \ |
| "$foo/b" \ |
| "$foo/d" \ |
| "$foo/c" \ |
| "$foo/a" \ |
| "\\\$cdir" \ |
| "\\\$cwd"]] |
| gdb_exit |
| } |
| |
| # Test that the compilation directory can also be extended with a |
| # prefix from the directory search path in order to find source files. |
| proc test_truncated_comp_dir {} { |
| global srcfile srcdir subdir binfile |
| global decimal |
| |
| # When we run this test the current directory will be something |
| # like this: |
| # /some/path/to/gdb/build/testsuite/ |
| # We are going to copy the source file out of the source tree into |
| # a location like this: |
| # /some/path/to/gdb/build/testsuite/output/gdb.base/soure-dir/ |
| # |
| # We will then switch to this directory and compile the source |
| # file, however, we will ask GCC to remove this prefix from the |
| # compilation directory in the debug info: |
| # /some/path/to/gdb/build/testsuite/output/ |
| # |
| # As a result the debug information will look like this: |
| # |
| # DW_AT_name : source-dir.c |
| # DW_AT_comp_dir : /gdb.base/source-dir |
| # |
| # Finally we switch back to this directory: |
| # /some/path/to/gdb/build/testsuite/ |
| # |
| # and start GDB. There was a time when GDB would be unable to |
| # find the source file no matter what we added to the directory |
| # search path, this should now be fixed. |
| |
| # All of these pathname and directory manipulations assume |
| # host == build, so do not attempt this set of tests on remote host. |
| if [is_remote host] { |
| return |
| } |
| |
| set original_dir [pwd] |
| set working_dir [standard_output_file ""] |
| cd ${working_dir} |
| |
| set strip_dir [file normalize "${working_dir}/../.."] |
| |
| set new_srcfile [standard_output_file ${srcfile}] |
| set fd [open "$new_srcfile" w] |
| puts $fd "int |
| main () |
| { |
| return 0; |
| }" |
| close $fd |
| |
| set options \ |
| "debug additional_flags=-fdebug-prefix-map=${strip_dir}=" |
| if { [gdb_compile "${srcfile}" "${binfile}" \ |
| executable ${options}] != "" } { |
| untested "failed to compile" |
| return -1 |
| } |
| |
| cd ${original_dir} |
| |
| clean_restart ${binfile} |
| |
| if { [ishost *-*-mingw*] } { |
| gdb_test_no_output "set directories \$cdir;\$cwd" |
| } else { |
| gdb_test_no_output "set directories \$cdir:\$cwd" |
| } |
| gdb_test "show directories" \ |
| "\r\nSource directories searched: \\\$cdir\[:;\]\\\$cwd" |
| |
| if ![runto_main] then { |
| return 0 |
| } |
| |
| gdb_test "info source" \ |
| [multi_line \ |
| "Current source file is ${srcfile}" \ |
| "Compilation directory is \[^\n\r\]+" \ |
| "Source language is c." \ |
| "Producer is \[^\n\r\]+" \ |
| "Compiled with DWARF $decimal debugging format." \ |
| "Does not include preprocessor macro info." ] \ |
| "info source before setting directory search list" |
| |
| gdb_test "dir $strip_dir" \ |
| [search_dir_list [list \ |
| "$strip_dir" \ |
| "\\\$cdir" \ |
| "\\\$cwd"]] \ |
| "setup source path search directory" |
| gdb_test "list" [multi_line \ |
| "1\[ \t\]+int" \ |
| "2\[ \t\]+main \\(\\)" \ |
| "3\[ \t\]+\\{" \ |
| "4\[ \t\]+return 0;" \ |
| "5\[ \t\]+\\}" ] |
| |
| gdb_test "info source" \ |
| [multi_line \ |
| "Current source file is ${srcfile}" \ |
| "Compilation directory is \[^\n\r\]+" \ |
| "Located in ${new_srcfile}" \ |
| "Contains 5 lines." \ |
| "Source language is c." \ |
| "Producer is \[^\n\r\]+" \ |
| "\[^\n\r\]+" \ |
| "\[^\n\r\]+" ] \ |
| "info source after setting directory search list" |
| } |
| |
| proc test_change_search_directory_with_empty_dirname {} { |
| gdb_start |
| |
| # Add 3 entries to the source directories list: |
| # - "" |
| # - "/foo" |
| # - "/bar" |
| # Since /foo and /bar probably do not exist, ignore the warnings printed by |
| # GDB. |
| if { [ishost *-*-mingw*] } { |
| gdb_test "set directories ;/foo;/bar" ".*" |
| } else { |
| gdb_test "set directories :/foo:/bar" ".*" |
| } |
| |
| # The first entry added ("") should be ignored, only /foo and /bar are |
| # effectively added. |
| with_test_prefix "initial_directory_state" { |
| gdb_test "show directories" \ |
| [search_dir_list [list \ |
| "/foo" \ |
| "/bar" \ |
| "\\\$cdir" \ |
| "\\\$cwd"]] |
| } |
| |
| # Arguments can be quoted. Check a empty string has the same effect as |
| # 'set directory' (i.e. reset to $cdir:$cwd) |
| gdb_test_no_output "set directories \"\"" |
| |
| with_test_prefix "directory_after_reset" { |
| gdb_test "show directories" \ |
| [search_dir_list [list \ |
| "\\\$cdir" \ |
| "\\\$cwd"]] |
| } |
| |
| gdb_exit |
| } |
| |
| test_changing_search_directory |
| test_change_search_directory_with_empty_dirname |
| test_truncated_comp_dir |