# Copyright 2013-2026 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 adding and removing a symbol file dynamically:
# 1)  Run to gdb_add_symbol_file in $srcfile.
# 2)  Set a pending breakpoint at bar in $srcfile3.
# 3)  Load the library's symbols using 'add-symbol-file'.
# 4)  'info files' must display ${lib_basename}.
# 5)  Continue to bar in $srcfile3.
# 6)  Set a breakpoint at foo in $srcfile3.
# 7)  Continue to foo in $srcfile3.
# 8)  Set a breakpoint at gdb_remove_symbol_file.
# 9)  Continue to gdb_remove_symbol_file in $srcfile.
# 10) Remove the library's symbols using 'remove-symbol-file'.
# 11) 'info files' must not display ${lib_basename}, anymore.
# 12) Check that the breakpoints at foo and bar are pending.
# 13) Check that the execution can continue without error.
# 14) Regression test for a stale breakpoints bug.

require is_elf_target

require allow_shlib_tests

set target_size TARGET_UNKNOWN
if {[is_lp64_target]} {
    set target_size TARGET_LP64
} elseif {[is_ilp32_target]} {
   set target_size TARGET_ILP32
} else {
    return 0
}

set main_basename sym-file-main
set loader_basename sym-file-loader
set lib_basename sym-file-lib

standard_testfile $main_basename.c $loader_basename.c $lib_basename.c

set libsrc "${srcdir}/${subdir}/${srcfile3}"
set lib_so [standard_output_file ${lib_basename}.so]
set lib_syms [shlib_symbol_file ${lib_so}]
set lib_dlopen [shlib_target_file ${lib_basename}.so]

set exec_opts [list debug "additional_flags= -I$srcdir/../../include/ -D$target_size\
 -DSHLIB_NAME\\=\"$lib_dlopen\""]

if {[gdb_compile_shlib $libsrc $lib_so {debug}] != ""} {
    untested "failed to compile shared library"
    return
}

if { [prepare_for_testing "failed to prepare" $testfile "$srcfile $srcfile2" \
	  $exec_opts] } {
    return
}

gdb_load_shlib ${lib_so}

proc do_test { remove_expr } {
    global lib_basename lib_syms srcfile srcfile3

    clean_restart $::testfile

    if {![runto_main]} {
	return
    }

    # 1) Run to gdb_add_symbol_file in $srcfile for adding the library's
    #    symbols.
    gdb_breakpoint gdb_add_symbol_file
    gdb_continue_to_breakpoint gdb_add_symbol_file

    # 2) Set a pending breakpoint at bar in $srcfile3.
    set result [gdb_breakpoint bar allow-pending]
    if {!$result} {
	return
    }

    # 3) Add the library's symbols using 'add-symbol-file'.
    set result [gdb_test "add-symbol-file ${lib_syms} addr" \
		    "Reading symbols from .*${lib_syms}\\.\\.\\." \
		    "add-symbol-file ${lib_basename}.so addr" \
		    "add symbol table from file \".*${lib_basename}\\.so\"\
 at.*\\(y or n\\) " \
		    "y"]
    if {$result != 0} {
	return
    }

    # 4) 'info files' must display $srcfile3.
    gdb_test "info files" \
	"^(?=(.*${lib_basename})).*" \
	"info files must display ${lib_basename}"

    # 5) Continue to bar in $srcfile3 to ensure that the breakpoint
    #    was bound correctly after adding $shilb_name.
    set lnum_bar [gdb_get_line_number "break at bar" $srcfile3]
    gdb_continue_to_breakpoint bar ".*${lib_basename}\\.c:$lnum_bar.*"

    # 6) Set a breakpoint at foo in $srcfile3.
    set result [gdb_breakpoint foo]
    if {!$result} {
	return
    }

    # 7) Continue to foo in $srcfile3 to ensure that the breakpoint
    #    was bound correctly.
    set lnum_foo [gdb_get_line_number "break at foo" $srcfile3]
    gdb_continue_to_breakpoint foo ".*${lib_basename}\\.c:$lnum_foo.*"

    # 8) Set a breakpoint at gdb_remove_symbol_file in $srcfile for
    #    removing the library's symbols.
    set result [gdb_breakpoint gdb_remove_symbol_file]
    if {!$result} {
	return
    }

    # 9) Continue to gdb_remove_symbol_file in $srcfile.
    gdb_continue_to_breakpoint gdb_remove_symbol_file

    # 10) Remove the library's symbols using 'remove-symbol-file'.
    set result [gdb_test "remove-symbol-file ${remove_expr}" \
		    ""\
		    "remove-symbol-file" \
		    "Remove symbol table from file \".*${lib_basename}\\.so\"\\?\
.*\\(y or n\\) " \
		    "y"]
    if {$result != 0} {
	return
    }

    # 11) 'info files' must not display ${lib_basename}, anymore.
    gdb_test "info files" \
	"^(?!(.*${lib_basename})).*" \
	"info files must not display ${lib_basename}"

    # 12) Check that the breakpoints at foo and bar are pending after
    #     removing the library's symbols.
    gdb_test "info breakpoints 3" \
	".*PENDING.*" \
	"breakpoint at foo is pending"

    gdb_test "info breakpoints 4" \
	".*PENDING.*" \
	"breakpoint at bar is pending"

    # 13) Check that the execution can continue without error.
    set lnum_reload [gdb_get_line_number "reload lib here"]
    gdb_breakpoint $lnum_reload
    gdb_continue_to_breakpoint reload ".*${srcfile}:$lnum_reload.*"

    # 14) Regression test for a stale breakpoints bug.  Check whether
    # unloading symbols manually without the program actually unloading
    # the library, when breakpoints are inserted doesn't leave stale
    # breakpoints behind.
    with_test_prefix "stale bkpts" {
	# Force breakpoints always inserted.
	gdb_test_no_output "set breakpoint always-inserted on"

	# Get past the library reload.
	gdb_continue_to_breakpoint gdb_add_symbol_file

	# Load the library's symbols.
	gdb_test "add-symbol-file ${lib_syms} addr" \
	    "Reading symbols from .*${lib_syms}\\.\\.\\." \
	    "add-symbol-file ${lib_basename}.so addr" \
	    "add symbol table from file \".*${lib_syms}\"\
at.*\\(y or n\\) " \
	    "y"

	# Set a breakpoint at baz, in the library.
	gdb_breakpoint baz

	gdb_test "info breakpoints 7" ".*y.*0x.*in baz.*" \
	    "breakpoint at baz is resolved"

	# Unload symbols manually without the program actually unloading
	# the library.
	gdb_test "remove-symbol-file ${remove_expr}" \
	    "" \
	    "remove-symbol-file" \
	    "Remove symbol table from file \".*${lib_basename}\\.so\"\\?\
.*\\(y or n\\) " \
	    "y"

	gdb_test "info breakpoints 7" ".*PENDING.*" \
	    "breakpoint at baz is pending"

	# Check that execution can continue without error.  If GDB leaves
	# breakpoints behind, we'll get back a spurious SIGTRAP.
	set lnum_end [gdb_get_line_number "end here"]
	gdb_breakpoint $lnum_end
	gdb_continue_to_breakpoint "end here" ".*end here.*"
    }
}

foreach remove_expr [list addr bar "bar + 0x10" "${lib_syms}" ] {
    # Don't use full filenames in the test prefix.  Also, add '-a' to
    # all the REMOVE_EXPR values which are addresses rather than
    # filenames.
    set prefix $remove_expr
    if { $prefix == $lib_syms } {
	set prefix [file tail $prefix]
    } else {
	set remove_expr "-a $remove_expr"
    }

    with_test_prefix "remove_expr=$prefix" {
	do_test $remove_expr
    }
}
