From 2c71f639a04fad36b5f7b255909ede09b63afdf9 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sat, 18 Sep 2021 09:25:49 +0200 Subject: [gdb/ada] Handle artificial local symbols 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 --- gdb/ada-lang.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'gdb/ada-lang.c') diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 6680a4f..487d92b 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 ()); @@ -13028,6 +13039,12 @@ public: } /* 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 { -- cgit v1.1