# Copyright 2013-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 <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 {
    fail "can't run to 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} 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.*"
}
