# Copyright 2013-2017 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}\\.\\.\\.done\\." \
		     "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}\\.\\.\\.done\\." \
	"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.*"
}
