1# Copyright 2007-2023 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# Please email any bugs, comments, and/or additions to this file to: 17# bug-gdb@gnu.org 18 19# This file is part of the gdb testsuite. 20 21# Unwinding of DW_CFA_GNU_negative_offset_extended test program. 22 23# Test i386 unwinder. 24 25 26if {![is_x86_like_target]} { 27 verbose "Skipping i386 unwinder tests." 28 return 29} 30 31set testfile "i386-gnu-cfi" 32set srcfilec ${testfile}.c 33set srcfileasm ${testfile}-asm.S 34set binfile [standard_output_file ${testfile}] 35 36# some targets have leading underscores on assembly symbols. 37set additional_flags [gdb_target_symbol_prefix_flags] 38 39if { [gdb_compile "${srcdir}/${subdir}/${srcfilec} ${srcdir}/${subdir}/${srcfileasm}" "${binfile}" executable [list debug $additional_flags]] != "" } { 40 untested "failed to compile" 41 return -1 42} 43 44# Get things started. 45 46gdb_exit 47gdb_start 48gdb_reinitialize_dir $srcdir/$subdir 49gdb_load ${binfile} 50 51# We should stop in abort(3). 52 53gdb_run_cmd 54 55gdb_test_multiple {} "continue to abort()" { 56 -re ".*Program received signal SIGABRT,.*$gdb_prompt $" { 57 pass "continue to abort()" 58 } 59} 60 61# Verify that the backtrace works (it would crash before). Use the backtrace 62# output to find the frame number for function "gate". 63set gate_n "" 64set backtrace_re \ 65 [multi_line \ 66 "" \ 67 "#($decimal) *$hex in gate \[^\r\n\]*" \ 68 "#$decimal *$hex in main \\(\\) at .*${testfile}.c.*"] 69gdb_test_multiple "backtrace" "" { 70 -re -wrap $backtrace_re { 71 set gate_n $expect_out(1,string) 72 pass $gdb_test_name 73 } 74} 75if { $gate_n == "" } { 76 return -1 77} 78 79# Check we see the inserted `DW_CFA_GNU_negative_offset_extended' CFI. 80# We see there the original CFI-stored filename `gate.c'. 81 82gdb_test "frame $gate_n" \ 83 "gate \\(\[^()\]*\\) at .*gate.c.*" \ 84 "shift up to the modified frame" 85 86gdb_test_multiple "info frame" "existence of the CFI inserted register" { 87 -re "Stack level $gate_n, frame at (0x\[0-9a-f\]+):.*Saved registers:.* ecx at (0x\[0-9a-f\]+),.*" { 88 pass "existence of the CFI inserted register" 89 if {[string compare $expect_out(1,string) $expect_out(2,string)]} { 90 fail "value of the CFI inserted register" 91 } else { 92 pass "value of the CFI inserted register" 93 } 94 } 95} 96