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

if { [skip_shlib_tests] || [is_remote target] } {
    return 0
}

# Library file.
set libname "info-fun-solib"
set srcfile_lib ${srcdir}/${subdir}/${libname}.c
set binfile_lib [standard_output_file ${libname}.so]
set lib_flags {}
# Binary file.
standard_testfile .c
set executable ${testfile}
set bin_flags [list debug shlib=${binfile_lib}]

if [get_compiler_info] {
    return -1
}

foreach_with_prefix n_flag { 0 1 } {

    # SEP must be last for the possible `unsupported' error path.
    foreach libsepdebug {NO IN SEP} { with_test_prefix "$libsepdebug" {

	set sep_lib_flags $lib_flags
	if {$libsepdebug != "NO"} {
	    lappend sep_lib_flags {debug}
	}
	if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $sep_lib_flags] != ""
	     || [gdb_compile $srcdir/$subdir/${srcfile} ${binfile} \
		     executable $bin_flags] != "" } {
	    untested "failed to compile"
	    return -1
	}

	if {$libsepdebug == "SEP"} {
	    if {[gdb_gnu_strip_debug $binfile_lib] != 0} {
		unsupported "could not split debug of $binfile_lib."
		return
	    } else {
		pass "split solib"
	    }
	}

	clean_restart $executable

	if ![runto_main] then {
	    return 0
	}

	set match_str {All functions matching regular expression "foo":[\r\n]*}
	if { "$libsepdebug" != "NO"  } {
	    append match_str {File .*/info-fun-solib[.]c:[\r\n]*}
	    append match_str {\d+:\tint foo\(void\);[\r\n]*}
	}

	set opt ""
	if { !$n_flag } {
	    append match_str {Non-debugging symbols:[\r\n]*}
	    # Note: Targets like {m68k,ppc64,s390x}-linux also have, e.g.,
	    # 00000011.plt_call.foo+0 (m68k).
	    set plt_foo_match "($hex \[^\r\n\]*plt\[^\r\n\]*foo\[^\r\n\]*\[\r\n\]*)?"
	    append match_str $plt_foo_match
	    # This text we want to match precisely.
	    append match_str "$hex *foo(@plt)?\[\r\n\]*"
	    # Watch for again to not have to worry about the order of appearance.
	    append match_str $plt_foo_match
	    if { "$libsepdebug" == "NO"  } {
		# Note: The ".?" is for targets like m68k-linux that have ".foo" here.
		append match_str "$hex *.?foo\[\r\n\]*"
	    }
	} else {
	    set opt "-n"
	}

	gdb_test "info fun $opt foo" "$match_str"
    }}
}
