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

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
}

# 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 {
      fail "can't run to main"
      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 {int foo\(void\);[\r\n]*}
    }
    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\]*"
    }

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