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

if {[skip_shlib_tests]} {
    return 0
}

if {[is_remote target]} {
    # gdbserver prints the warning message but expect is parsing only the GDB
    # output, not the gdbserver output.
    return 0
}

set testfile "solib-corrupted"
set srcfile start.c

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
    return -1
}

if ![runto_main] {
    return
}

# With probes interface GDB no longer scans the inferior library list so its
# corruption cannot be tested.  There is no way to disable the probes
# interface.

set probes { init_start init_complete map_start reloc_complete unmap_start
	     unmap_complete }
set test "info probes"
gdb_test_multiple $test $test {
    -re "^stap\[ \t\]+rtld\[ \t\]+(?:rtld_)?(\[a-z_\]+)\[ \t\]" {
	set idx [lsearch -exact $probes $expect_out(1,string)]
	if { $idx >= 0 } {
	    set probes [lreplace $probes $idx $idx]
	}
	exp_continue
    }
    -re "^\[^\r\n\]*\r\n" {
	exp_continue
    }
    -re "^$gdb_prompt $" {
    }
}
if { [llength $probes] == 0 } {
    xfail $test
    untested "GDB is using probes"
    return
}

gdb_test "info sharedlibrary" "From * To .*" "normal list"

set no_glibc_debuginfo_re1 "No symbol \"_r_debug\" in current context\\."
set no_glibc_debuginfo_re2 \
    [concat \
	 "Attempt to extract a component of a value that is not a structure" \
	 " pointer\\."]
set no_glibc_debuginfo_re3 \
    "'_r_debug' has unknown type; cast it to its declared type"
set no_glibc_debuginfo_re \
    "($no_glibc_debuginfo_re1|$no_glibc_debuginfo_re2|$no_glibc_debuginfo_re3)"

# GDB checks there for matching L_PREV.
set test "make solibs looping"
gdb_test_multiple "p/x _r_debug->r_map->l_next = _r_debug->r_map" $test {
    -re "$no_glibc_debuginfo_re\r\n$gdb_prompt $" {
	# glibc debug info is not available and it is too difficult to find and
	# parse it from this testcase without the gdb supporting functions.
	xfail $test
	untested "no _r_debug symbol has been found"
	return
    }
    -re " = 0x\[0-9a-f\]+\r\n$gdb_prompt $" {
	pass $test
    }
}
gdb_test "info sharedlibrary" "warning: Corrupted shared library list: .*" "corrupted list"
