mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 15:18:37 +08:00
[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.
This commit is contained in:
@ -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 ();
|
||||
}
|
||||
|
52
gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp
Normal file
52
gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp
Normal file
@ -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
|
54
gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s
Normal file
54
gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s
Normal file
@ -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
|
Reference in New Issue
Block a user