From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd36.google.com (mail-io1-xd36.google.com [IPv6:2607:f8b0:4864:20::d36]) by sourceware.org (Postfix) with ESMTPS id A73AF3861863 for ; Thu, 15 Feb 2024 16:08:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A73AF3861863 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A73AF3861863 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d36 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708013337; cv=none; b=SfiN2HTEt39TyEM4IMAi5DzvCMtR5cNrAkxh+j1pVIvvT0MldFvSS67MgM5fihrEzmHDn4JHFwB4z4OLNVIcqYjLv3AmtZod3Bnmmja1VBo/lcRGKrJ7YFo+hNUQ26yl4/Y4TS9qzl68wzMhPFnsJY9jzPj7ldl4/mKUGAuV2/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708013337; c=relaxed/simple; bh=3ZqrdIuRQm8aiqqS3vaJoeaI77lsU4DM3GkfK/KxkLk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=rDaye8vXtInDp4nADKP+f/Ig4nG7GtByMhi0CpSf4HfwPxw+SOhrMZnjmgbps7QRoe8/nwQ1SeLWOGLLYRnd8vZlCtj81MHut9OtML+OrpWfUNk1jSksLfxC5KAVB4u73ZLCFqS9X5PRtNGuW8hc5JQphHKYxkJ8gOmYKW4oZlo= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd36.google.com with SMTP id ca18e2360f4ac-7c029beb8c9so44438039f.0 for ; Thu, 15 Feb 2024 08:08:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1708013329; x=1708618129; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=CyWTDxNF4zJ/7xkwlhm6A67J1/klbHUD7xHoNSXbGg0=; b=eELsZLESML5Np1RkpgN1rjxf3IF78naGxw3z+3WlOF/2Qk3jxILhk8M5H8+NLQmIGN SFLmiFpPVVeH3UyOp6EVkztdT786CuV+HXYWl1Yo3Hw9x3ZvwjLqSDlahWFEt/P0WNxM vHyXp6E6S1/IeLoHZDz1eWh1TeBuuStQ38ZWIHhuWHQS3E2IvKwm+XnrNXyzhjQ8FbgD eAc8OCxNb4bpnsTv0VqHinrzxANhV0Ezdj7L7C0n0XD5StZqHAssB5/PYngR2W8RsKBu MoxeQctunRF4VfKedjSRbwqGL5HFwd9fOO5WQzzIfA7L3oNRB+X3HerRsVGvN2NpjMEm 2LpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708013329; x=1708618129; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=CyWTDxNF4zJ/7xkwlhm6A67J1/klbHUD7xHoNSXbGg0=; b=XCGDuWRNEy592IkU6UWh7oqrR4e6L85BhhxOrvGqkSItF8Tf1EV4p7pzOmomewSzyY LB+T0E/J5F/J4m9VFiWrpkdJxOkFBwr7tUwIfmDO5MzpBtrA0FZbQlbCQoRgqxvUaWn5 bZehBkzoe5hGkPGSzV1FVtey7fwCkKutP+zDU3EpBQG3z9c3jPphNuBoHAEN50apYq0T Pk9dayKnms7JRoX3+DqiqLkIcALBwXqA346XbxeWdphuvfFmmws8sT3fEvidNK3JiYm5 bCG7+nh9fYqKLXJbJRaxEZC0tXLQl5/s+FnE9on4JwuTSJqQd57rWXS/tAaAzMQLmkT8 MLWA== X-Gm-Message-State: AOJu0Yw0ivxeUd3K7BFeMaHTaGwT7b+AFRJEWf5A6YrD4PR+5c6+zkqO n7c8aqV+kN7lBwCam/UFDIx/K2ExO/tH/ftGuB6T1hvQVvlf7phurIgd+tricGN/Buw7kdBh/3k = X-Google-Smtp-Source: AGHT+IHpqIKq/+Z1yM8zsgzisNFwCyfLAZaQJHwJ2iqbSq3rVuoNqqetDA99vP3dpyMWe10lho7Y8g== X-Received: by 2002:a6b:e313:0:b0:7c4:92a5:64ad with SMTP id u19-20020a6be313000000b007c492a564admr2758764ioc.4.1708013328719; Thu, 15 Feb 2024 08:08:48 -0800 (PST) Received: from localhost.localdomain (71-211-170-195.hlrn.qwest.net. [71.211.170.195]) by smtp.gmail.com with ESMTPSA id dx9-20020a0566381d0900b00471495fa313sm388512jab.150.2024.02.15.08.08.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Feb 2024 08:08:48 -0800 (PST) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v3] Speed up lookup of "type_specific_data" Date: Thu, 15 Feb 2024 09:08:38 -0700 Message-ID: <20240215160838.3999663-1-tromey@adacore.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,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: I noticed that "info locals" on a certain large Ada program was very slow. I tracked this down to ada_get_tsd_type expanding nearly every CU in the program. This patch fixes the problem by changing this code to use the more efficient lookup_transparent_type which, unlike the Ada-specific lookup functions, does not try to find all matching instances. Note that I first tried fixing this by changing ada_find_any_type, but this did not work -- I may revisit this approach at some later date. Also note that the copyright dates on the test files are set that way because I copied them from another test. New in v2: the new test failed on the Linaro regression tester. Looking at the logs, it seems that gdb was picking up a 'value' from libgnat: $1 = {} 0xf7e227a4 This version renames the local variable in an attempt to work around this. v3: In v2, while trying to reproduce the problem locally, I accidentally forgot to commit one of the changes. --- gdb/ada-lang.c | 4 +- gdb/c-lang.c | 6 +- gdb/cp-namespace.c | 4 +- gdb/cp-support.h | 3 +- gdb/language.h | 5 +- gdb/symtab.c | 27 +++++---- gdb/symtab.h | 6 +- gdb/testsuite/gdb.ada/tagged-lookup.exp | 61 ++++++++++++++++++++ gdb/testsuite/gdb.ada/tagged-lookup/foo.adb | 23 ++++++++ gdb/testsuite/gdb.ada/tagged-lookup/pck.adb | 22 +++++++ gdb/testsuite/gdb.ada/tagged-lookup/pck.ads | 21 +++++++ gdb/testsuite/gdb.ada/tagged-lookup/pck2.adb | 21 +++++++ gdb/testsuite/gdb.ada/tagged-lookup/pck2.ads | 22 +++++++ 13 files changed, 204 insertions(+), 21 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup.exp create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup/foo.adb create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup/pck.adb create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup/pck.ads create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup/pck2.adb create mode 100644 gdb/testsuite/gdb.ada/tagged-lookup/pck2.ads diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a3fd695e003..59bb64bfb63 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6469,7 +6469,9 @@ ada_get_tsd_type (struct inferior *inf) struct ada_inferior_data *data = get_ada_inferior_data (inf); if (data->tsd_type == 0) - data->tsd_type = ada_find_any_type ("ada__tags__type_specific_data"); + data->tsd_type + = lookup_transparent_type ("", + SEARCH_TYPE_DOMAIN); return data->tsd_type; } diff --git a/gdb/c-lang.c b/gdb/c-lang.c index ce711c4b4f6..cc33aad088e 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -935,9 +935,11 @@ class cplus_language : public language_defn } /* See language.h. */ - struct type *lookup_transparent_type (const char *name) const override + struct type *lookup_transparent_type (const char *name, + domain_search_flags flags) + const override { - return cp_lookup_transparent_type (name); + return cp_lookup_transparent_type (name, flags); } /* See language.h. */ diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 41ab52de54a..fb9fcf8ed6e 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -1024,10 +1024,10 @@ cp_lookup_nested_symbol (struct type *parent_type, released version of GCC with such information.) */ struct type * -cp_lookup_transparent_type (const char *name) +cp_lookup_transparent_type (const char *name, domain_search_flags flags) { /* First, try the honest way of looking up the definition. */ - struct type *t = basic_lookup_transparent_type (name); + struct type *t = basic_lookup_transparent_type (name, flags); const char *scope; if (t != NULL) diff --git a/gdb/cp-support.h b/gdb/cp-support.h index f95b6f0f0e2..4015126154b 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -161,7 +161,8 @@ extern struct block_symbol const struct block *block, const domain_search_flags domain); -struct type *cp_lookup_transparent_type (const char *name); +struct type *cp_lookup_transparent_type (const char *name, + domain_search_flags flags); /* See description in cp-namespace.c. */ diff --git a/gdb/language.h b/gdb/language.h index 5bef965c2c8..19bffcc3a7a 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -349,9 +349,10 @@ struct language_defn /* Find the definition of the type with the given name. */ - virtual struct type *lookup_transparent_type (const char *name) const + virtual struct type *lookup_transparent_type (const char *name, + domain_search_flags flags) const { - return basic_lookup_transparent_type (name); + return basic_lookup_transparent_type (name, flags); } /* Find all symbols in the current program space matching NAME in diff --git a/gdb/symtab.c b/gdb/symtab.c index 02f5d4f1b3d..aa2de7121cd 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2692,9 +2692,9 @@ symbol::matches (domain_search_flags flags) const /* See symtab.h. */ struct type * -lookup_transparent_type (const char *name) +lookup_transparent_type (const char *name, domain_search_flags flags) { - return current_language->lookup_transparent_type (name); + return current_language->lookup_transparent_type (name, flags); } /* A helper for basic_lookup_transparent_type that interfaces with the @@ -2703,6 +2703,7 @@ lookup_transparent_type (const char *name) static struct type * basic_lookup_transparent_type_quick (struct objfile *objfile, enum block_enum block_index, + domain_search_flags flags, const char *name) { struct compunit_symtab *cust; @@ -2710,7 +2711,7 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, const struct block *block; struct symbol *sym; - cust = objfile->lookup_symbol (block_index, name, SEARCH_STRUCT_DOMAIN); + cust = objfile->lookup_symbol (block_index, name, flags); if (cust == NULL) return NULL; @@ -2718,7 +2719,7 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, block = bv->block (block_index); lookup_name_info lookup_name (name, symbol_name_match_type::FULL); - sym = block_find_symbol (block, lookup_name, SEARCH_STRUCT_DOMAIN, nullptr); + sym = block_find_symbol (block, lookup_name, flags, nullptr); if (sym == nullptr) error_in_psymtab_expansion (block_index, name, cust); gdb_assert (!TYPE_IS_OPAQUE (sym->type ())); @@ -2732,6 +2733,7 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, static struct type * basic_lookup_transparent_type_1 (struct objfile *objfile, enum block_enum block_index, + domain_search_flags flags, const char *name) { const struct blockvector *bv; @@ -2743,8 +2745,7 @@ basic_lookup_transparent_type_1 (struct objfile *objfile, { bv = cust->blockvector (); block = bv->block (block_index); - sym = block_find_symbol (block, lookup_name, SEARCH_STRUCT_DOMAIN, - nullptr); + sym = block_find_symbol (block, lookup_name, flags, nullptr); if (sym != nullptr) { gdb_assert (!TYPE_IS_OPAQUE (sym->type ())); @@ -2762,7 +2763,7 @@ basic_lookup_transparent_type_1 (struct objfile *objfile, global blocks. */ struct type * -basic_lookup_transparent_type (const char *name) +basic_lookup_transparent_type (const char *name, domain_search_flags flags) { struct type *t; @@ -2773,14 +2774,16 @@ basic_lookup_transparent_type (const char *name) for (objfile *objfile : current_program_space->objfiles ()) { - t = basic_lookup_transparent_type_1 (objfile, GLOBAL_BLOCK, name); + t = basic_lookup_transparent_type_1 (objfile, GLOBAL_BLOCK, + flags, name); if (t) return t; } for (objfile *objfile : current_program_space->objfiles ()) { - t = basic_lookup_transparent_type_quick (objfile, GLOBAL_BLOCK, name); + t = basic_lookup_transparent_type_quick (objfile, GLOBAL_BLOCK, + flags, name); if (t) return t; } @@ -2794,14 +2797,16 @@ basic_lookup_transparent_type (const char *name) for (objfile *objfile : current_program_space->objfiles ()) { - t = basic_lookup_transparent_type_1 (objfile, STATIC_BLOCK, name); + t = basic_lookup_transparent_type_1 (objfile, STATIC_BLOCK, + flags, name); if (t) return t; } for (objfile *objfile : current_program_space->objfiles ()) { - t = basic_lookup_transparent_type_quick (objfile, STATIC_BLOCK, name); + t = basic_lookup_transparent_type_quick (objfile, STATIC_BLOCK, + flags, name); if (t) return t; } diff --git a/gdb/symtab.h b/gdb/symtab.h index ca5a5b0f7fd..9c20a20f062 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2307,9 +2307,11 @@ extern void reread_symbols (int from_tty); The type returned must not be opaque -- i.e., must have at least one field defined. */ -extern struct type *lookup_transparent_type (const char *); +extern struct type *lookup_transparent_type + (const char *name, domain_search_flags flags = SEARCH_STRUCT_DOMAIN); -extern struct type *basic_lookup_transparent_type (const char *); +extern struct type *basic_lookup_transparent_type + (const char *name, domain_search_flags flags = SEARCH_STRUCT_DOMAIN); /* Macro for name of symbol to indicate a file compiled with gcc. */ #ifndef GCC_COMPILED_FLAG_SYMBOL diff --git a/gdb/testsuite/gdb.ada/tagged-lookup.exp b/gdb/testsuite/gdb.ada/tagged-lookup.exp new file mode 100644 index 00000000000..4bc088ba8d5 --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup.exp @@ -0,0 +1,61 @@ +# Copyright 2024 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 we can print values of parameters of type 'pointer +# (access) to tagged type'. See PR gdb/22670. + +load_lib "ada.exp" + +require allow_ada_tests + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] +if {![runto "foo.adb:$bp_location"]} { + return +} + +gdb_test_no_output "set debug symtab-create 1" + +# The idea here is that just a single CU should be expanded while +# searching for the tsd type. +set found_pck 0 +set found_pck2 0 +gdb_test_multiple "print *the_local_var" "only one CU expanded" -lbl { + -re ".symtab-create. start_subfile: name = \[^,\]*pck\\.adb, name_for_id = \[^\r\n\]*\r\n" { + set found_pck 1 + exp_continue + } + -re ".symtab-create. start_subfile: name = \[^,\]*pck2\\.adb, name_for_id = \[^\r\n\]*\r\n" { + set found_pck2 1 + exp_continue + } + -re ".symtab-create. start_subfile: name = \[^,\]*, name_for_id = \[^\r\n\]*\r\n" { + exp_continue + } + -re -wrap ".* = \\\(n => $decimal\\\)" { + if {$found_pck + $found_pck2 == 1} { + pass $gdb_test_name + } else { + fail $gdb_test_name + } + } +} diff --git a/gdb/testsuite/gdb.ada/tagged-lookup/foo.adb b/gdb/testsuite/gdb.ada/tagged-lookup/foo.adb new file mode 100644 index 00000000000..35e1aa3a12a --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup/foo.adb @@ -0,0 +1,23 @@ +-- Copyright 2017-2024 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 . + +with Pck; use Pck; +with Pck2; use Pck2; +procedure Foo is + The_Local_Var : access Top_T2 := new Top_T2'(N => 2); +begin + Inspect (new Top_T'(N => 2)); -- STOP + Inspect2 (The_Local_Var); +end Foo; diff --git a/gdb/testsuite/gdb.ada/tagged-lookup/pck.adb b/gdb/testsuite/gdb.ada/tagged-lookup/pck.adb new file mode 100644 index 00000000000..d5f843a0a29 --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup/pck.adb @@ -0,0 +1,22 @@ +-- Copyright 2017-2024 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 . + +with Pck2; use Pck2; +package body Pck is + procedure Inspect (Obj: access Top_T'Class) is + begin + null; + end Inspect; +end Pck; diff --git a/gdb/testsuite/gdb.ada/tagged-lookup/pck.ads b/gdb/testsuite/gdb.ada/tagged-lookup/pck.ads new file mode 100644 index 00000000000..7731fe29886 --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup/pck.ads @@ -0,0 +1,21 @@ +-- Copyright 2017-2024 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 . + +package Pck is + type Top_T is tagged record + N : Integer := 1; + end record; + procedure Inspect (Obj: access Top_T'Class); +end Pck; diff --git a/gdb/testsuite/gdb.ada/tagged-lookup/pck2.adb b/gdb/testsuite/gdb.ada/tagged-lookup/pck2.adb new file mode 100644 index 00000000000..87f77e503da --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup/pck2.adb @@ -0,0 +1,21 @@ +-- Copyright 2017-2024 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 . + +package body Pck2 is + procedure Inspect2 (Obj: access Top_T2'Class) is + begin + null; + end Inspect2; +end Pck2; diff --git a/gdb/testsuite/gdb.ada/tagged-lookup/pck2.ads b/gdb/testsuite/gdb.ada/tagged-lookup/pck2.ads new file mode 100644 index 00000000000..c45962b3c5c --- /dev/null +++ b/gdb/testsuite/gdb.ada/tagged-lookup/pck2.ads @@ -0,0 +1,22 @@ +-- Copyright 2017-2024 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 . + +with Pck; use Pck; +package Pck2 is + type Top_T2 is tagged record + N : Integer := 1; + end record; + procedure Inspect2 (Obj: access Top_T2'Class); +end Pck2; -- 2.43.0