From patchwork Sun Oct 29 23:23:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 78721 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F2BB73831E0B for ; Sun, 29 Oct 2023 23:25:18 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from omta40.uswest2.a.cloudfilter.net (omta40.uswest2.a.cloudfilter.net [35.89.44.39]) by sourceware.org (Postfix) with ESMTPS id ED9BB386193E for ; Sun, 29 Oct 2023 23:23:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org ED9BB386193E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org ED9BB386193E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=35.89.44.39 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698621799; cv=none; b=wdNzEe6LSF+uWrAMfAzDi589LdtviSU5xzEh+2b0L6FI1TXWbQUo7kKaOob+1wKczeEU+nhI7dTfgFakViU54G8K564DipoabEOwuTsDdW/PrlbOGXZehZ06iSc9PWQg8t5TolJ6SGwfGNtlcJjwBzl4ZZslNlapeBCNnt4Hyxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698621799; c=relaxed/simple; bh=6AeLPtcnSkRylJqPVYinQRiFf6nS5D1sNhOurjzjth8=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=nZ3p6/vAbXH2x6zXoFQVKKQK2OJAjgIRKI1pNN+AITFqu0XLw1e/utuWdqO7X5gAA9tNiPtTYPFTs73vAMh1r4t1lG8AsnDyzx9U2gS1GOmpPAmzx5MSqkv8zdPkofrxhUY+jCqac6qfAQdptnJWTtkIK0YIUN9GlUWjA0RS3OI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from eig-obgw-5006a.ext.cloudfilter.net ([10.0.29.179]) by cmsmtp with ESMTPS id wv5vqrgFQL9AgxF7dqdPrP; Sun, 29 Oct 2023 23:23:10 +0000 Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTPS id xF7dq9c59ULW5xF7dqS5hM; Sun, 29 Oct 2023 23:23:09 +0000 X-Authority-Analysis: v=2.4 cv=Yusc+qUX c=1 sm=1 tr=0 ts=653ee95d a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=OWjo9vPv0XrRhIrVQ50Ab3nP57M=:19 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=IkcTkHD0fZMA:10 a=bhdUkHdE2iEA:10 a=Qbun_eYptAEA:10 a=GHsAFHNieQwiKhYbefIA:9 a=QEXdDO2ut3YA:10 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:Sender:Reply-To:Cc: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=8mFwO+WaSa20YyvLiYG4GBItKcGM/sfAOa6M20Zm4mk=; b=bxVykPSkV7cfEh/+TfZIF+LbOW H18x+XlWkG1z0AhetpWzARN3uO4BN3Bbh6/eLibJerb3NK7iqCDCqS4nhZNZykuAGgkx1L51W2KyT 8xe78H/K/vIGPJn2xcZvIxE8n; Received: from 97-122-77-73.hlrn.qwest.net ([97.122.77.73]:56344 helo=[192.168.0.21]) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.2) (envelope-from ) id 1qxF7d-0042zY-08 for gdb-patches@sourceware.org; Sun, 29 Oct 2023 17:23:09 -0600 From: Tom Tromey Date: Sun, 29 Oct 2023 17:23:44 -0600 Subject: [PATCH 23/30] Use read_var_value overload in Guile MIME-Version: 1.0 Message-Id: <20231029-split-objfile-2023-bound-sym-october-v1-23-612531df2734@tromey.com> References: <20231029-split-objfile-2023-bound-sym-october-v1-0-612531df2734@tromey.com> In-Reply-To: <20231029-split-objfile-2023-bound-sym-october-v1-0-612531df2734@tromey.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.4 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.77.73 X-Source-L: No X-Exim-ID: 1qxF7d-0042zY-08 X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-77-73.hlrn.qwest.net ([192.168.0.21]) [97.122.77.73]:56344 X-Source-Auth: tom+tromey.com X-Email-Count: 24 X-Org: HG=bhshared;ORG=bluehost; X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-CMAE-Envelope: MS4xfJyoyZ9vJXvcJWkuQ3Gj09kgxHigO0dtKJcFrbCIe/TZab4uj9+d1Bki2b62IYUk/WmVF+M9ccv2YGI+nZR/B8i2MiduOvaIXV2fS8rtm1hl/LD2wmPv WOiImzlgUAtULBShrsm5/gkeVto4XZ9m5vSMP0MVG/YMpk5pof2uK1kEjSxTrwYaBqFDKThuR39pCNvUTpIhT76fsOFJn3vhD7I= X-Spam-Status: No, score=-3024.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, JMQ_SPF_NEUTRAL, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org This changes the Guile layer to store a block_symbol in its symbol wrapper, and then to use the new read_var_value overload. --- gdb/guile/guile-internal.h | 2 +- gdb/guile/scm-block.c | 6 ++-- gdb/guile/scm-frame.c | 9 +++--- gdb/guile/scm-symbol.c | 78 ++++++++++++++++++++++------------------------ 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/gdb/guile/guile-internal.h b/gdb/guile/guile-internal.h index c0f1410ed7c..e8b59c160cc 100644 --- a/gdb/guile/guile-internal.h +++ b/gdb/guile/guile-internal.h @@ -538,7 +538,7 @@ extern SCM gdbscm_scm_from_host_string (const char *string, size_t len); extern int syscm_is_symbol (SCM scm); -extern SCM syscm_scm_from_symbol (struct symbol *symbol); +extern SCM syscm_scm_from_symbol (block_symbol symbol); extern struct symbol *syscm_get_valid_symbol_arg_unsafe (SCM self, int arg_pos, const char *func_name); diff --git a/gdb/guile/scm-block.c b/gdb/guile/scm-block.c index 02b7a48be37..4293a13b81b 100644 --- a/gdb/guile/scm-block.c +++ b/gdb/guile/scm-block.c @@ -406,7 +406,7 @@ gdbscm_block_function (SCM self) sym = block->function (); if (sym != NULL) - return syscm_scm_from_symbol (sym); + return syscm_scm_from_symbol ({ sym, block }); return SCM_BOOL_F; } @@ -507,7 +507,7 @@ gdbscm_block_symbols (SCM self) for (struct symbol *sym : block_iterator_range (block)) { - SCM s_scm = syscm_scm_from_symbol (sym); + SCM s_scm = syscm_scm_from_symbol ({ sym, block }); result = scm_cons (s_scm, result); } @@ -658,7 +658,7 @@ gdbscm_block_next_symbol_x (SCM self) if (sym == NULL) return gdbscm_end_of_iteration (); - return syscm_scm_from_symbol (sym); + return syscm_scm_from_symbol ({ sym, block }); } /* (lookup-block address) -> diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c index 74012ffea4f..62a28a39bcf 100644 --- a/gdb/guile/scm-frame.c +++ b/gdb/guile/scm-frame.c @@ -654,7 +654,7 @@ static SCM gdbscm_frame_function (SCM self) { frame_smob *f_smob; - struct symbol *sym = NULL; + block_symbol sym = {}; bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); @@ -666,7 +666,7 @@ gdbscm_frame_function (SCM self) if (frame != NULL) { found = true; - sym = find_pc_function (get_frame_address_in_block (frame)).symbol; + sym = find_pc_function (get_frame_address_in_block (frame)); } } catch (const gdb_exception &except) @@ -681,7 +681,7 @@ gdbscm_frame_function (SCM self) _("")); } - if (sym != NULL) + if (sym.symbol != nullptr) return syscm_scm_from_symbol (sym); return SCM_BOOL_F; @@ -962,7 +962,8 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) try { - value = read_var_value (var, block, frame_info_ptr (frame)); + // FIXME + value = read_var_value ({ var, block }, frame_info_ptr (frame)); } catch (const gdb_exception &except) { diff --git a/gdb/guile/scm-symbol.c b/gdb/guile/scm-symbol.c index 1619705f065..f7fc3123dcd 100644 --- a/gdb/guile/scm-symbol.c +++ b/gdb/guile/scm-symbol.c @@ -36,7 +36,7 @@ struct symbol_smob eqable_gdb_smob base; /* The GDB symbol structure this smob is wrapping. */ - struct symbol *symbol; + block_symbol symbol; }; static const char symbol_smob_name[] = "gdb:symbol"; @@ -64,7 +64,7 @@ struct syscm_deleter { symbol_smob *s_smob = (symbol_smob *) *slot; - s_smob->symbol = NULL; + s_smob->symbol = {}; return 1; } @@ -96,7 +96,7 @@ syscm_hash_symbol_smob (const void *p) { const symbol_smob *s_smob = (const symbol_smob *) p; - return htab_hash_pointer (s_smob->symbol); + return htab_hash_pointer (s_smob->symbol.symbol); } /* Helper function to compute equality of symbol_smobs. */ @@ -107,8 +107,8 @@ syscm_eq_symbol_smob (const void *ap, const void *bp) const symbol_smob *a = (const symbol_smob *) ap; const symbol_smob *b = (const symbol_smob *) bp; - return (a->symbol == b->symbol - && a->symbol != NULL); + return (a->symbol.symbol == b->symbol.symbol + && a->symbol.symbol != nullptr); } /* Return the struct symbol pointer -> SCM mapping table. @@ -156,15 +156,15 @@ syscm_free_symbol_smob (SCM self) { symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self); - if (s_smob->symbol != NULL) + if (s_smob->symbol.symbol != nullptr) { - htab_t htab = syscm_get_symbol_map (s_smob->symbol); + htab_t htab = syscm_get_symbol_map (s_smob->symbol.symbol); gdbscm_clear_eqable_gsmob_ptr_slot (htab, &s_smob->base); } /* Not necessary, done to catch bugs. */ - s_smob->symbol = NULL; + s_smob->symbol = {}; return 0; } @@ -179,8 +179,8 @@ syscm_print_symbol_smob (SCM self, SCM port, scm_print_state *pstate) if (pstate->writingp) gdbscm_printf (port, "#<%s ", symbol_smob_name); gdbscm_printf (port, "%s", - s_smob->symbol != NULL - ? s_smob->symbol->print_name () + s_smob->symbol.symbol != nullptr + ? s_smob->symbol.symbol->print_name () : ""); if (pstate->writingp) scm_puts (">", port); @@ -200,7 +200,7 @@ syscm_make_symbol_smob (void) scm_gc_malloc (sizeof (symbol_smob), symbol_smob_name); SCM s_scm; - s_smob->symbol = NULL; + s_smob->symbol.symbol = {}; s_scm = scm_new_smob (symbol_smob_tag, (scm_t_bits) s_smob); gdbscm_init_eqable_gsmob (&s_smob->base, s_scm); @@ -227,7 +227,7 @@ gdbscm_symbol_p (SCM scm) object. */ SCM -syscm_scm_from_symbol (struct symbol *symbol) +syscm_scm_from_symbol (block_symbol symbol) { htab_t htab; eqable_gdb_smob **slot; @@ -236,7 +236,7 @@ syscm_scm_from_symbol (struct symbol *symbol) /* If we've already created a gsmob for this symbol, return it. This makes symbols eq?-able. */ - htab = syscm_get_symbol_map (symbol); + htab = syscm_get_symbol_map (symbol.symbol); s_smob_for_lookup.symbol = symbol; slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &s_smob_for_lookup.base); if (*slot != NULL) @@ -279,7 +279,7 @@ syscm_get_symbol_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name) static int syscm_is_valid (symbol_smob *s_smob) { - return s_smob->symbol != NULL; + return s_smob->symbol.symbol != nullptr; } /* Throw a Scheme error if SELF is not a valid symbol smob. @@ -311,7 +311,7 @@ syscm_get_valid_symbol_arg_unsafe (SCM self, int arg_pos, symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, arg_pos, func_name); - return s_smob->symbol; + return s_smob->symbol.symbol; } @@ -337,7 +337,7 @@ gdbscm_symbol_type (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; if (symbol->type () == NULL) return SCM_BOOL_F; @@ -354,7 +354,7 @@ gdbscm_symbol_symtab (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; if (!symbol->is_objfile_owned ()) return SCM_BOOL_F; @@ -368,7 +368,7 @@ gdbscm_symbol_name (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return gdbscm_scm_from_c_string (symbol->natural_name ()); } @@ -380,7 +380,7 @@ gdbscm_symbol_linkage_name (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return gdbscm_scm_from_c_string (symbol->linkage_name ()); } @@ -392,7 +392,7 @@ gdbscm_symbol_print_name (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return gdbscm_scm_from_c_string (symbol->print_name ()); } @@ -404,7 +404,7 @@ gdbscm_symbol_addr_class (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return scm_from_int (symbol->aclass ()); } @@ -416,7 +416,7 @@ gdbscm_symbol_argument_p (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return scm_from_bool (symbol->is_argument ()); } @@ -428,7 +428,7 @@ gdbscm_symbol_constant_p (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; enum address_class theclass; theclass = symbol->aclass (); @@ -443,7 +443,7 @@ gdbscm_symbol_function_p (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; enum address_class theclass; theclass = symbol->aclass (); @@ -458,7 +458,7 @@ gdbscm_symbol_variable_p (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; enum address_class theclass; theclass = symbol->aclass (); @@ -477,7 +477,7 @@ gdbscm_symbol_needs_frame_p (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - struct symbol *symbol = s_smob->symbol; + struct symbol *symbol = s_smob->symbol.symbol; int result = 0; gdbscm_gdb_exception exc {}; @@ -502,7 +502,7 @@ gdbscm_symbol_line (SCM self) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - const struct symbol *symbol = s_smob->symbol; + const struct symbol *symbol = s_smob->symbol.symbol; return scm_from_int (symbol->line ()); } @@ -515,7 +515,7 @@ gdbscm_symbol_value (SCM self, SCM rest) { symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - struct symbol *symbol = s_smob->symbol; + block_symbol symbol = s_smob->symbol; SCM keywords[] = { frame_keyword, SCM_BOOL_F }; int frame_pos = -1; SCM frame_scm = SCM_BOOL_F; @@ -527,7 +527,7 @@ gdbscm_symbol_value (SCM self, SCM rest) if (!gdbscm_is_false (frame_scm)) f_smob = frscm_get_frame_smob_arg_unsafe (frame_scm, frame_pos, FUNC_NAME); - if (symbol->aclass () == LOC_TYPEDEF) + if (symbol.symbol->aclass () == LOC_TYPEDEF) { gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self, _("cannot get the value of a typedef")); @@ -545,14 +545,10 @@ gdbscm_symbol_value (SCM self, SCM rest) error (_("Invalid frame")); } - if (symbol_read_needs_frame (symbol) && frame_info == NULL) + if (symbol_read_needs_frame (symbol.symbol) && frame_info == nullptr) error (_("Symbol requires a frame to compute its value")); - /* TODO: currently, we have no way to recover the block in which SYMBOL - was found, so we have no block to pass to read_var_value. This will - yield an incorrect value when symbol is not local to FRAME_INFO (this - can happen with nested functions). */ - value = read_var_value (symbol, NULL, frame_info); + value = read_var_value (symbol, frame_info); } catch (const gdb_exception &except) { @@ -578,7 +574,7 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) int domain = VAR_DOMAIN; int block_arg_pos = -1, domain_arg_pos = -1; struct field_of_this_result is_a_field_of_this; - struct symbol *symbol = NULL; + block_symbol symbol = {}; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi", name_scm, &name, rest, @@ -618,7 +614,7 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) try { symbol = lookup_symbol (name, block, (domain_enum) domain, - &is_a_field_of_this).symbol; + &is_a_field_of_this); } catch (const gdb_exception &ex) { @@ -628,7 +624,7 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) xfree (name); GDBSCM_HANDLE_GDB_EXCEPTION (except); - if (symbol == NULL) + if (symbol.symbol == nullptr) return SCM_BOOL_F; return scm_list_2 (syscm_scm_from_symbol (symbol), @@ -645,7 +641,7 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest) SCM keywords[] = { domain_keyword, SCM_BOOL_F }; int domain_arg_pos = -1; int domain = VAR_DOMAIN; - struct symbol *symbol = NULL; + block_symbol symbol = {}; gdbscm_gdb_exception except {}; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i", @@ -654,7 +650,7 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest) try { - symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol; + symbol = lookup_global_symbol (name, NULL, (domain_enum) domain); } catch (const gdb_exception &ex) { @@ -664,7 +660,7 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest) xfree (name); GDBSCM_HANDLE_GDB_EXCEPTION (except); - if (symbol == NULL) + if (symbol.symbol == nullptr) return SCM_BOOL_F; return syscm_scm_from_symbol (symbol);