From patchwork Thu Jul 20 15:58:10 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: 73006 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 03AD9385703F for ; Thu, 20 Jul 2023 15:58:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 03AD9385703F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1689868723; bh=BWeTUWrSE/GxB2AJJNp9+G7C+1ApsIbpcirZFWrZmDc=; h=Date:Subject:To:Cc:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=qAeSgyhUfmBslgs8vvbY4R1lX9HhjroH033lwIETTMmKLcjjcmtkg/WsluP5dQH0A sZN/r6BCbDIl9YwiDlDoub6qfNJiRQnOTnkQAmyWxKi3xbiaiZTadOJJFscL74A++7 jtEpBZaPy+S/kBoIoF1XlmYNW8nkuynK20lZG9yw= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id C65573858CDB for ; Thu, 20 Jul 2023 15:58:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C65573858CDB 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-out2.suse.de (Postfix) with ESMTPS id DB7FE1F8AC; Thu, 20 Jul 2023 15:58:15 +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 C221913924; Thu, 20 Jul 2023 15:58:15 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id XjzlLZdZuWSuJwAAMHmgww (envelope-from ); Thu, 20 Jul 2023 15:58:15 +0000 Message-ID: <79e60ec4-fe14-3ad2-1c9b-32a94fff8d31@suse.de> Date: Thu, 20 Jul 2023 17:58:10 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: [PATCH, v2] [gdb/symtab] Add optimized out static var to cooked index Content-Language: en-US To: gdb-patches@sourceware.org Cc: Tom Tromey References: <20230720144049.26777-1-tdevries@suse.de> In-Reply-To: <20230720144049.26777-1-tdevries@suse.de> X-Spam-Status: No, score=-11.9 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" On 7/20/23 16:40, Tom de Vries via Gdb-patches wrote: And here's a v2: - add a dwarf assembly test-case (that I already had partially written, but forgotten about) - fix a few nits in the gdb.opt testcase (gdb_test -> gdb_test_no_output etc) Thanks, - Tom From 120e45112c2fe56f5ba1bed34c904bff53df9bde Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 20 Jul 2023 13:28:44 +0200 Subject: [PATCH v2] [gdb/symtab] Add optimized out static var to cooked index Consider the test-case: ... $ cat main.c int main (void) { return 0; } $ cat static-optimized-out.c static int aaa; ... compiled like this: ... $ gcc-12 static-optimized-out.c main.c -g -O2 -flto ... There's a difference in behaviour depending on symtab expansion state: ... $ gdb -q -batch a.out -ex "print aaa" No symbol "aaa" in current context. $ gdb -q -batch a.out -ex "maint expand-symtab" -ex "print aaa" $1 = ... The reason for the difference is that the optimized out variable aaa: ... <1><104>: Abbrev Number: 2 (DW_TAG_variable) <105> DW_AT_name : aaa <109> DW_AT_decl_file : 1 <10a> DW_AT_decl_line : 18 <10b> DW_AT_decl_column : 12 <10c> DW_AT_type : <0x110> ... is not added to the cooked index because of this clause in abbrev_table::read: ... else if (!has_location && !has_specification_or_origin && !has_external && cur_abbrev->tag == DW_TAG_variable) cur_abbrev->interesting = false; ... Fix this inconsistency by making sure that the optimized out variable is added to the cooked index. Regression tested on x86_64-linux. Add two test-cases, a C test-case gdb.opt/static-optimized-out.exp and a dwarf assembly test-case gdb.dwarf2/static-optimized-out.exp. Tested gdb.opt/static-optimized-out.exp with gcc-8 to gcc-12, for which we now consistently get: ... (gdb) print aaa^M $1 = ^M ... and with gcc 7.5.0 and clang 13.0.1, for which we still consistently get: ... (gdb) print aaa^M No symbol "aaa" in current context.^M ... due to missing debug info for the variable. PR symtab/30656 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30656 --- gdb/dwarf2/abbrev.c | 9 --- .../gdb.dwarf2/static-optimized-out.exp | 67 +++++++++++++++++++ gdb/testsuite/gdb.opt/main.c | 22 ++++++ gdb/testsuite/gdb.opt/static-optimized-out.c | 18 +++++ .../gdb.opt/static-optimized-out.exp | 49 ++++++++++++++ 5 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/static-optimized-out.exp create mode 100644 gdb/testsuite/gdb.opt/main.c create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.c create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.exp diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c index 1ebf8f6eed5..3a429fd41b1 100644 --- a/gdb/dwarf2/abbrev.c +++ b/gdb/dwarf2/abbrev.c @@ -162,7 +162,6 @@ abbrev_table::read (struct dwarf2_section_info *section, bool has_specification_or_origin = false; bool has_name = false; bool has_linkage_name = false; - bool has_location = false; bool has_external = false; /* Now read in declarations. */ @@ -217,11 +216,6 @@ abbrev_table::read (struct dwarf2_section_info *section, has_linkage_name = true; break; - case DW_AT_const_value: - case DW_AT_location: - has_location = true; - break; - case DW_AT_sibling: if (is_csize && cur_attr.form == DW_FORM_ref4) sibling_offset = size; @@ -296,9 +290,6 @@ abbrev_table::read (struct dwarf2_section_info *section, cur_abbrev->interesting = false; else if (!tag_interesting_for_index (cur_abbrev->tag)) cur_abbrev->interesting = false; - else if (!has_location && !has_specification_or_origin && !has_external - && cur_abbrev->tag == DW_TAG_variable) - cur_abbrev->interesting = false; else cur_abbrev->interesting = true; diff --git a/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp new file mode 100644 index 00000000000..f3eff586911 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp @@ -0,0 +1,67 @@ +# 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 an optimized out static variable is printed the same independent +# of state of symtab expansion. See also gdb.opt/static-optimized-out.exp. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +require dwarf2_support + +standard_testfile main.c -dw.S + +# Make DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + compile_unit { + { + language @DW_LANG_C + } + } { + declare_labels integer_label + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + DW_TAG_variable { + {name var} + {type :$integer_label} + } + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +gdb_test "print var" " = " + +# Expand all symbol tables. +gdb_test_no_output "maint expand-symtabs" + +# Make sure we do an actual lookup rather than just returning the same as +# before. +gdb_test_no_output "maint flush symbol-cache" + +with_test_prefix "after expand-symtabs" { + gdb_test "print var" " = " +} diff --git a/gdb/testsuite/gdb.opt/main.c b/gdb/testsuite/gdb.opt/main.c new file mode 100644 index 00000000000..c6beff77dbe --- /dev/null +++ b/gdb/testsuite/gdb.opt/main.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + 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) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.c b/gdb/testsuite/gdb.opt/static-optimized-out.c new file mode 100644 index 00000000000..44287fbd6d2 --- /dev/null +++ b/gdb/testsuite/gdb.opt/static-optimized-out.c @@ -0,0 +1,18 @@ +/* This testcase is part of GDB, the GNU debugger. + + 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 . */ + +static int aaa; diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.exp b/gdb/testsuite/gdb.opt/static-optimized-out.exp new file mode 100644 index 00000000000..bd673b6503e --- /dev/null +++ b/gdb/testsuite/gdb.opt/static-optimized-out.exp @@ -0,0 +1,49 @@ +# 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 an optimized out static variable is printed the same independent +# of state of symtab expansion. See also gdb.dwarf2/static-optimized-out.exp. + +standard_testfile .c main.c + +set opts {} +lappend opts debug +lappend opts "optimize=-O2 -flto" + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile $srcfile2] $opts] } { + return -1 +} + +set val "" +gdb_test_multiple "print aaa" "" { + -re -wrap "^(?:\\$$decimal = )?(.*)" { + set val $expect_out(1,string) + } +} + +if { $val == "" } { + return +} + +# Expand all symbol tables. +gdb_test_no_output "maint expand-symtab" + +# Make sure we do an actual lookup rather than just returning the same as +# before. +gdb_test_no_output "maint flush symbol-cache" + +# Now check that we get the same result in both cases. +gdb_test "print aaa" [string_to_regexp $val] "consistency" base-commit: 22e69d8d37738c2aa33543b9f311130d3fe2e4c3 -- 2.35.3