# Copyright 2013-2022 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 . load_lib dwarf.exp # This test can only be run on targets which support DWARF-2 and use gas. if {![dwarf2_support]} { return 0 } # This test can only be run on x86_64 targets. if {![istarget "x86_64-*-*"] || ![is_lp64_target]} { return 0 } standard_testfile .S if { [prepare_for_testing "failed to prepare" $testfile $srcfile {nodebug nopie}] } { return -1 } if ![runto stop_frame] { perror "Failed to stop in stop_frame" return -1 } gdb_test "bt" "#0 (0x\[0-9a-f\]+ in )?stop_frame \[^\r\n\]*\r\n#1 \[^\r\n\]*first_frame \[^\r\n\]*\r\n#2 \[^\r\n\]*main\[^\r\n\]*" \ "backtrace from stop_frame" for {set f 0} {$f < 3} {incr f} { if {${f} == 0} { set pattern_rax_rbx_rcx_print "$hex" set pattern_rax_rbx_rcx_info "$hex\\s+$decimal" set pattern_r8_r9_print "$hex" set pattern_r8_r9_info "$hex\\s+$decimal" } else { set pattern_rax_rbx_rcx_print "" set pattern_rax_rbx_rcx_info "" set pattern_r8_r9_print "$hex" set pattern_r8_r9_info "$hex\\s+$decimal" } # Select frame. gdb_test "frame ${f}" "#${f}.*" "switch to frame ${f}" gdb_test "p/x \$rax" ".*$pattern_rax_rbx_rcx_print.*" \ "print \$rax in frame ${f}" gdb_test "p/x \$rbx" "$pattern_rax_rbx_rcx_print" \ "print \$rbx in frame ${f}" gdb_test "p/x \$rcx" "$pattern_rax_rbx_rcx_print" \ "print \$rcx in frame ${f}" gdb_test "p/x \$r8" "$pattern_r8_r9_print" "print \$r8 in frame ${f}" gdb_test "p/x \$r9" "$pattern_r8_r9_print" "print \$r9 in frame ${f}" # Display register values. gdb_test "info registers rax rbx rcx r8 r9" \ [multi_line "rax\\s+${pattern_rax_rbx_rcx_info}\\s*" \ "rbx\\s+${pattern_rax_rbx_rcx_info}\\s*" \ "rcx\\s+${pattern_rax_rbx_rcx_info}\\s*" \ "r8\\s+${pattern_r8_r9_info}\\s*" \ "r9\\s+${pattern_r8_r9_info}\\s*"] \ "Check values of rax, rbx, rcx, r8, r9 in frame ${f}" } # Test that the debug log statement in frame_unwind_register_value produces # "not saved" and not "optimized out". gdb_test "set debug frame 1" gdb_test {print $rax} [multi_line \ { \[frame\] frame_unwind_register_value: frame=0, regnum=0\(rax\)} \ { \[frame\] frame_unwind_register_value: -> } \ {.*}] gdb_test "set debug frame 0" # Test that history values show "not saved" and not "optimized out". gdb_test "print" " = " # Test that convenience variables _don't_ show "not saved". gdb_test {print $foo = $rax} " = "