From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 2O+9Box/pWH6UAAAWB0awg (envelope-from ) for ; Mon, 29 Nov 2021 20:34:04 -0500 Received: by simark.ca (Postfix, from userid 112) id 172E41F0CE; Mon, 29 Nov 2021 20:34:04 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,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 5EE9F1ECEB for ; Mon, 29 Nov 2021 20:34:03 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0B6AE385C017 for ; Tue, 30 Nov 2021 01:34:03 +0000 (GMT) Received: from gateway33.websitewelcome.com (gateway33.websitewelcome.com [192.185.146.68]) by sourceware.org (Postfix) with ESMTPS id 5967E385840B for ; Tue, 30 Nov 2021 01:33:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5967E385840B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=tromey.com Received: from cm16.websitewelcome.com (cm16.websitewelcome.com [100.42.49.19]) by gateway33.websitewelcome.com (Postfix) with ESMTP id 9B5251BDA19A for ; Mon, 29 Nov 2021 19:33:07 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id rs15mWcaEL3b1rs15mmN3w; Mon, 29 Nov 2021 19:33:07 -0600 X-Authority-Reason: nr=8 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=RPmZlhmKKI8e3yDDR1dqXIAyMd5Qjbi+T4F2RxvHgzo=; b=YX4CaCpzdg1Wp+NigK45fSjOWe a4+VcIc3FtmE9WBV4EbcvDdO3fmEcQeefydzqySc+wnZYNfb5bambkQLLhwIhAwAuMofYbsBqqmBu jLVdOyeLg1XoEmOQhS3FpJTfE; Received: from 97-122-84-67.hlrn.qwest.net ([97.122.84.67]:51980 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mrs15-000sGC-CQ; Mon, 29 Nov 2021 18:33:07 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Subject: [PATCH 3/3] Cache the result of find_file_and_directory Date: Mon, 29 Nov 2021 18:33:04 -0700 Message-Id: <20211130013304.4135367-4-tom@tromey.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211130013304.4135367-1-tom@tromey.com> References: <20211130013304.4135367-1-tom@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.84.67 X-Source-L: No X-Exim-ID: 1mrs15-000sGC-CQ X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-84-67.hlrn.qwest.net (localhost.localdomain) [97.122.84.67]:51980 X-Source-Auth: tom+tromey.com X-Email-Count: 4 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes 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: , Cc: Tom Tromey Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" This changes the DWARF reader to cache the result of find_file_and_directory. This is not especially important now, but it will help the new DWARF indexer. --- gdb/dwarf2/file-and-dir.h | 38 +++++++++++++++++++------------------- gdb/dwarf2/read.c | 18 +++++++++++------- gdb/dwarf2/read.h | 6 ++++++ 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/gdb/dwarf2/file-and-dir.h b/gdb/dwarf2/file-and-dir.h index 64d5a08bf0c..b64d304964a 100644 --- a/gdb/dwarf2/file-and-dir.h +++ b/gdb/dwarf2/file-and-dir.h @@ -35,23 +35,23 @@ struct file_and_directory { - file_and_directory (const char *name_, const char *dir_) - : name (name_), - comp_dir (dir_) + file_and_directory (const char *name, const char *dir) + : m_name (name), + m_comp_dir (dir) { } /* Return true if the file name is unknown. */ bool is_unknown () const { - return name == nullptr; + return m_name == nullptr; } /* Set the compilation directory. */ void set_comp_dir (std::string &&dir) { - comp_dir_storage = std::move (dir); - comp_dir = nullptr; + m_comp_dir_storage = std::move (dir); + m_comp_dir = nullptr; } /* Fetch the compilation directory. This may return NULL in some @@ -60,48 +60,48 @@ struct file_and_directory you should call intern_comp_dir. */ const char *get_comp_dir () const { - if (!comp_dir_storage.empty ()) - return comp_dir_storage.c_str (); - return comp_dir; + if (!m_comp_dir_storage.empty ()) + return m_comp_dir_storage.c_str (); + return m_comp_dir; } /* If necessary, intern the compilation directory using OBJFILE's string cache. Returns the compilation directory. */ const char *intern_comp_dir (struct objfile *objfile) { - if (!comp_dir_storage.empty ()) + if (!m_comp_dir_storage.empty ()) { - comp_dir = objfile->intern (comp_dir_storage); - comp_dir_storage.clear (); + m_comp_dir = objfile->intern (m_comp_dir_storage); + m_comp_dir_storage.clear (); } - return comp_dir; + return m_comp_dir; } /* Fetch the filename. This never returns NULL. */ const char *get_name () const { - return name == nullptr ? "" : name; + return m_name == nullptr ? "" : m_name; } /* Set the filename. */ - void set_name (const char *name_) + void set_name (const char *name) { - name = name_; + m_name = name; } private: /* The filename. This is never NULL. */ - const char *name; + const char *m_name; /* The compilation directory. NULL if not known. If we needed to compute a new string, it will be stored in the comp_dir_storage member, and this will be NULL. Otherwise, points directly to the DW_AT_comp_dir string attribute. */ - const char *comp_dir; + const char *m_comp_dir; /* The compilation directory, if it needed to be allocated. */ - std::string comp_dir_storage; + std::string m_comp_dir_storage; }; #endif /* GDB_DWARF2_FILE_AND_DIR_H */ diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 5802fc0ef04..ff5758eb0a4 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -1537,8 +1537,8 @@ dwarf2_per_cu_data_deleter::operator() (dwarf2_per_cu_data *data) delete data; } -static file_and_directory find_file_and_directory (struct die_info *die, - struct dwarf2_cu *cu); +static file_and_directory &find_file_and_directory + (struct die_info *die, struct dwarf2_cu *cu); static const char *compute_include_file_name (const struct line_header *lh, @@ -3005,7 +3005,7 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader, lh = dwarf_decode_line_header (line_offset, cu); } - file_and_directory fnd = find_file_and_directory (comp_unit_die, cu); + file_and_directory &fnd = find_file_and_directory (comp_unit_die, cu); int offset = 0; if (fnd.is_unknown ()) @@ -6988,7 +6988,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, /* Allocate a new partial symbol table structure. */ gdb::unique_xmalloc_ptr debug_filename; static const char artificial[] = ""; - file_and_directory fnd = find_file_and_directory (comp_unit_die, cu); + file_and_directory &fnd = find_file_and_directory (comp_unit_die, cu); if (strcmp (fnd.get_name (), artificial) == 0) { debug_filename.reset (concat (artificial, "@", @@ -10474,9 +10474,12 @@ producer_is_gcc_lt_4_3 (struct dwarf2_cu *cu) return cu->producer_is_gcc_lt_4_3; } -static file_and_directory +static file_and_directory & find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu) { + if (cu->per_cu->fnd != nullptr) + return *cu->per_cu->fnd; + /* Find the filename. Do not use dwarf2_name here, since the filename is not a source language identifier. */ file_and_directory res (dwarf2_string_attr (die, DW_AT_name, cu), @@ -10488,7 +10491,8 @@ find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu) && IS_ABSOLUTE_PATH (res.get_name ())) res.set_comp_dir (ldirname (res.get_name ())); - return res; + cu->per_cu->fnd.reset (new file_and_directory (std::move (res))); + return *cu->per_cu->fnd; } /* Handle DW_AT_stmt_list for a compilation unit. @@ -10616,7 +10620,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) lowpc = highpc; lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr); - file_and_directory fnd = find_file_and_directory (die, cu); + file_and_directory &fnd = find_file_and_directory (die, cu); cu->start_symtab (fnd.get_name (), fnd.intern_comp_dir (objfile), lowpc); diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 0afcda1c3b0..2f849d5f9a1 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -180,6 +180,12 @@ struct dwarf2_per_cu_data should be private, but we can't make it private at the moment. */ mutable comp_unit_head m_header {}; + /* The file and directory for this CU. This is cached so that we + don't need to re-examine the DWO in some situations. This may be + nullptr, depending on the CU; for example a partial unit won't + have one. */ + std::unique_ptr fnd; + /* When dwarf2_per_bfd::using_index is true, the 'quick' field is active. Otherwise, the 'psymtab' field is active. */ union -- 2.31.1