# Copyright 2012-2013 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 "Could not compile $binfile_lib or $binfile."
      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"
}}
