# Copyright (C) 2010-2020 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 . # This file is part of the GDB testsuite. # It tests the program space support in Guile. load_lib gdb-guile.exp standard_testfile if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} { return -1 } # Start with a fresh gdb. gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # Skip all tests if Guile scripting is not enabled. if { [skip_guile_tests] } { continue } gdb_install_guile_utils gdb_install_guile_module proc print_current_progspace { filename_regexp smob_filename_regexp } { gdb_test "gu (print (progspace-filename (current-progspace)))" \ "= $filename_regexp" "current progspace filename" gdb_test "gu (print (progspaces))" \ "= \\(#\\)" } gdb_test "gu (print (progspace? 42))" "= #f" gdb_test "gu (print (progspace? (current-progspace)))" "= #t" with_test_prefix "at start" { print_current_progspace "#f" "{no symfile}" } gdb_load ${binfile} with_test_prefix "program loaded" { print_current_progspace ".*$testfile" ".*$testfile" gdb_test_no_output "gu (define progspace (current-progspace))" gdb_test "gu (print (progspace-valid? progspace))" "= #t" gdb_test "gu (print (progspace-filename progspace))" "= .*$testfile" gdb_test "gu (print (list? (progspace-objfiles progspace)))" "= #t" } # Verify we keep the same progspace when the program is unloaded. gdb_unload with_test_prefix "program unloaded" { print_current_progspace "#f" "{no symfile}" gdb_test "gu (print (eq? progspace (current-progspace)))" "= #t" } # Verify the progspace is garbage collected ok. # Note that when a program is unloaded, the associated progspace doesn't get # deleted. We need to, for example, delete an inferior to get the progspace # to go away. gdb_test "add-inferior" "Added inferior 2.*" "create new inferior" gdb_test "inferior 2" ".*" "switch to new inferior" gdb_test_no_output "remove-inferiors 1" "remove first inferior" with_test_prefix "inferior removed" { gdb_test "gu (print (progspace-valid? progspace))" "= #f" gdb_test "gu (print (progspace-filename progspace))" \ "ERROR:.*Invalid object.*" gdb_test "gu (print (progspace-objfiles progspace))" \ "ERROR:.*Invalid object.*" print_current_progspace "#f" "{no symfile}" } # garbage-collects can trigger segvs if we've messed up somewhere. gdb_test_no_output "gu (gc)" gdb_test "gu (print progspace)" "= #"