# Copyright 2012-2013 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]

set normal_bp "_dl_debug_state"
set probes_bp "dl_main"

if { [gdb_compile_shlib $srcfile_lib $binfile_lib \
	  [list additional_flags=-fPIC]] != "" } {
    untested "Could not compile $binfile_lib."
    return -1
}

if { [prepare_for_testing $testfile.exp $testfile $srcfile \
	  [list additional_flags=-DSHLIB_NAME=\"$binfile_lib\" libs=-ldl]] } {
    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 } {
    # 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 $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 foo(23)" "\\\$.* = 31.*\\\M.*"
}
