From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id bpFBEJfUJGF8VQAAWB0awg (envelope-from ) for ; Tue, 24 Aug 2021 07:14:31 -0400 Received: by simark.ca (Postfix, from userid 112) id 39F461EE18; Tue, 24 Aug 2021 07:14:31 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id C744B1E79C for ; Tue, 24 Aug 2021 07:14:29 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8254E3858003 for ; Tue, 24 Aug 2021 11:14:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8254E3858003 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1629803669; bh=AkMyixWWWryysdbkl5se//1zuci8rgepUt5x37710f0=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=BRezMY0tBJC5VOyaCSjgAQxX+LzmEr9FckipVOG/8SI7eiEqjuGv+oDmAVaEvm+HY rQje4cwD8FmvimVR4ec4c1N5tKm15JaIYWOo1/Z/rg7g1nHxzZ3S2OEyPiCh8faOsV drmEkVhwSO30IQDuXtGMUYFtd4KMaNeI4Kx0oHrg= Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 6AAF73858405 for ; Tue, 24 Aug 2021 11:14:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6AAF73858405 Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (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 A58CA220A6; Tue, 24 Aug 2021 11:14:00 +0000 (UTC) Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (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 imap1.suse-dmz.suse.de (Postfix) with ESMTPS id 89AEF1393C; Tue, 24 Aug 2021 11:14:00 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id 9TyQIHjUJGFyGAAAGKfGzw (envelope-from ); Tue, 24 Aug 2021 11:14:00 +0000 Date: Tue, 24 Aug 2021 13:13:59 +0200 To: gdb-patches@sourceware.org Subject: [PATCH][gdb/ada] Handle artificial local symbols Message-ID: <20210824111357.GA28507@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) 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: , From: Tom de Vries via Gdb-patches Reply-To: Tom de Vries Cc: Tom Tromey Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" Hi, With current master and gcc 7.5.0/8.5.0, we have this timeout: ... (gdb) print s^M Multiple matches for s^M [0] cancel^M [1] s at src/gdb/testsuite/gdb.ada/interface/foo.adb:20^M [2] s at src/gdb/testsuite/gdb.ada/interface/foo.adb:?^M > FAIL: gdb.ada/interface.exp: print s (timeout) ... [ The FAIL doesn't reproduce with gcc 9.3.1. This difference in behaviour bisects to gcc commit d70ba0c10de. The FAIL with earlier gcc bisects to gdb commit ba8694b650b. ] The FAIL is caused by gcc generating this debug info describing a named artificial variable: ... <2><1204>: Abbrev Number: 31 (DW_TAG_variable) <1205> DW_AT_name : s.14 <1209> DW_AT_type : <0x1213> <120d> DW_AT_artificial : 1 <120d> DW_AT_location : 5 byte block: 91 e0 7d 23 18 \ (DW_OP_fbreg: -288; DW_OP_plus_uconst: 24) ... An easy way to fix this would be to simply not put named artificial variables into the symbol table. However, that causes regressions for Ada. It relies on being able to get the value from such variables, using a named reference. Fix this instead by marking the symbol as artificial, and: - ignoring such symbols in ada_resolve_variable, which fixes the FAIL - ignoring such ada symbols in do_print_variable_and_value, which prevents them from showing up in "info locals" Note that a fix for the latter was submitted here ( https://sourceware.org/pipermail/gdb-patches/2008-January/054994.html ), and this patch borrows from it. Tested on x86_64-linux. Co-Authored-By: Joel Brobecker Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28180 Any comments? Thanks, - Tom [gdb/ada] Handle artificial local symbols --- gdb/ada-lang.c | 17 +++++++++++++++++ gdb/dwarf2/read.c | 5 +++++ gdb/language.h | 8 ++++++++ gdb/stack.c | 2 ++ gdb/symtab.h | 7 ++++++- gdb/testsuite/gdb.ada/interface.exp | 7 +++++++ 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 6680a4fd657..487d92be5c9 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -3539,6 +3539,17 @@ ada_resolve_variable (struct symbol *sym, const struct block *block, candidates.end ()); } + /* Filter out artificial symbols. */ + candidates.erase + (std::remove_if + (candidates.begin (), + candidates.end (), + [] (block_symbol &bsym) + { + return bsym.symbol->artificial; + }), + candidates.end ()); + int i; if (candidates.empty ()) error (_("No definition found for %s"), sym->print_name ()); @@ -13027,6 +13038,12 @@ class ada_language : public language_defn return language_defn::read_var_value (var, var_block, frame); } + /* See language.h. */ + virtual bool symbol_printing_suppressed (struct symbol *symbol) const override + { + return symbol->artificial; + } + /* See language.h. */ void language_arch_info (struct gdbarch *gdbarch, struct language_arch_info *lai) const override diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index a8b44952dc0..9ff13abad40 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -21644,6 +21644,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, sym->set_linkage_name (linkagename); } + /* Handle DW_AT_artificial. */ + attr = dwarf2_attr (die, DW_AT_artificial, cu); + if (attr != nullptr) + sym->artificial = 1; + /* Default assumptions. Use the passed type or decode it from the die. */ SYMBOL_DOMAIN (sym) = VAR_DOMAIN; diff --git a/gdb/language.h b/gdb/language.h index 21ed47b3580..40d22d20559 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -327,6 +327,14 @@ struct language_defn return {}; } + /* Return true if SYMBOL represents an entity that is not + supposed to be seen by the user. To be used to filter symbols + during printing. */ + virtual bool symbol_printing_suppressed (struct symbol *symbol) const + { + return false; + } + /* The per-architecture (OS/ABI) language information. */ virtual void language_arch_info (struct gdbarch *, diff --git a/gdb/stack.c b/gdb/stack.c index 516e4d45696..7c4cf9491cc 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2322,6 +2322,8 @@ do_print_variable_and_value (const char *print_name, if (p->treg.has_value () && !treg_matches_sym_type_name (*p->treg, sym)) return; + if (language_def (sym->language ())->symbol_printing_suppressed (sym)) + return; frame = frame_find_by_id (p->frame_id); if (frame == NULL) diff --git a/gdb/symtab.h b/gdb/symtab.h index fd8dd62a406..fde083f22d5 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1122,7 +1122,8 @@ struct symbol : public general_symbol_info, public allocate_on_obstack is_argument (0), is_inlined (0), maybe_copied (0), - subclass (SYMBOL_NONE) + subclass (SYMBOL_NONE), + artificial (0) { /* We can't use an initializer list for members of a base class, and general_symbol_info needs to stay a POD type. */ @@ -1192,6 +1193,10 @@ struct symbol : public general_symbol_info, public allocate_on_obstack ENUM_BITFIELD (symbol_subclass_kind) subclass : 2; + /* Whether this symbol is artificial. */ + + unsigned int artificial : 1; + /* Line number of this symbol's definition, except for inlined functions. For an inlined function (class LOC_BLOCK and SYMBOL_INLINED set) this is the line number of the function's call diff --git a/gdb/testsuite/gdb.ada/interface.exp b/gdb/testsuite/gdb.ada/interface.exp index 68b51917e8d..2dfcd8e8afd 100644 --- a/gdb/testsuite/gdb.ada/interface.exp +++ b/gdb/testsuite/gdb.ada/interface.exp @@ -33,3 +33,10 @@ gdb_test "print r" \ gdb_test "print s" \ "= \\(x => 1, y => 2, w => 3, h => 4\\)" + +set cmd "info locals" +gdb_test $cmd \ + [multi_line \ + $cmd \ + "r = \[^\r\n\]*" \ + "s = \[^\r\n\]*"]