# Copyright 2020-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 that when setting a breakpoint at "foo", GDB creates a location
# for an unresolved <foo@plt> PLT in the main binary, even when a
# static function named "foo" exists in the shared library.  Tests
# both with and without debug info.

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile msym-bp-shl-main.c msym-bp-shl-main-2.c msym-bp-shl-lib.c
set srcfile ${srcdir}/${subdir}/${srcfile}
set srcfile2 ${srcdir}/${subdir}/${srcfile2}
set libsrc ${srcdir}/${subdir}/${srcfile3}

# Run "info breakpoints", and check that we find the two locations,
# LOC_A and LOC_B, in either order.
proc test_info_break_2 {loc_a loc_b} {
    set re1 ".*\.1.*${loc_a}\r\n.*\.2.*${loc_b}"
    set re2 ".*\.1.*${loc_b}\r\n.*\.2.*${loc_a}"
    gdb_test "info breakpoint" "$re1|$re2"
}

proc test {debug} {
    global testfile binfile srcfile srcfile2 libsrc
    global decimal

    if {$debug} {
	set options "debug"
    } else {
	set options ""
    }

    set bin ${binfile}-$debug
    set lib [standard_output_file msym-bp-shl-lib-$debug.sl]

    set exec_opts [list $options shlib=${lib}]

    if { [gdb_compile_shlib $libsrc $lib $options] != ""
	 || [gdb_compile [list $srcfile $srcfile2] $bin \
		 executable $exec_opts] != ""} {
	untested "failed to compile"
	return
    }

    clean_restart $bin
    gdb_load_shlib $lib

    # Should find two locations: the static foo in the
    # msym-bp-shl-main-2 file, and <foo@plt>, both in the main binary.
    with_test_prefix "before run" {
	gdb_test "break foo" "\\(2 locations\\)"

	if {$debug} {
	    test_info_break_2 \
		"<foo@plt.*>" \
		"in foo at .*msym-bp-shl-main-2.c:$decimal"
	} else {
	    test_info_break_2 \
		"<foo@plt.*>" \
		"<foo(\\+$decimal)?>"
	}
    }

    if ![runto_main] {
	return
    }

    delete_breakpoints

    # Should still find two locations, but the <foo@plt> PLT location
    # should not be present anymore.  I.e., we should find the static
    # foo in the msym-bp-shl-main-2 file, and the extern foo in the
    # shared library.
    with_test_prefix "at main" {
	gdb_test "break foo" "\\(2 locations\\)"

	if {$debug} {
	    test_info_break_2 \
		"in foo at .*msym-bp-shl-main-2.c:$decimal" \
		"in foo at .*msym-bp-shl-lib.c:$decimal"
	} else {
	    test_info_break_2 \
		"<foo(\\+$decimal)?>" \
		"<foo(\\+$decimal)?>"
	}
    }
}

foreach_with_prefix debug {0 1} {
    test $debug
}
