* [RFA 2/3] Test the convenience functions $_gdb_setting and $_gdb_int_setting.
2019-04-28 15:18 [RFA 0/3] Convenience functions $_gdb_setting/$_gdb_int_setting Philippe Waroquiers
2019-04-28 15:18 ` [RFA 3/3] NEWS and documentation for $_gdb_setting and $_gdb_int_setting Philippe Waroquiers
@ 2019-04-28 15:18 ` Philippe Waroquiers
2019-04-28 15:18 ` [RFA 1/3] Implement convenience functions to examine GDB settings Philippe Waroquiers
2 siblings, 0 replies; 5+ messages in thread
From: Philippe Waroquiers @ 2019-04-28 15:18 UTC (permalink / raw)
To: gdb-patches; +Cc: Philippe Waroquiers
---
gdb/testsuite/ChangeLog | 4 ++++
gdb/testsuite/gdb.base/default.exp | 2 ++
gdb/testsuite/gdb.base/setshow.exp | 27 ++++++++++++++++++++++++++-
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index e81409387e..4b767d95da 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -15747,3 +15747,7 @@ For older changes see ChangeLog-1993-2013.
Copyright 2014-2019 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted provided the copyright notice and this notice are preserved.
+2019-04-27 Philippe Waroquiers <philippe.waroquiers@skynet.be>
+
+ * gdb.base/setshow.exp: Test $_gdb_setting and $_gdb_int_setting.
+ * gdb.base/default.exp: Update show_conv_list.
diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp
index 56ec917aa3..dab66080a7 100644
--- a/gdb/testsuite/gdb.base/default.exp
+++ b/gdb/testsuite/gdb.base/default.exp
@@ -604,6 +604,8 @@ set show_conv_list \
{$_cimag = <internal function _cimag>} \
{$_creal = <internal function _creal>} \
{$_isvoid = <internal function _isvoid>} \
+ {$_gdb_int_setting = <internal function _gdb_int_setting>} \
+ {$_gdb_setting = <internal function _gdb_setting>} \
{$_gdb_major = 8} \
{$_gdb_minor = 4} \
}
diff --git a/gdb/testsuite/gdb.base/setshow.exp b/gdb/testsuite/gdb.base/setshow.exp
index d807d75a66..b78bea8e18 100644
--- a/gdb/testsuite/gdb.base/setshow.exp
+++ b/gdb/testsuite/gdb.base/setshow.exp
@@ -100,17 +100,23 @@ if { !$use_gdb_stub && ![target_info exists noargs] } {
gdb_test "run" "Starting program:.*foo bar blup baz bubble.*" "passing args"
}
#test set check range on
-gdb_test "set check range on" ".*" "set check range on"
+gdb_test "set check range on" ".*" "set check range on"
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"on\"" \
+ "_gdb_setting check range on"
#test show check range on
gdb_test "show check range" "Range checking is \"on\"\..*" "show check range (on)"
#test set check range off with trailing space
gdb_test_no_output "set check range off " "set check range off"
#test show check range off
gdb_test "show check range" "Range checking is \"off\"\..*" "show check range (off)"
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"off\"" \
+ "_gdb_setting check range off"
#test set check range auto
gdb_test_no_output "set check range auto" "set check range auto"
#test show check range auto
gdb_test "show check range" "Range checking is \"auto; currently .*" "show check range (auto)"
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"auto\"" \
+ "_gdb_setting check range auto"
# Test set check type on
gdb_test "set check type on" ".*" "set check type on"
@@ -118,9 +124,17 @@ gdb_test "set check type on" ".*" "set check type on"
# Test show check type on
gdb_test "show check type" "Strict type checking is on\..*" \
"show check type (on)"
+gdb_test "p \$_gdb_setting(\"check type\")" ".*\"on\"" \
+ "_gdb_setting check type on"
+gdb_test "p \$_gdb_int_setting(\"check type\")" ".*= 1" \
+ "_gdb_setting check type on 1"
# Test set check type off with trailing space
gdb_test_no_output "set check type off " "set check type off"
+gdb_test "p \$_gdb_setting(\"check type\")" ".*\"off\"" \
+ "_gdb_setting check type off"
+gdb_test "p \$_gdb_int_setting(\"check type\")" ".*= 0" \
+ "_gdb_setting check type off 0"
# Test show check type off
gdb_test "show check type" "Strict type checking is off\..*" \
@@ -159,9 +173,17 @@ gdb_test "show environment FOOBARBAZ" "FOOBARBAZ = grbxgrbxgrbx.*" "show enviro
gdb_test_no_output "set height 100" "set height 100"
#test show height 100
gdb_test "show height" "Number of lines gdb thinks are in a page is 100..*" "show height"
+gdb_test "p \$_gdb_setting(\"height\")" ".*\"100\"" \
+ "_gdb_setting height 100"
+gdb_test "p \$_gdb_int_setting(\"height\")" ".*= 100" \
+ "_gdb_int_setting height 100"
# Back to infinite height to avoid pagers. While at it, check that
# literal "unlimited" works just as well as 0.
gdb_test_no_output "set height unlimited"
+gdb_test "p \$_gdb_setting(\"height\")" ".*\"unlimited\"" \
+ "_gdb_setting height unlimited"
+gdb_test "p \$_gdb_int_setting(\"height\")" ".*= 0" \
+ "_gdb_int_setting height unlimited"
#test set history expansion on
gdb_test_no_output "set history expansion on" "set history expansion on"
#test show history expansion on
@@ -182,6 +204,9 @@ gdb_test_no_output "set history filename ~/foobar.baz" \
gdb_test "show history filename" \
"The filename in which to record the command history is \"[string_to_regexp $HOME]/foobar.baz\"..*" \
"show history filename (~/foobar.baz)"
+gdb_test "p \$_gdb_setting(\"history filename\")" \
+ ".*\"[string_to_regexp $HOME]/foobar.baz\"..*" \
+ "_gdb_setting history filename"
#get current working directory
set PWD ""
set test "show working directory"
--
2.20.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFA 1/3] Implement convenience functions to examine GDB settings.
2019-04-28 15:18 [RFA 0/3] Convenience functions $_gdb_setting/$_gdb_int_setting Philippe Waroquiers
2019-04-28 15:18 ` [RFA 3/3] NEWS and documentation for $_gdb_setting and $_gdb_int_setting Philippe Waroquiers
2019-04-28 15:18 ` [RFA 2/3] Test the convenience functions " Philippe Waroquiers
@ 2019-04-28 15:18 ` Philippe Waroquiers
2 siblings, 0 replies; 5+ messages in thread
From: Philippe Waroquiers @ 2019-04-28 15:18 UTC (permalink / raw)
To: gdb-patches; +Cc: Philippe Waroquiers
The new convenience functions $_gdb_setting and $_gdb_int_setting
provide access to the GDB settings in user-defined commands.
---
gdb/ChangeLog | 10 ++++
gdb/cli/cli-cmds.c | 105 ++++++++++++++++++++++++++++++++++++++++++
gdb/cli/cli-setshow.c | 71 +++++++++++++++-------------
gdb/cli/cli-setshow.h | 5 ++
4 files changed, 158 insertions(+), 33 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4f595922f6..4835c6fae5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -6023,3 +6023,13 @@ version-control: never
coding: utf-8
End:
+2019-04-28 Philippe Waroquiers <philippe.waroquiers@skynet.be>
+
+ * cli/cli-cmds.c (setting_cmd, gdb_int_setting_internal_fn,
+ gdb_setting_internal_fn): New functions.
+ (_initialize_cli_cmds): Define the new convenience functions.
+ * cli/cli-setshow.h (do_print_setting): New declaration.
+ * cli/cli-setshow.c (do_print_setting): New function (mostly
+ copied from do_show_command).
+ (do_show_command): Call do_print_setting.
+ (do_print_setting): New function.
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 5f3b973f06..b1498452ba 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1664,6 +1664,100 @@ show_max_user_call_depth (struct ui_file *file, int from_tty,
value);
}
+/* Returns the cmd_list_element corresponding to the first argument
+ of ARGV, which must contain one single value.
+ Throws an error if no value provided, or value not correct.
+ FNNAME is used in the error message. */
+
+static cmd_list_element *
+setting_cmd (const char *fnname, int argc, struct value **argv)
+{
+ if (argc == 0)
+ error (_("You must provide an argument to %s"), fnname);
+ if (argc != 1)
+ error (_("You can only provide one argument to %s"), fnname);
+
+ struct type *type0 = check_typedef (value_type (argv[0]));
+
+ if (TYPE_CODE (type0) != TYPE_CODE_ARRAY
+ && TYPE_CODE (type0) != TYPE_CODE_STRING)
+ error (_("First argument of %s must be a string."), fnname);
+
+ int len0 = TYPE_LENGTH (type0);
+ std::vector<char> arg0 (len0);
+
+ memcpy (arg0.data (), value_contents (argv[0]), len0);
+
+ const char *a0 = arg0.data ();
+ cmd_list_element *cmd = lookup_cmd (&a0, showlist, "", -1, 0);
+
+ if (cmd == nullptr || cmd_type (cmd) != show_cmd)
+ error (_("First argument of %s must be a "
+ "valid setting of the 'show' command."), fnname);
+
+ return cmd;
+}
+
+/* Implementation of the convenience function $_gdb_int_setting. */
+
+static struct value *
+gdb_int_setting_internal_fn (struct gdbarch *gdbarch,
+ const struct language_defn *language,
+ void *cookie, int argc, struct value **argv)
+{
+ cmd_list_element *cmd = setting_cmd ("$_gdb_int_setting", argc, argv);
+
+ switch (cmd->var_type)
+ {
+ case var_boolean:
+ case var_integer:
+ case var_zinteger:
+ case var_zuinteger_unlimited:
+ return value_from_longest (builtin_type (gdbarch)->builtin_int,
+ *(int *) cmd->var);
+ case var_auto_boolean:
+ {
+ int val = *(int *) cmd->var;
+
+ if (val == 0)
+ val = 1;
+ else if (val == 1)
+ val = 0;
+ return value_from_longest (builtin_type (gdbarch)->builtin_int,
+ val);
+ }
+ case var_uinteger:
+ if (*(unsigned int *) cmd->var == UINT_MAX)
+ return value_from_longest (builtin_type (gdbarch)->builtin_int,
+ 0);
+ else
+ return value_from_longest (builtin_type (gdbarch)->builtin_int,
+ *(unsigned int *) cmd->var);
+ case var_zuinteger:
+ return value_from_longest (builtin_type (gdbarch)->builtin_int,
+ *(unsigned int *) cmd->var);
+ default:
+ error (_("Setting type not convertible to integer"));
+ }
+}
+
+/* Implementation of the convenience function $_gdb_setting. */
+
+static struct value *
+gdb_setting_internal_fn (struct gdbarch *gdbarch,
+ const struct language_defn *language,
+ void *cookie, int argc, struct value **argv)
+{
+ cmd_list_element *cmd = setting_cmd ("$_gdb_setting", argc, argv);
+ string_file stb;
+
+ do_print_setting (&stb, cmd);
+
+ return value_cstring (stb.c_str (), strlen (stb.c_str ()),
+ builtin_type (gdbarch)->builtin_char);
+}
+
+
void
_initialize_cli_cmds (void)
{
@@ -1787,6 +1881,17 @@ Generic command for showing things about the debugger."),
/* Another way to get at the same thing. */
add_info ("set", show_command, _("Show all GDB settings."));
+ add_internal_function ("_gdb_setting", _("\
+$_gdb_setting - returns the value of a GDB setting as a string.\n\
+Usage: $_gdb_setting (setting)"),
+ gdb_setting_internal_fn, NULL);
+
+ add_internal_function ("_gdb_int_setting", _("\
+$_gdb_int_setting - returns the value of an integer GDB setting as an integer.\n\
+Usage: $_int_gdb_int_setting (setting)\n\
+Throws an error if SETTING cannot be converted to an integer."),
+ gdb_int_setting_internal_fn, NULL);
+
add_cmd ("commands", no_set_class, show_commands, _("\
Show the history of commands you typed.\n\
You can supply a command number to start with, or a `+' to start after\n\
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index 5b87f905d0..eac5d48ea3 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -551,55 +551,42 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
}
}
-/* Do a "show" command. ARG is NULL if no argument, or the
- text of the argument, and FROM_TTY is nonzero if this command is
- being entered directly by the user (i.e. these are just like any
- other command). C is the command list element for the command. */
+/* See cli-setshow.h. */
void
-do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
+do_print_setting (string_file *stb, struct cmd_list_element *c)
{
- struct ui_out *uiout = current_uiout;
-
- gdb_assert (c->type == show_cmd);
-
- string_file stb;
-
- /* Possibly call the pre hook. */
- if (c->pre_show_hook)
- (c->pre_show_hook) (c);
-
switch (c->var_type)
{
case var_string:
if (*(char **) c->var)
- stb.putstr (*(char **) c->var, '"');
+ stb->putstr (*(char **) c->var, '"');
break;
case var_string_noescape:
case var_optional_filename:
case var_filename:
case var_enum:
if (*(char **) c->var)
- stb.puts (*(char **) c->var);
+ stb->puts (*(char **) c->var);
break;
case var_boolean:
- stb.puts (*(int *) c->var ? "on" : "off");
+ stb->puts (*(int *) c->var ? "on" : "off");
break;
case var_auto_boolean:
switch (*(enum auto_boolean*) c->var)
{
case AUTO_BOOLEAN_TRUE:
- stb.puts ("on");
+ stb->puts ("on");
break;
case AUTO_BOOLEAN_FALSE:
- stb.puts ("off");
+ stb->puts ("off");
break;
case AUTO_BOOLEAN_AUTO:
- stb.puts ("auto");
+ stb->puts ("auto");
break;
default:
internal_error (__FILE__, __LINE__,
- _("do_show_command: "
+ _("do_print_setting: "
"invalid var_auto_boolean"));
break;
}
@@ -608,35 +595,53 @@ do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
case var_zuinteger:
if (c->var_type == var_uinteger
&& *(unsigned int *) c->var == UINT_MAX)
- stb.puts ("unlimited");
+ stb->puts ("unlimited");
else
- stb.printf ("%u", *(unsigned int *) c->var);
+ stb->printf ("%u", *(unsigned int *) c->var);
break;
case var_integer:
case var_zinteger:
if (c->var_type == var_integer
&& *(int *) c->var == INT_MAX)
- stb.puts ("unlimited");
+ stb->puts ("unlimited");
else
- stb.printf ("%d", *(int *) c->var);
+ stb->printf ("%d", *(int *) c->var);
break;
case var_zuinteger_unlimited:
{
if (*(int *) c->var == -1)
- stb.puts ("unlimited");
+ stb->puts ("unlimited");
else
- stb.printf ("%d", *(int *) c->var);
+ stb->printf ("%d", *(int *) c->var);
}
break;
default:
- error (_("gdb internal error: bad var_type in do_show_command"));
+ error (_("gdb internal error: bad var_type in do_print_setting"));
}
+}
+
+/* Do a "show" command. ARG is NULL if no argument, or the
+ text of the argument, and FROM_TTY is nonzero if this command is
+ being entered directly by the user (i.e. these are just like any
+ other command). C is the command list element for the command. */
+
+void
+do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
+{
+ struct ui_out *uiout = current_uiout;
+
+ gdb_assert (c->type == show_cmd);
+
+ string_file stb;
+
+ /* Possibly call the pre hook. */
+ if (c->pre_show_hook)
+ (c->pre_show_hook) (c);
+ do_print_setting (&stb, c);
- /* FIXME: cagney/2005-02-10: Need to split this in half: code to
- convert the value into a string (esentially the above); and
- code to print the value out. For the latter there should be
- MI and CLI specific versions. */
+ /* FIXME: cagney/2005-02-10: For code to print the value out,
+ there should be MI and CLI specific versions. */
if (uiout->is_mi_like_p ())
uiout->field_stream ("value", stb);
diff --git a/gdb/cli/cli-setshow.h b/gdb/cli/cli-setshow.h
index e4d13c3510..27ef5ea387 100644
--- a/gdb/cli/cli-setshow.h
+++ b/gdb/cli/cli-setshow.h
@@ -31,4 +31,9 @@ extern void do_show_command (const char *arg, int from_tty,
extern void cmd_show_list (struct cmd_list_element *list, int from_tty,
const char *prefix);
+/* Prints in STB the current value of the GDB setting shown by C. */
+
+void
+do_print_setting (string_file *stb, struct cmd_list_element *c);
+
#endif /* CLI_CLI_SETSHOW_H */
--
2.20.1
^ permalink raw reply [flat|nested] 5+ messages in thread