# Copyright 2013-2024 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"  $binfile "$srcfile $srcfile2" $exec_opts]} {
    return
}

gdb_load_shlib ${lib_so}

proc do_test { remove_expr } {
    global lib_basename lib_syms srcfile srcfile3

    clean_restart $::binfile

    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
    }
}
