#   Copyright 2011-2021 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 -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" \
	      "additional_flags=-l${test}" \
	      "additional_flags=-Wl,-rpath=$testobjdir"]] != ""} {
    return -1
}

#
# Test ignoring of a file inside a solib.
#
with_test_prefix "ignoring solib file" {

    clean_restart ${executable_main}

    gdb_test "skip file ${srcfile_lib}" \
	"File ${srcfile_lib} will be skipped when stepping." \
	"skip file"

    gdb_test "info skip" \
	[multi_line \
	     "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*"]

    if ![runto_main] {
	return
    }

    #
    # We shouldn't step into square(), since we skipped skip-solib-lib.c.
    #
    gdb_test "step" ""
    gdb_test "bt" "#0\\s+main.*"
}

#
# Now test ignoring of a function inside a solib.
#
with_test_prefix "ignoring solib function" {
    clean_restart ${executable_main}

    gdb_test "skip function multiply" \
	"Function multiply will be skipped when stepping\\." \
	"skip function"

    if ![runto_main] {
	return
    }

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

    gdb_test "info skip" \
	[multi_line \
	     "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*" \
	     "1\\s+y\\s+n\\s+<none>\\s+n\\s+multiply\\s*"]

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