diff options
author | Tom de Vries <tdevries@suse.de> | 2023-02-20 12:20:14 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-02-20 12:20:14 +0100 |
commit | 8908d9c45cde37c8a7840db80091b1190f209c8f (patch) | |
tree | ac3835492fd9e3192b9b312745943193da07f667 /gdb | |
parent | 5aca7eaa2be78b5bb9f993b901b32acef51e5c45 (diff) | |
download | binutils-8908d9c45cde37c8a7840db80091b1190f209c8f.zip binutils-8908d9c45cde37c8a7840db80091b1190f209c8f.tar.gz binutils-8908d9c45cde37c8a7840db80091b1190f209c8f.tar.bz2 |
[gdb/symtab] Trust epilogue unwind info for unknown producer (-g0 case)
For a -g0 -fasynchronous-unwind-tables exec (without .debug_info but with
.eh_frame section), start using the dwarf2 unwinder instead of the
"amd64 epilogue override" unwinder, by returning true in
compunit_epilogue_unwind_valid for cust == nullptr.
This has effect both on the amd64 and i386 targets, but only add amd64
test-case gdb.base/unwind-on-each-insn-amd64-2.exp.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/symtab.h | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp | 52 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s | 54 |
3 files changed, 108 insertions, 2 deletions
diff --git a/gdb/symtab.h b/gdb/symtab.h index cd6b5f7..17d2746 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1924,9 +1924,9 @@ static inline bool compunit_epilogue_unwind_valid (struct compunit_symtab *cust) { /* In absence of producer information, assume epilogue unwind info is - invalid. */ + valid. */ if (cust == nullptr) - return false; + return true; return cust->epilogue_unwind_valid (); } diff --git a/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp b/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp new file mode 100644 index 0000000..c8a94cc --- /dev/null +++ b/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp @@ -0,0 +1,52 @@ +# Copyright 2023 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/>. */ + +# Check that epilogue unwind info is used, even if no debug info is available. + +require is_x86_64_m64_target + +set srcfile_flags {debug} +set srcfile2_flags {nodebug} + +if [info exists COMPILE] { + # Make sure that we use .eh_frame info, by generating it + # using -fasynchronous-unwind-tables. + if { [gdb_can_simple_compile fasynchronous-unwind-tables \ + { void foo () { } } object -fasynchronous-unwind-tables] } { + lappend srcfile2_flags additional_flags=-fasynchronous-unwind-tables + } else { + unsupported "required: .eh_frame" + return + } + standard_testfile unwind-on-each-insn.c unwind-on-each-insn-foo.c + # When updating the .s file, use these flags to generate the file: + #lappend srcfile2_flags additional_flags=-save-temps + #lappend srcfile2_flags additional_flags=-dA + # and do the following: + # - copy it in place, run the test-case and verify that all tests pass. + # - confuse the amd64 epilogue unwinder by inserting the following + # in foo: + # nop + # + pushq $.L1 + # + ret + # + .L1: + # + nop + # popq %rbp + # - verify that the test-case passes. +} else { + standard_testfile unwind-on-each-insn.c .s +} + +source $srcdir/$subdir/unwind-on-each-insn.exp.tcl diff --git a/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s b/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s new file mode 100644 index 0000000..c141f71 --- /dev/null +++ b/gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s @@ -0,0 +1,54 @@ + .file "unwind-on-each-insn-foo.c" + .text + .globl foo + .type foo, @function +foo: +.LFB0: + .cfi_startproc +# BLOCK 2 seq:0 +# PRED: ENTRY (FALLTHRU) + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + movq %rdi, -8(%rbp) + nop + pushq $.L1 + ret +.L1: + nop + popq %rbp + .cfi_def_cfa 7, 8 +# SUCC: EXIT [100.0%] + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + .globl bar + .type bar, @function +bar: +.LFB1: + .cfi_startproc +# BLOCK 2 seq:0 +# PRED: ENTRY (FALLTHRU) + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $8, %rsp + movq %rdi, -8(%rbp) + movq -8(%rbp), %rax + movq %rax, %rdi + call foo + nop + leave + .cfi_def_cfa 7, 8 +# SUCC: EXIT [100.0%] + ret + .cfi_endproc +.LFE1: + .size bar, .-bar + .ident "GCC: (SUSE Linux) 7.5.0" + .section .note.GNU-stack,"",@progbits |