From 8908d9c45cde37c8a7840db80091b1190f209c8f Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Mon, 20 Feb 2023 12:20:14 +0100 Subject: [PATCH] [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. --- gdb/symtab.h | 4 +- .../gdb.base/unwind-on-each-insn-amd64-2.exp | 52 ++++++++++++++++++ .../gdb.base/unwind-on-each-insn-amd64-2.s | 54 +++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.exp create mode 100644 gdb/testsuite/gdb.base/unwind-on-each-insn-amd64-2.s diff --git a/gdb/symtab.h b/gdb/symtab.h index cd6b5f722fd..17d2746fd48 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 00000000000..c8a94ccef4f --- /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 . */ + +# 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 00000000000..c141f71817c --- /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 -- 2.39.2