# 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 "x86_64-*-*"] && ![istarget "i?86-*-*"]) || ![is_ilp32_target] } 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"
	}
    }
}
