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

# This file was written by Justin Lebar. (justin.lebar@gmail.com)

#
# Tests skipping shared libraries.
#

# This only works on GNU/Linux.
if { ![isnative] || [is_remote host] || ![istarget *-linux*] || [skip_shlib_tests]} {
    continue
}

set test "skip-solib"
set srcfile_main "${test}-main.c"
set executable_main ${test}-test
set binfile_main ${objdir}/${subdir}/${executable_main}
set srcfile_lib "${test}-lib.c"
set libname "lib${test}"
set binfile_lib ${objdir}/${subdir}/${libname}.so

#
# Compile our program under test.  The main program references a shared library
# libskip-solib.so, which contains two functions, square(), which is
# referenced by the main program, and multiply(), which is not referenced by
# the main program.
#

if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-fPIC -Wl,-soname,${libname}.so]] != ""} {
    return -1
}

if {[gdb_compile "${srcdir}/${subdir}/${srcfile_main}" "${binfile_main}.o" object debug] != ""} {
    return -1
}

if {[gdb_compile "${binfile_main}.o" "${binfile_main}" executable \
                 [list debug "additional_flags=-L${objdir}/${subdir} -l${test} \
                                               -Wl,-rpath=${objdir}/${subdir}"]] != ""} {
    return -1
}

clean_restart ${executable_main}

#
# At this point, if we try to skip the file ${srcfile_lib} or the function
# multiply(), we should get a prompt asking us if we want to enable the
# skip entry pending a shared library load.
#

gdb_test "skip file ${srcfile_lib}" \
  "File ${srcfile_lib} will be skipped when stepping." \
  "ignoring file in solib" \
  "No source file named ${srcfile_lib}.*
Ignore file pending future shared library load.*" \
  "y"

#
# Does info skip list this entry as pending?
#
gdb_test "info skip" \
  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+file\\s+y\\s+\\s+${srcfile_lib} \\(PENDING\\)\\s*" \
  "info skip with pending file"

if ![runto_main] { fail "skip tests suppressed" }

#
# We shouldn't step into square(), since we skipped skip-solib-lib.c.
#
gdb_test "step" ""
if [using_clang] { setup_xfail "clang/14580" *-*-* }
gdb_test "bt" "#0\\s+main.*" "step after ignoring solib file."

#
# Our entry should no longer be pending.  Note that we unfortunately need to do
# at least one step before the entry will be unmarked as pending.
#
gdb_test "info skip" \
  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+file\\s+y\\s+\\s+.*${srcfile_lib}\\s*" \
  "info skip with pending file"

#
# Now restart gdb and testing ignoring of a function inside a solib.
#
clean_restart ${executable_main}

gdb_test "skip function multiply" \
  "Function multiply will be skipped when stepping, pending shared library load." \
  "ignoring function in solib" \
"No function found named multiply..*
Ignore function pending future shared library load.*" \
  "y"

if ![runto_main] { fail "skip tests suppressed" }

#
# Our first step should take us into square.
#
gdb_test "step" "square.*"

#
# Now our entry should no longer be pending.
#
gdb_test "info skip" \
  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+function\\s+y\\s+0x\[0-9a-f\]+\\s+multiply at .*${srcfile_lib}:.*\\s*" \
  "skip should no longer be pending."

#
# This step shouldn't go into multiply -- we should skip it and go on to the
# last line of square.
#
gdb_test "step" ""
if [using_clang] { setup_xfail "clang/14580" *-*-* }
gdb_test "bt" "#0\\s+square.*"
