#   Copyright 2011-2020 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 [standard_output_file ${executable_main}]
set srcfile_lib "${test}-lib.c"
set libname "lib${test}"
set binfile_lib [standard_output_file ${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
}

set testobjdir [standard_output_file {}]
if {[gdb_compile "${binfile_main}.o" "${binfile_main}" executable \
                 [list debug "additional_flags=-L$testobjdir -l${test} \
                                               -Wl,-rpath=$testobjdir"]] != ""} {
    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"

#
# Checkinfo skip list.
#
gdb_test "info skip" \
  "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
1\\s+y\\s+n\\s+${srcfile_lib}\\s+n\\s+<none>\\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."

#
# 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\\." \
  "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+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
1\\s+y\\s+n\\s+<none>\\s+n\\s+multiply\\s*" \
  "info skip for function multiply"

#
# 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.*"
