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

if { [skip_shlib_tests] } {
    return 0
}

standard_testfile

set libname $testfile-solib
set srcfile_lib $srcdir/$subdir/$libname.c
set binfile_lib [standard_output_file $libname.so]

if { [istarget "*bsd*"] } {
  set normal_bp "r_debug_state"
} else {
  set normal_bp "_dl_debug_state"
}
set probes_bp "dl_main"

if { [gdb_compile_shlib $srcfile_lib $binfile_lib \
	  [list additional_flags=-fPIC]] != "" } {
    untested "failed to compile shared library"
    return -1
}

if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
	  [list debug shlib_load additional_flags=-DSHLIB_NAME=\"$binfile_lib\"]] } {
    return -1
}

# Enable stop-on-solib-events
gdb_test_no_output "set stop-on-solib-events 1"

# Start the inferior and run to the first stop
gdb_run_cmd
gdb_test "" ".*Stopped due to shared library event.*"

# XFAIL if we are not using probes
set test "ensure using probes"
set using_probes 0
gdb_test_multiple "bt" $test {
    -re "#0 +\[^\r\n\]*\\m(__GI_)?$normal_bp\\M.*$gdb_prompt $" {
	untested "probes not present on this system"
    }
    -re "#0 +\[^\r\n\]*\\m(__GI_)?$probes_bp\\M.*$gdb_prompt $" {
	pass $test
	set using_probes 1
    }
}

if { $using_probes } {
    set sysroot ""
    set test "show sysroot"
    gdb_test_multiple $test $test {
	-re "The current system root is \"(.*)\"\..*${gdb_prompt} $" {
	    set sysroot $expect_out(1,string)
	}
    }

    # GDB strips "target:" from the start of filenames
    # when operating on the local filesystem
    regsub "^target:" "$sysroot" "(target:)?" sysroot

    # Run til it loads our library
    set test "run til our library loads"
    set not_loaded_library 1
    while { $not_loaded_library } {
	set not_loaded_library 0
	gdb_test_multiple "c" $test {
	    -re "Inferior loaded $sysroot$binfile_lib\\M.*$gdb_prompt $" {
		pass $test
	    }
	    -re "Stopped due to shared library event\\M.*$gdb_prompt $" {
		set not_loaded_library 1
	    }
	}
    }

    # Call something to ensure that relocation occurred
    gdb_test "call (int) foo(23)" "\\\$.* = 31.*\\\M.*"
}
