# 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 ${objdir}/${subdir}/${libname}.so
set lib_flags {}
# Binary file.
set testfile "info-fun"
set srcfile ${srcdir}/${subdir}/${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}
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 ${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"
}}
