# Copyright 2013-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/>.  */

# 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.

if {![is_elf_target]} {
    return 0
}

if [skip_shlib_tests] {
    return 0
}

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 [get_compiler_info] {
    return -1
}

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}

if ![runto_main] then {
    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} then {
   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} then {
   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} then {
    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} then {
    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 -a addr" \
		     ""\
		     "remove-symbol-file -a addr" \
		     "Remove symbol table from file \".*${lib_basename}\\.so\"\\?\
.*\\(y or n\\) " \
		     "y"]
if {$result != 0} then {
    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 -a addr" \
	"" \
	"remove-symbol-file -a addr" \
	"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.*"
}
