| # Copyright 2020-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/>. |
| |
| # This test checks that loading a file with different methods (partial symtabs, |
| # index, readnow) does not crash. |
| |
| standard_testfile |
| |
| if { [build_executable "failed to prepare" $testfile $srcfile \ |
| {debug additional_flags=-Wl,--build-id}] == -1 } { |
| return |
| } |
| |
| set has_index_section [exec_has_index_section $binfile] |
| set uses_readnow [expr [string first "-readnow" $GDBFLAGS] != -1] |
| set expecting_index_cache_use [expr !$has_index_section && !$uses_readnow] |
| |
| lassign [remote_exec host mktemp -d] ret cache_dir |
| |
| # The output of mktemp contains an end of line, remove it. |
| set cache_dir [string trimright $cache_dir \r\n] |
| |
| if { $ret != 0 } { |
| fail "couldn't create temporary cache dir" |
| return |
| } |
| |
| verbose -log "Index cache dir: $cache_dir" |
| |
| # Populate the index-cache. |
| with_test_prefix "populate index cache" { |
| clean_restart |
| |
| gdb_test_no_output "set index-cache directory $cache_dir" \ |
| "set index-cache directory" |
| gdb_test_no_output "set index-cache on" |
| gdb_test "file $binfile" "Reading symbols from .*" "file" |
| } |
| |
| proc load_binary { method } { |
| global binfile |
| global hex |
| |
| if { $method == "standard" } { |
| gdb_test "file $binfile" "Reading symbols from .*" "file" |
| } elseif { $method == "index" } { |
| gdb_test_no_output "set index-cache on" |
| gdb_test "file $binfile" "Reading symbols from .*" "file index" |
| gdb_test_no_output "set index-cache off" |
| } elseif { $method == "readnow" } { |
| gdb_test "file -readnow $binfile" \ |
| "Reading symbols from .*Expanding full symbols from .*" \ |
| "file readnow" |
| } else { |
| error "unknown method" |
| } |
| |
| # Print a static function: seeing it and its signature confirms GDB |
| # sees some symbols. |
| gdb_test "print foo" " = {int \\(int, int\\)} $hex <foo>" |
| } |
| |
| set methods {standard index readnow} |
| |
| foreach_with_prefix first $methods { |
| foreach_with_prefix second $methods { |
| foreach_with_prefix third $methods { |
| # Start with a clean GDB. |
| clean_restart |
| |
| # Set the index cache dir, but don't enable the index-cache, it will |
| # be enabled only when needed, when loading a file with the "index" |
| # method. |
| gdb_test_no_output "set index-cache directory $cache_dir" \ |
| "set index-cache directory" |
| |
| # Avoid GDB asking whether we really want to load a new binary. |
| gdb_test_no_output "set confirm off" |
| |
| with_test_prefix "load first" { load_binary $first } |
| with_test_prefix "load second" { load_binary $second } |
| with_test_prefix "load third" { load_binary $third } |
| } |
| } |
| } |
| |
| lassign [remote_exec host sh "-c \"rm $cache_dir/*.gdb-index\""] ret |
| if { $ret != 0 && $expecting_index_cache_use } { |
| fail "couldn't remove files in temporary cache dir" |
| return |
| } |
| |
| lassign [remote_exec host rmdir "$cache_dir"] ret |
| if { $ret != 0 } { |
| fail "couldn't remove temporary cache dir" |
| return |
| } |