#   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" ""
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" ""
gdb_test "bt" "#0\\s+square.*"
