From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id E9A99385559F for ; Thu, 20 Jul 2023 14:40:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E9A99385559F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de 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 B017421DB9; Thu, 20 Jul 2023 14:40:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1689864054; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=AH71g/eo8KMbOH9OhaZ/ND5GK0G55cUJs5Go9ByVnHI=; b=hqXlcf/ZpKTZMzk99AyzvOhtt3qgMPKEaEBNH79r9AJ7ahUOuKDv+fxqi0qIjR0TlLMS1h eBy5PPDkOQZ7sSufK11eX4vfjL/MSnAww4aOG0SjdWaEL1aQSW7q0xH82o9P0GQHfTUhth 1U9h3WXFMYqoKj04MEVUgn8pbSDFvXQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1689864054; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=AH71g/eo8KMbOH9OhaZ/ND5GK0G55cUJs5Go9ByVnHI=; b=agtxR2p7+T6kKgQT+aABBIKlJcXeqzklebZPCAvzuloKS0q3gRyWrD5m0QzksQiLGeDaFM nrC2h5LzXngYtEAA== 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 95A84138EC; Thu, 20 Jul 2023 14:40:54 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id w5RQI3ZHuWR9ewAAMHmgww (envelope-from ); Thu, 20 Jul 2023 14:40:54 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] [gdb/symtab] Add optimized out static var to cooked index Date: Thu, 20 Jul 2023 16:40:49 +0200 Message-Id: <20230720144049.26777-1-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.3 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 List-Id: 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. Tested the C test-case with gcc-8 to gcc-12, for which we consistently get: ... (gdb) print aaa^M $1 = ^M ... and with gcc 7.5.0 and clang 13.0.1, for which we 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/testsuite/gdb.opt/main.c | 22 +++++++++ gdb/testsuite/gdb.opt/static-optimized-out.c | 18 +++++++ .../gdb.opt/static-optimized-out.exp | 49 +++++++++++++++++++ 4 files changed, 89 insertions(+), 9 deletions(-) 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.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..262485a5bda --- /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. + +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 "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