# Copyright 2007, 2008, 2009, 2010 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.

# Unwinding of DW_CFA_GNU_negative_offset_extended test program.

if $tracelevel {
    strace $tracelevel
}

# Test i386 unwinder.


if ![istarget "i?86-*-*"] then {
    verbose "Skipping i386 unwinder tests."
    return
}

set testfile "i386-gnu-cfi"
set srcfilec ${testfile}.c
set srcfileasm ${testfile}-asm.S
set binfile ${objdir}/${subdir}/${testfile}

# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if { [istarget "*-*-cygwin*"] || [istarget "*-*-mingw*"] } then {
  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfilec} ${srcdir}/${subdir}/${srcfileasm}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    untested i386-gnu-cfi.exp
    return -1
}

# Get things started.

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

# We should stop in abort(3).

gdb_run_cmd

gdb_test_multiple {} "continue to abort()" {
    -re ".*Program received signal SIGABRT,.*$gdb_prompt $" {
	pass "continue to abort()"
    }
}

# Backtrace would crash before.

gdb_test "bt" \
         "main \\(\\) at .*${testfile}.c.*" \
         "backtrace"

# Check we see the inserted `DW_CFA_GNU_negative_offset_extended' CFI.
# We see there the original CFI-stored filename `gate.c'.

gdb_test "up 3" \
         "gate \\(\[^()\]*\\) at .*gate.c.*" \
         "shift up to the modified frame"

gdb_test_multiple "info frame" "Existence of the CFI inserted register" {
    -re "Stack level 3, frame at (0x\[0-9a-f\]+):.*Saved registers:.* ecx at (0x\[0-9a-f\]+),.*" {
	pass "Existence of the CFI inserted register"
	if { [string compare $expect_out(1,string) $expect_out(2,string)] } then {
	    fail "Value of the CFI inserted register"
	} else {
	    pass "Value of the CFI inserted register"
	}
    }
}
