# Copyright 2007 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

if [target_info exists gdb,nosignals] {
    verbose "Skipping relativedebug.exp because of nosignals."
    continue
}

if $tracelevel then {
    strace $tracelevel
}

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"
