# Copyright 2011-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 {![istarget *-linux*] || [skip_shlib_tests]} {
    return 0
}

load_lib prelink-support.exp

set testfile "dlopen-libpthread"
set srcmainfile ${testfile}.c
set srclibfile ${testfile}-lib.c
set executable ${testfile}
set binfile_lib ${objdir}/${subdir}/${executable}.so
set binfile ${objdir}/${subdir}/${executable}
set lib_dlopen [shlib_target_file ${executable}.so]

# Use build_executable_own_libs as prelinked libpthread.so can produce false
# PASS - it is OK if GDB processes it still before relocation.

set relink_args [build_executable_own_libs ${testfile}.exp ${executable}.so $srclibfile {debug shlib_pthreads} no]
if {$relink_args == "" || ![prelink_no $relink_args]
    || [prepare_for_testing ${testfile}.exp ${executable} ${srcmainfile} {debug shlib_load}] } {
    return -1
}
gdb_load_shlibs $binfile_lib

if { ![runto_main] } {
    return -1
}

set test "info probes all rtld rtld_map_complete"
gdb_test_multiple $test $test {
    -re "\[ \t\]rtld_map_complete\[ \t\]+0x\[0-9a-f\]+.*\r\n$gdb_prompt $" {
	pass $test
    }
    -re "No probes matched\\.\r\n$gdb_prompt $" {
	xfail $test
	untested ${testfile}.exp
	return
    }
}

set test "libpthread.so not found"
gdb_test_multiple "info sharedlibrary" $test {
    -re "/libpthread\\.so.*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "/libc\\.so.*\r\n$gdb_prompt $" {
	pass $test
    }
}

gdb_test "set variable filename=\"$lib_dlopen\""

gdb_breakpoint "notify"

# The error was:
# Cannot find new threads: generic error
gdb_continue_to_breakpoint "notify" ".* notify-here .*"

gdb_test "info sharedlibrary" {/libpthread\.so.*} "libpthread.so found"
