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

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"
