From patchwork Tue Apr 18 12:09:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 67902 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91DB6385841D for ; Tue, 18 Apr 2023 12:10:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 91DB6385841D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1681819803; bh=w3bRW4tR+JqDGhy6Z6JCNWskvvEPqWFAT9rq73EDyXQ=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=paxbyce+wu7x9etyfJUpdULvbVy/K6bp69qPdZmY+JUWy0espVOYY8SBre9AX/61+ bpa2eeZDjMVT4ZXRwZtsPQhLPsuzKdJNGwI6BHpcbrAFiMkHVSEyyI4H8GQtx9PIhm tkVQR5LQ/sB7Vv2jMC3Xe5NCaiqD+Bwb2QIHD7aU= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id 4DF533858D1E for ; Tue, 18 Apr 2023 12:09:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4DF533858D1E Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 626D321A3C for ; Tue, 18 Apr 2023 12:09:39 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4270913581 for ; Tue, 18 Apr 2023 12:09:39 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id EpX4DoOIPmSACAAAMHmgww (envelope-from ) for ; Tue, 18 Apr 2023 12:09:39 +0000 To: gdb-patches@sourceware.org Subject: [PATCH v3] gdb: Fix false match issue in skip_prologue_using_linetable Date: Tue, 18 Apr 2023 14:09:39 +0200 Message-Id: <20230418120939.29102-1-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gdb-patches From: Tom de Vries Reply-To: Tom de Vries Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" From: WANG Rui [ Changes in v2: - rebase on trunk Changes in v3: - add test-case ] We should exclude matches to the ending PC to prevent false matches with the next function, as prologue_end is located at the end PC. : 0x00: ... <-- start_pc 0x04: ... 0x08: ... <-- breakpoint 0x0c: ret : 0x10: ret <-- end_pc | prologue_end of fun2 Tested on x86_64-linux. Co-Authored-By: WANG Rui (fix, tiny change [1]) Co-Authored-By: Tom de Vries (test-case) [1] https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html --- gdb/symtab.c | 2 +- gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.c | 30 +++++ .../gdb.dwarf2/dw2-prologue-end-2.exp | 118 ++++++++++++++++++ 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.c create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp base-commit: c2f60ac565f1d369fde98146a16f1d3ef79e1000 diff --git a/gdb/symtab.c b/gdb/symtab.c index 9e9798676cb..a789512d60b 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -3705,7 +3705,7 @@ skip_prologue_using_linetable (CORE_ADDR func_addr) for (; (it < linetable->item + linetable->nitems - && it->raw_pc () <= unrel_end); + && it->raw_pc () < unrel_end); it++) if (it->prologue_end) return {it->pc (objfile)}; diff --git a/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.c b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.c new file mode 100644 index 00000000000..2f29652b633 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.c @@ -0,0 +1,30 @@ +/* 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 . */ + +int +main (void) +{ + int main = 1; /* Main body. */ + + asm ("foo_label: .global foo_label"); + int foo = 2; /* Foo body. */ + asm ("foo_end: .global foo_end"); + + asm ("bar_label: .global bar_label"); + int bar = 3; /* Bar body. */ + asm ("bar_end: .global bar_end"); + + return main + foo + bar; +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp new file mode 100644 index 00000000000..488f85f9674 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp @@ -0,0 +1,118 @@ +# 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 prologue analysis in foo is correct in the presence of a +# prologue_end marker in immediately following function bar. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +require dwarf2_support + +standard_testfile .c .S + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + global srcdir subdir srcfile srcfile2 + declare_labels lines_label + + cu {} { + compile_unit { + {language @DW_LANG_C} + {name dw2-prologue-end.c} + {stmt_list ${lines_label} DW_FORM_sec_offset} + } { + subprogram { + {external 1 flag} + {name foo} + {low_pc foo_label addr} + {high_pc foo_end addr} + } + subprogram { + {external 1 flag} + {name bar} + {low_pc bar_label addr} + {high_pc bar_end addr} + } + } + } + + lines {version 5} lines_label { + set diridx [include_dir "${srcdir}/${subdir}"] + file_name "$srcfile" $diridx + + program { + DW_LNS_set_file $diridx + + DW_LNE_set_address foo_label + line [gdb_get_line_number "Foo body"] + DW_LNS_copy + + DW_LNE_set_address bar_label + DW_LNS_set_prologue_end + line [gdb_get_line_number "Bar body"] + DW_LNS_copy + + DW_LNE_set_address bar_end + DW_LNE_end_sequence + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +# Don't runto main here, otherwise the following doesn't +# function as regression test for PR30369. + +# Get the "break foo" address. + +set break_addr "" +gdb_test_multiple "break foo" "" { + -re -wrap "at ($hex):\[^\r\n\]*" { + set break_addr $expect_out(1,string) + pass $gdb_test_name + } +} + +if { $break_addr == "" } { + return +} + +# Get the "foo_label" address. + +set foo_label_addr "" +gdb_test_multiple "print /x &foo_label" "" { + -re -wrap "= ($hex)" { + set foo_label_addr $expect_out(1,string) + pass $gdb_test_name + } +} + +if { $foo_label_addr == "" } { + return +} + +# Check that bar immediately follows foo. Otherwise the following doesn't +# function as regression test for PR30369. + +gdb_test "print &foo_end == &bar_label" " = 1" + +# Check that the breakpoint is set at the expected address. Regression test +# for PR30369. + +gdb_assert { $break_addr == $foo_label_addr }