From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from progateway7-pub.mail.pro1.eigbox.com (gproxy5-pub.mail.unifiedlayer.com [67.222.38.55]) by sourceware.org (Postfix) with ESMTPS id D5B1C3858D1E for ; Fri, 4 Mar 2022 23:40:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D5B1C3858D1E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com Received: from cmgw14.mail.unifiedlayer.com (unknown [10.0.90.129]) by progateway7.mail.pro1.eigbox.com (Postfix) with ESMTP id 45CBB1004756E for ; Fri, 4 Mar 2022 23:40:05 +0000 (UTC) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTP id QHWmnNhTg2s5dQHWnn4rwb; Fri, 04 Mar 2022 23:40:05 +0000 X-Authority-Reason: nr=8 X-Authority-Analysis: v=2.4 cv=BOh2EHcG c=1 sm=1 tr=0 ts=6222a355 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=o8Y5sQTvuykA:10:nop_rcvd_month_year a=Qbun_eYptAEA:10:endurance_base64_authed_username_1 a=CP83SYUPRXz5NVL8py4A:9 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version: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: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=KtPJ8slq76tyO7vIsoOs51EOzgtJNsmHx2+kyaFxCLc=; b=LDAJC1erw3IXz6X6gfuHkLq6Cj 0hT/9OcYmDnsWCizJcVvYayDNyIeeuPpBkb19Q7gURPGXKyFuw6b1UF+EoklbENr7r8gTGa1YFqj6 8LAaUbphFbRFpx3QJ2xP7w+SS; Received: from [161.98.8.2] (port=47120 helo=prentzel.ci.boulder.co.us) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nQHWm-003UZD-CP; Fri, 04 Mar 2022 16:40:04 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Use function view when iterating over block symbols Date: Fri, 4 Mar 2022 16:40:02 -0700 Message-Id: <20220304234002.5545-1-tom@tromey.com> X-Mailer: git-send-email 2.34.1 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: 161.98.8.2 X-Source-L: No X-Exim-ID: 1nQHWm-003UZD-CP X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: (prentzel.ci.boulder.co.us) [161.98.8.2]:47120 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-3030.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org 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: , X-List-Received-Date: Fri, 04 Mar 2022 23:40:08 -0000 This changes iterate_over_block_local_vars and iterate_over_block_arg_vars to take a gdb::function_view rather than a function pointer and a user-data. In one spot, this allows us to remove a helper structure and helper function. In another spot, this looked more complicated, so I changed the helper function to be an "operator()" -- also a simplification, just not as big. --- gdb/stack.c | 47 ++++++++++++++++++----------------------- gdb/stack.h | 11 ++++------ gdb/tracepoint.c | 55 ++++++++++++------------------------------------ 3 files changed, 37 insertions(+), 76 deletions(-) diff --git a/gdb/stack.c b/gdb/stack.c index fe243b4310e..d373b9fa93d 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2240,8 +2240,7 @@ backtrace_command_completer (struct cmd_list_element *ignore, static void iterate_over_block_locals (const struct block *b, - iterate_over_block_arg_local_vars_cb cb, - void *cb_data) + iterate_over_block_arg_local_vars_cb cb) { struct block_iterator iter; struct symbol *sym; @@ -2260,7 +2259,7 @@ iterate_over_block_locals (const struct block *b, break; if (sym->domain () == COMMON_BLOCK_DOMAIN) break; - (*cb) (sym->print_name (), sym, cb_data); + cb (sym->print_name (), sym); break; default: @@ -2275,12 +2274,11 @@ iterate_over_block_locals (const struct block *b, void iterate_over_block_local_vars (const struct block *block, - iterate_over_block_arg_local_vars_cb cb, - void *cb_data) + iterate_over_block_arg_local_vars_cb cb) { while (block) { - iterate_over_block_locals (block, cb, cb_data); + iterate_over_block_locals (block, cb); /* After handling the function's top-level block, stop. Don't continue to its superblock, the block of per-file symbols. */ @@ -2301,41 +2299,40 @@ struct print_variable_and_value_data int num_tabs; struct ui_file *stream; int values_printed; + + void operator() (const char *print_name, struct symbol *sym); }; /* The callback for the locals and args iterators. */ -static void -do_print_variable_and_value (const char *print_name, - struct symbol *sym, - void *cb_data) +void +print_variable_and_value_data::operator() (const char *print_name, + struct symbol *sym) { - struct print_variable_and_value_data *p - = (struct print_variable_and_value_data *) cb_data; struct frame_info *frame; - if (p->preg.has_value () - && p->preg->exec (sym->natural_name (), 0, NULL, 0) != 0) + if (preg.has_value () + && preg->exec (sym->natural_name (), 0, NULL, 0) != 0) return; - if (p->treg.has_value () - && !treg_matches_sym_type_name (*p->treg, sym)) + if (treg.has_value () + && !treg_matches_sym_type_name (*treg, sym)) return; if (language_def (sym->language ())->symbol_printing_suppressed (sym)) return; - frame = frame_find_by_id (p->frame_id); + frame = frame_find_by_id (frame_id); if (frame == NULL) { warning (_("Unable to restore previously selected frame.")); return; } - print_variable_and_value (print_name, sym, frame, p->stream, p->num_tabs); + print_variable_and_value (print_name, sym, frame, stream, num_tabs); /* print_variable_and_value invalidates FRAME. */ frame = NULL; - p->values_printed = 1; + values_printed = 1; } /* Prepares the regular expression REG from REGEXP. @@ -2404,9 +2401,7 @@ print_frame_local_vars (struct frame_info *frame, scoped_restore_selected_frame restore_selected_frame; select_frame (frame); - iterate_over_block_local_vars (block, - do_print_variable_and_value, - &cb_data); + iterate_over_block_local_vars (block, cb_data); if (!cb_data.values_printed && !quiet) { @@ -2494,8 +2489,7 @@ info_locals_command (const char *args, int from_tty) void iterate_over_block_arg_vars (const struct block *b, - iterate_over_block_arg_local_vars_cb cb, - void *cb_data) + iterate_over_block_arg_local_vars_cb cb) { struct block_iterator iter; struct symbol *sym, *sym2; @@ -2518,7 +2512,7 @@ iterate_over_block_arg_vars (const struct block *b, sym2 = lookup_symbol_search_name (sym->search_name (), b, VAR_DOMAIN).symbol; - (*cb) (sym->print_name (), sym2, cb_data); + cb (sym->print_name (), sym2); } } } @@ -2569,8 +2563,7 @@ print_frame_arg_vars (struct frame_info *frame, cb_data.stream = stream; cb_data.values_printed = 0; - iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func), - do_print_variable_and_value, &cb_data); + iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func), cb_data); /* do_print_variable_and_value invalidates FRAME. */ frame = NULL; diff --git a/gdb/stack.h b/gdb/stack.h index 97cf30cb677..c49d2e2cbef 100644 --- a/gdb/stack.h +++ b/gdb/stack.h @@ -30,17 +30,14 @@ gdb::unique_xmalloc_ptr find_frame_funname (struct frame_info *frame, enum language *funlang, struct symbol **funcp); -typedef void (*iterate_over_block_arg_local_vars_cb) (const char *print_name, - struct symbol *sym, - void *cb_data); +typedef gdb::function_view + iterate_over_block_arg_local_vars_cb; void iterate_over_block_arg_vars (const struct block *block, - iterate_over_block_arg_local_vars_cb cb, - void *cb_data); + iterate_over_block_arg_local_vars_cb cb); void iterate_over_block_local_vars (const struct block *block, - iterate_over_block_arg_local_vars_cb cb, - void *cb_data); + iterate_over_block_arg_local_vars_cb cb); /* Initialize *WHAT to be a copy of the user desired print what frame info. If !WHAT.has_value (), the printing function chooses a default set of diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 73ebc38eb80..7b2244d8a54 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1041,36 +1041,6 @@ collection_list::collect_symbol (struct symbol *sym, } } -/* Data to be passed around in the calls to the locals and args - iterators. */ - -struct add_local_symbols_data -{ - struct collection_list *collect; - struct gdbarch *gdbarch; - CORE_ADDR pc; - long frame_regno; - long frame_offset; - int count; - int trace_string; -}; - -/* The callback for the locals and args iterators. */ - -static void -do_collect_symbol (const char *print_name, - struct symbol *sym, - void *cb_data) -{ - struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data; - - p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno, - p->frame_offset, p->pc, p->trace_string); - p->count++; - - p->collect->add_wholly_collected (print_name); -} - void collection_list::add_wholly_collected (const char *print_name) { @@ -1085,15 +1055,16 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc, int trace_string) { const struct block *block; - struct add_local_symbols_data cb_data; + int count = 0; - cb_data.collect = this; - cb_data.gdbarch = gdbarch; - cb_data.pc = pc; - cb_data.frame_regno = frame_regno; - cb_data.frame_offset = frame_offset; - cb_data.count = 0; - cb_data.trace_string = trace_string; + auto do_collect_symbol = [&] (const char *print_name, + struct symbol *sym) + { + collect_symbol (sym, gdbarch, frame_regno, + frame_offset, pc, trace_string); + count++; + add_wholly_collected (print_name); + }; if (type == 'L') { @@ -1105,8 +1076,8 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc, return; } - iterate_over_block_local_vars (block, do_collect_symbol, &cb_data); - if (cb_data.count == 0) + iterate_over_block_local_vars (block, do_collect_symbol); + if (count == 0) warning (_("No locals found in scope.")); } else @@ -1119,8 +1090,8 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc, return; } - iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data); - if (cb_data.count == 0) + iterate_over_block_arg_vars (block, do_collect_symbol); + if (count == 0) warning (_("No args found in scope.")); } } -- 2.34.1