# Copyright 2007-2022 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 [target_info exists gdb,nosignals] {
    verbose "Skipping relativedebug.exp because of nosignals."
    return
}

standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

# Get things started.

clean_restart ${binfile}

runto_main

set test "info sharedlibrary"
gdb_test_multiple $test $test {
    -re ".*\(\\*\)\[^\r\n\]*/libc\.so.*$gdb_prompt $" {
	# Skip the test below if libc doesn't have debug info.
	unsupported "libc doesn't have debug info"
	return -1
    }
    -re ".*$gdb_prompt $" {
    }
}

# pause () -> SIGALRM -> handler () -> abort ()
gdb_test "continue" "Program received signal SIGABRT.*"

# Backtracing through pause broke if glibc has been prelinked,
# because the separate debug files in /usr/lib/debug had different
# base addresses.

# incorrect (#6):
# (gdb) bt
# #0  0x00325402 in __kernel_vsyscall ()
# #1  0x00718f20 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
# #2  0x0071a801 in *__GI_abort () at abort.c:88
# #3  0x0804841f in handler (signo=14) at ./gdb.base/relativedebug.c:27
# #4  <signal handler called>
# #5  0x00325402 in __kernel_vsyscall ()
# #6  0x0077ebc6 in ?? () from /lib/i686/nosegneg/libc.so.6
# #7  0x08048455 in main () at ./gdb.base/relativedebug.c:34
# (gdb)

# correct (#6):
# (gdb) bt
# #0  0x00b33402 in __kernel_vsyscall ()
# #1  0x00718f20 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
# #2  0x0071a801 in *__GI_abort () at abort.c:88
# #3  0x0804841f in handler (signo=14) at ./gdb.base/relativedebug.c:27
# #4  <signal handler called>
# #5  0x00b33402 in __kernel_vsyscall ()
# #6  0x0077ebc6 in __pause_nocancel () from /lib/i686/nosegneg/libc.so.6
# #7  0x08048455 in main () at ./gdb.base/relativedebug.c:34
# (gdb)

gdb_test "bt" \
         ".*\[^a-zA-Z\]pause\[^a-zA-Z\].*" \
         "pause found in backtrace"
