# Copyright 2003 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.  

# Tests for PR gdb/1250.
# 2003-07-15  Michael Chastain <mec@shout.net>

# This file is part of the gdb testsuite.

if $tracelevel then {
        strace $tracelevel
        }

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "gdb1250"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested gdb1250.exp
     return -1
}

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

if ![runto abort {allow-pending}] then {
    perror "couldn't run to breakpoint"
    continue
}

# See http://sources.redhat.com/gdb/bugs/1250
#
# In a nutshell: the function 'beta' ends with a call to 'abort', which
# is a noreturn function.  So the last instruction of 'beta' is a call
# to 'abort'.  When gdb looks for information about the caller of
# 'beta', it looks at the instruction after the call to 'abort' -- which
# is the first instruction of 'alpha'!  So gdb uses the wrong frame
# information.  It thinks that the test program is in 'alpha' and that
# the prologue "push %ebp / mov %esp,%ebp" has not been executed yet,
# and grabs the wrong values.
#
# By the nature of the bug, it could pass if the C compiler is not smart
# enough to implement 'abort' as a noreturn function.  This is okay.
# The real point is that users often put breakpoints on noreturn
# functions such as 'abort' or some kind of exitting function, and those
# breakpoints should work.

gdb_test_multiple "backtrace" "backtrace from abort" {
    -re "#0.*abort.*\r\n#1.*beta.*\r\n#2.*alpha.*\r\n#3.*main.*\r\n$gdb_prompt $" {
	pass "backtrace from abort"
    }
    -re "#0.*abort.*\r\n#1.*beta.*\r\n$gdb_prompt $" {
	# This happens with gdb HEAD as of 2003-07-13, with gcc 3.3,
	# binutils 2.14, either -gdwarf-2 or -gstabs+, on native
	# i686-pc-linux-gnu.
	#
	# gdb gets 'abort' and 'beta' right and then goes into the
	# weeds.
	kfail "gdb/1250" "backtrace from abort"
    }
}
