# Copyright 2012 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"
}}
