From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id 6CFFB385843F for ; Mon, 1 Nov 2021 15:50:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6CFFB385843F X-ASG-Debug-ID: 1635781810-0c856e03888b8f80001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id 2ndoOYBrFtWbzYzb (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 01 Nov 2021 11:50:10 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from smarchi-efficios.internal.efficios.com (192-222-180-24.qc.cable.ebox.net [192.222.180.24]) by smtp.ebox.ca (Postfix) with ESMTP id CAD03441D64; Mon, 1 Nov 2021 11:50:10 -0400 (EDT) From: Simon Marchi X-Barracuda-RBL-IP: 192.222.180.24 X-Barracuda-Effective-Source-IP: 192-222-180-24.qc.cable.ebox.net[192.222.180.24] X-Barracuda-Apparent-Source-IP: 192.222.180.24 To: gdb-patches@sourceware.org Subject: [PATCH 1/5] gdb: pass/return setting setter/getter scalar values by value Date: Mon, 1 Nov 2021 11:50:05 -0400 X-ASG-Orig-Subj: [PATCH 1/5] gdb: pass/return setting setter/getter scalar values by value Message-Id: <20211101155009.457224-2-simon.marchi@efficios.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20211101155009.457224-1-simon.marchi@efficios.com> References: <20211101155009.457224-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1635781810 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-Scan-Msg-Size: 19208 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.93667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Spam-Status: No, score=-19.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP 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: Mon, 01 Nov 2021 15:50:20 -0000 From: Simon Marchi The getter and setter in struct setting always receive and return values by const reference. This is not necessary for scalar values (like bool and int), but more importantly it makes it a bit annoying to write a getter, you have to use a scratch static variable or something similar that you can refer to: const bool & my_getter () { static bool value; value = function_returning_bool (); return value; } Change the getter and setter function signatures to receive and return value by value instead of by reference, when the underlying data type is scalar. This means that string-based settings will still use references, but all others will be by value. The getter above would then be re-written as: bool my_getter () { return function_returning_bool (); } This is useful for a patch later in this series that defines a boolean setting with a getter and a setter. Change-Id: Ieca3a2419fcdb75a6f75948b2c920b548a0af0fd --- gdb/cli/cli-decode.c | 52 +++++++++++++-------------- gdb/command.h | 84 ++++++++++++++++++++++++++------------------ gdb/remote.c | 5 ++- 3 files changed, 80 insertions(+), 61 deletions(-) diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 27a80192c485..396aefb4b011 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -572,8 +572,8 @@ add_setshow_cmd_full (const char *name, var_types var_type, T *var, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_setting_func, - setting_getter_ftype get_setting_func, + typename the_types::set set_setting_func, + typename the_types::get get_setting_func, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, @@ -628,8 +628,8 @@ set_show_commands add_setshow_enum_cmd (const char *name, command_class theclass, const char *const *enumlist, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -682,8 +682,8 @@ set_show_commands add_setshow_auto_boolean_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -737,8 +737,8 @@ set_show_commands add_setshow_boolean_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -784,8 +784,8 @@ set_show_commands add_setshow_filename_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -833,8 +833,8 @@ set_show_commands add_setshow_string_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -883,8 +883,8 @@ set_show_commands add_setshow_string_noescape_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -933,8 +933,8 @@ set_show_commands add_setshow_optional_filename_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -1001,8 +1001,8 @@ set_show_commands add_setshow_integer_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -1050,8 +1050,8 @@ set_show_commands add_setshow_uinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -1095,8 +1095,8 @@ set_show_commands add_setshow_zinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -1137,8 +1137,8 @@ set_show_commands add_setshow_zuinteger_unlimited_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) @@ -1182,8 +1182,8 @@ set_show_commands add_setshow_zuinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list) diff --git a/gdb/command.h b/gdb/command.h index 9afe70cf66a6..ef3c52949dca 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -181,15 +181,31 @@ inline bool var_type_uses (var_types t) return t == var_enum; } -/* Function signature for a callback used to get a value from a setting. */ +template struct the_types2; template -using setting_getter_ftype = const T &(*) (); +struct the_types2 +{ + using type = T; + using set = void (*) (type); + using get = type (*) (); +}; -/* Function signature for a callback used to set a value to a setting. */ +template +struct the_types2 +{ + using type = const T &; + using set = void (*) (type); + using get = type (*) (); +}; template -using setting_setter_ftype = void (*) (const T &); +struct the_types +{ + using type = typename the_types2::value, T>::type; + using set = typename the_types2::value, T>::set; + using get = typename the_types2::value, T>::get; +}; /* Generic/type-erased function pointer. */ @@ -225,8 +241,8 @@ struct setting template static erased_args erase_args (var_types var_type, T *var, - setting_setter_ftype set_setting_func, - setting_getter_ftype get_setting_func) + typename the_types::set set_setting_func, + typename the_types::get get_setting_func) { gdb_assert (var_type_uses (var_type)); /* The getter and the setter must be both provided or both omitted. */ @@ -260,8 +276,8 @@ struct setting Type T must match the var type VAR_TYPE (see VAR_TYPE_USES). */ template setting (var_types var_type, - setting_setter_ftype setter, - setting_getter_ftype getter) + typename the_types::set setter, + typename the_types::get getter) : m_var_type (var_type) { gdb_assert (var_type_uses (var_type)); @@ -285,14 +301,14 @@ struct setting The template parameter T is the type of the variable used to store the setting. */ template - const T &get () const + typename the_types::type get () const { gdb_assert (var_type_uses (m_var_type)); if (m_var == nullptr) { gdb_assert (m_getter != nullptr); - auto getter = reinterpret_cast> (m_getter); + auto getter = reinterpret_cast::get> (m_getter); return getter (); } else @@ -322,7 +338,7 @@ struct setting if (m_var == nullptr) { gdb_assert (m_setter != nullptr); - auto setter = reinterpret_cast> (m_setter); + auto setter = reinterpret_cast::set> (m_setter); setter (v); } else @@ -644,8 +660,8 @@ extern set_show_commands add_setshow_enum_cmd extern set_show_commands add_setshow_enum_cmd (const char *name, command_class theclass, const char *const *enumlist, const char *set_doc, const char *show_doc, - const char *help_doc, setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + const char *help_doc, typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_auto_boolean_cmd @@ -657,8 +673,8 @@ extern set_show_commands add_setshow_auto_boolean_cmd extern set_show_commands add_setshow_auto_boolean_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); @@ -671,8 +687,8 @@ extern set_show_commands add_setshow_boolean_cmd extern set_show_commands add_setshow_boolean_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_filename_cmd @@ -684,8 +700,8 @@ extern set_show_commands add_setshow_filename_cmd extern set_show_commands add_setshow_filename_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_string_cmd @@ -697,8 +713,8 @@ extern set_show_commands add_setshow_string_cmd extern set_show_commands add_setshow_string_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); @@ -711,8 +727,8 @@ extern set_show_commands add_setshow_string_noescape_cmd extern set_show_commands add_setshow_string_noescape_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_optional_filename_cmd @@ -724,8 +740,8 @@ extern set_show_commands add_setshow_optional_filename_cmd extern set_show_commands add_setshow_optional_filename_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); @@ -738,8 +754,8 @@ extern set_show_commands add_setshow_integer_cmd extern set_show_commands add_setshow_integer_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_uinteger_cmd @@ -751,8 +767,8 @@ extern set_show_commands add_setshow_uinteger_cmd extern set_show_commands add_setshow_uinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_zinteger_cmd @@ -764,8 +780,8 @@ extern set_show_commands add_setshow_zinteger_cmd extern set_show_commands add_setshow_zinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_zuinteger_cmd @@ -777,8 +793,8 @@ extern set_show_commands add_setshow_zuinteger_cmd extern set_show_commands add_setshow_zuinteger_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, - setting_getter_ftype get_func, show_value_ftype *show_func, + typename the_types::set set_func, + typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); extern set_show_commands add_setshow_zuinteger_unlimited_cmd @@ -790,7 +806,7 @@ extern set_show_commands add_setshow_zuinteger_unlimited_cmd extern set_show_commands add_setshow_zuinteger_unlimited_cmd (const char *name, command_class theclass, const char *set_doc, const char *show_doc, const char *help_doc, - setting_setter_ftype set_func, setting_getter_ftype get_func, + typename the_types::set set_func, typename the_types::get get_func, show_value_ftype *show_func, cmd_list_element **set_list, cmd_list_element **show_list); diff --git a/gdb/remote.c b/gdb/remote.c index 0fb427535960..f17e571efa93 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1873,6 +1873,8 @@ struct packet_config have an associated command always have this set to auto. */ enum auto_boolean detect; + cmd_list_element *show_cmd; + /* Does the target support this packet? */ enum packet_support support; }; @@ -1936,6 +1938,7 @@ add_packet_config_cmd (struct packet_config *config, const char *name, NULL, show_remote_protocol_packet_cmd, &remote_set_cmdlist, &remote_show_cmdlist); + config->show_cmd = cmds.show; /* The command code copies the documentation strings. */ xfree (set_doc); @@ -2245,7 +2248,7 @@ show_remote_protocol_packet_cmd (struct ui_file *file, int from_tty, packet < &remote_protocol_packets[PACKET_MAX]; packet++) { - if (&packet->detect == &c->var->get ()) + if (c == packet->show_cmd) { show_packet_config_cmd (packet); return; -- 2.26.2