mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-29 08:24:05 +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)
|
compunit_epilogue_unwind_valid (struct compunit_symtab *cust)
|
||||||
{
|
{
|
||||||
/* In absence of producer information, assume epilogue unwind info is
|
/* In absence of producer information, assume epilogue unwind info is
|
||||||
invalid. */
|
valid. */
|
||||||
if (cust == nullptr)
|
if (cust == nullptr)
|
||||||
return false;
|
return true;
|
||||||
|
|
||||||
return cust->epilogue_unwind_valid ();
|
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