# Copyright 2007-2021 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.

# Test i386 unwinder.


if { ![is_x86_like_target] } then {
    verbose "Skipping i386 unwinder tests."
    return
}

set testfile "i386-gnu-cfi"
set srcfilec ${testfile}.c
set srcfileasm ${testfile}-asm.S
set binfile [standard_output_file ${testfile}]

# some targets have leading underscores on assembly symbols.
set additional_flags [gdb_target_symbol_prefix_flags]

if { [gdb_compile "${srcdir}/${subdir}/${srcfilec} ${srcdir}/${subdir}/${srcfileasm}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    untested "failed to compile"
    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()"
    }
}

# Verify that the backtrace works (it would crash before).  Use the backtrace
# output to find the frame number for function "gate".
set gate_n ""
set backtrace_re \
    [multi_line \
	 "" \
	 "#($decimal) *$hex in gate \[^\r\n\]*" \
	 "#$decimal *$hex in main \\(\\) at .*${testfile}.c.*"]
gdb_test_multiple "backtrace" "" {
    -re -wrap $backtrace_re {
	set gate_n $expect_out(1,string)
	pass $gdb_test_name
    }
}
if { $gate_n == "" } {
    return -1
}

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

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

gdb_test_multiple "info frame" "existence of the CFI inserted register" {
    -re "Stack level $gate_n, 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"
	}
    }
}
