# Copyright 2007-2012 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
}

set testfile relativedebug
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile test program"
    return -1
}

# Get things started.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

runto_main

# 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"
