# 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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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