aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog25
-rw-r--r--gdb/breakpoint.c7
-rw-r--r--gdb/breakpoint.h3
-rw-r--r--gdb/cli/cli-script.c56
-rw-r--r--gdb/compile/compile.c6
-rw-r--r--gdb/compile/compile.h3
-rw-r--r--gdb/guile/guile.c5
-rw-r--r--gdb/guile/guile.h3
-rw-r--r--gdb/python/python.c5
-rw-r--r--gdb/python/python.h3
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.python/python.exp4
-rw-r--r--gdb/tracepoint.c6
-rw-r--r--gdb/tracepoint.h3
14 files changed, 98 insertions, 36 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 351dc2d..7fb64d6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,28 @@
+2018-09-17 Simon Marchi <simon.marchi@polymtl.ca>
+
+ PR python/23669
+ * breakpoint.c (commands_cmd_element): New.
+ (_initialize_breakpoint): Assign commands_cmd_element.
+ * breakpoint.h (commands_cmd_element): New.
+ * cli/cli-script.c (while_cmd_element, if_command,
+ define_cmd_element): New.
+ (command_name_equals): Remove.
+ (process_next_line): Compare commands by pointer, not by name.
+ (_initialize_cli_script): Assign the various cmd_list_element
+ variables.
+ * compile/compile.c (compile_cmd_element): New.
+ (_initialize_compile): Assign compile_cmd_element.
+ * compile/compile.h (compile_cmd_element): New.
+ * guile/guile.c (guile_cmd_element): New.
+ (install_gdb_commands): Assign guile_cmd_element.
+ * guile/guile.h (guile_cmd_element): New.
+ * python/python.c (python_cmd_element): New.
+ (_initialize_python): Assign python_cmd_element.
+ * python/python.h (python_cmd_element): New.
+ * tracepoint.c (while_stepping_cmd_element): New.
+ (_initialize_tracepoint): Assign while_stepping_cmd_element.
+ * tracepoint.h (while_stepping_cmd_element): New.
+
2018-09-17 Tom Tromey <tom@tromey.com>
* infrun.c (save_infcall_suspend_state): Return
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 85cb7d7..7591648 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -15506,6 +15506,10 @@ initialize_breakpoint_ops (void)
static struct cmd_list_element *enablebreaklist = NULL;
+/* See breakpoint.h. */
+
+cmd_list_element *commands_cmd_element = nullptr;
+
void
_initialize_breakpoint (void)
{
@@ -15531,7 +15535,8 @@ _initialize_breakpoint (void)
Set ignore-count of breakpoint number N to COUNT.\n\
Usage is `ignore N COUNT'."));
- add_com ("commands", class_breakpoint, commands_command, _("\
+ commands_cmd_element = add_com ("commands", class_breakpoint,
+ commands_command, _("\
Set commands to be executed when the given breakpoints are hit.\n\
Give a space-separated breakpoint list as argument after \"commands\".\n\
A list element can be a breakpoint number (e.g. `5') or a range of numbers\n\
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index 63cb537..66375b6 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -1679,4 +1679,7 @@ extern void maybe_print_thread_hit_breakpoint (struct ui_out *uiout);
/* Print the specified breakpoint. */
extern void print_breakpoint (breakpoint *bp);
+/* Command element for the 'commands' command. */
+extern cmd_list_element *commands_cmd_element;
+
#endif /* !defined (BREAKPOINT_H) */
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index 8496fb8..e5b0f40 100644
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -25,6 +25,7 @@
#include "ui-out.h"
#include "top.h"
#include "breakpoint.h"
+#include "tracepoint.h"
#include "cli/cli-cmds.h"
#include "cli/cli-decode.h"
#include "cli/cli-script.h"
@@ -33,6 +34,8 @@
#include "interps.h"
#include "compile/compile.h"
#include "common/gdb_string_view.h"
+#include "python/python.h"
+#include "guile/guile.h"
#include <vector>
@@ -58,6 +61,15 @@ static int command_nest_depth = 1;
/* This is to prevent certain commands being printed twice. */
static int suppress_next_print_command_trace = 0;
+/* Command element for the 'while' command. */
+static cmd_list_element *while_cmd_element = nullptr;
+
+/* Command element for the 'if' command. */
+static cmd_list_element *if_cmd_element = nullptr;
+
+/* Command element for the 'define' command. */
+static cmd_list_element *define_cmd_element = nullptr;
+
/* Structure for arguments to user defined functions. */
class user_args
@@ -906,16 +918,6 @@ read_next_line (void)
return command_line_input (prompt_ptr, "commands");
}
-/* Return true if CMD's name is NAME. */
-
-static bool
-command_name_equals (struct cmd_list_element *cmd, const char *name)
-{
- return (cmd != NULL
- && cmd != CMD_LIST_AMBIGUOUS
- && strcmp (cmd->name, name) == 0);
-}
-
/* Given an input line P, skip the command and return a pointer to the
first argument. */
@@ -990,7 +992,7 @@ process_next_line (const char *p, struct command_line **command,
/* Check for while, if, break, continue, etc and build a new
command line structure for them. */
- if (command_name_equals (cmd, "while-stepping"))
+ if (cmd == while_stepping_cmd_element)
{
/* Because validate_actionline and encode_action lookup
command's line as command, we need the line to
@@ -1005,34 +1007,28 @@ process_next_line (const char *p, struct command_line **command,
not. */
*command = build_command_line (while_stepping_control, p);
}
- else if (command_name_equals (cmd, "while"))
- {
- *command = build_command_line (while_control, line_first_arg (p));
- }
- else if (command_name_equals (cmd, "if"))
- {
- *command = build_command_line (if_control, line_first_arg (p));
- }
- else if (command_name_equals (cmd, "commands"))
- {
- *command = build_command_line (commands_control, line_first_arg (p));
- }
- else if (command_name_equals (cmd, "define"))
+ else if (cmd == while_cmd_element)
+ *command = build_command_line (while_control, line_first_arg (p));
+ else if (cmd == if_cmd_element)
+ *command = build_command_line (if_control, line_first_arg (p));
+ else if (cmd == commands_cmd_element)
+ *command = build_command_line (commands_control, line_first_arg (p));
+ else if (cmd == define_cmd_element)
*command = build_command_line (define_control, line_first_arg (p));
- else if (command_name_equals (cmd, "python") && !inline_cmd)
+ else if (cmd == python_cmd_element && !inline_cmd)
{
/* Note that we ignore the inline "python command" form
here. */
*command = build_command_line (python_control, "");
}
- else if (command_name_equals (cmd, "compile") && !inline_cmd)
+ else if (cmd == compile_cmd_element && !inline_cmd)
{
/* Note that we ignore the inline "compile command" form
here. */
*command = build_command_line (compile_control, "");
(*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE;
}
- else if (command_name_equals (cmd, "guile") && !inline_cmd)
+ else if (cmd == guile_cmd_element && !inline_cmd)
{
/* Note that we ignore the inline "guile command" form here. */
*command = build_command_line (guile_control, "");
@@ -1597,7 +1593,7 @@ _initialize_cli_script (void)
Document a user-defined command.\n\
Give command name as argument. Give documentation on following lines.\n\
End with a line of just \"end\"."));
- add_com ("define", class_support, define_command, _("\
+ define_cmd_element = add_com ("define", class_support, define_command, _("\
Define a new command name. Command name is argument.\n\
Definition appears on following lines, one command per line.\n\
End with a line of just \"end\".\n\
@@ -1606,13 +1602,13 @@ Commands defined in this way may accept an unlimited number of arguments\n\
accessed via $arg0 .. $argN. $argc tells how many arguments have\n\
been passed."));
- add_com ("while", class_support, while_command, _("\
+ while_cmd_element = add_com ("while", class_support, while_command, _("\
Execute nested commands WHILE the conditional expression is non zero.\n\
The conditional expression must follow the word `while' and must in turn be\n\
followed by a new line. The nested commands must be entered one per line,\n\
and should be terminated by the word `end'."));
- add_com ("if", class_support, if_command, _("\
+ if_cmd_element = add_com ("if", class_support, if_command, _("\
Execute nested commands once IF the conditional expression is non zero.\n\
The conditional expression must follow the word `if' and must in turn be\n\
followed by a new line. The nested commands must be entered one per line,\n\
diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index f4d2091..02c162c 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -908,14 +908,16 @@ compile_instance::compile (const char *filename, int verbose_level)
#undef FORWARD
+/* See compile.h. */
+cmd_list_element *compile_cmd_element = nullptr;
void
_initialize_compile (void)
{
struct cmd_list_element *c = NULL;
- add_prefix_cmd ("compile", class_obscure, compile_command,
- _("\
+ compile_cmd_element = add_prefix_cmd ("compile", class_obscure,
+ compile_command, _("\
Command to compile source code and inject it into the inferior."),
&compile_command_list, "compile ", 1, &cmdlist);
add_com_alias ("expression", "compile", class_obscure, 0);
diff --git a/gdb/compile/compile.h b/gdb/compile/compile.h
index 89cc00f..955f883 100644
--- a/gdb/compile/compile.h
+++ b/gdb/compile/compile.h
@@ -103,4 +103,7 @@ extern void compile_dwarf_bounds_to_c (string_file *stream,
extern void compile_print_value (struct value *val, void *data_voidp);
+/* Command element for the 'compile' command. */
+extern cmd_list_element *compile_cmd_element;
+
#endif /* GDB_COMPILE_H */
diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 95b36fe..9384e84 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -700,6 +700,9 @@ gdbscm_set_backtrace (int enable)
#endif /* HAVE_GUILE */
+/* See guile.h. */
+cmd_list_element *guile_cmd_element = nullptr;
+
/* Install the various gdb commands used by Guile. */
static void
@@ -725,7 +728,7 @@ This command is only a placeholder.")
/* Since "help guile" is easy to type, and intuitive, we add general help
in using GDB+Guile to this command. */
- add_com ("guile", class_obscure, guile_command,
+ guile_cmd_element = add_com ("guile", class_obscure, guile_command,
#ifdef HAVE_GUILE
_("\
Evaluate one or more Guile expressions.\n\
diff --git a/gdb/guile/guile.h b/gdb/guile/guile.h
index aaa0058..2faa23d 100644
--- a/gdb/guile/guile.h
+++ b/gdb/guile/guile.h
@@ -25,4 +25,7 @@
/* This is all that guile exports to gdb. */
extern const struct extension_language_defn extension_language_guile;
+/* Command element for the 'guile' command. */
+extern cmd_list_element *guile_cmd_element;
+
#endif /* GDB_GUILE_H */
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 1a0562a..c16305b 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -1745,6 +1745,9 @@ do_start_initialization ()
#endif /* HAVE_PYTHON */
+/* See python.h. */
+cmd_list_element *python_cmd_element = nullptr;
+
void
_initialize_python (void)
{
@@ -1774,7 +1777,7 @@ This command is only a placeholder.")
);
add_com_alias ("pi", "python-interactive", class_obscure, 1);
- add_com ("python", class_obscure, python_command,
+ python_cmd_element = add_com ("python", class_obscure, python_command,
#ifdef HAVE_PYTHON
_("\
Evaluate a Python command.\n\
diff --git a/gdb/python/python.h b/gdb/python/python.h
index de58fd8..4b36f83 100644
--- a/gdb/python/python.h
+++ b/gdb/python/python.h
@@ -25,4 +25,7 @@
/* This is all that python exports to gdb. */
extern const struct extension_language_defn extension_language_python;
+/* Command element for the 'python' command. */
+extern cmd_list_element *python_cmd_element;
+
#endif /* GDB_PYTHON_H */
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 02aeb04..ad74bfd 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-17 Simon Marchi <simon.marchi@polymtl.ca>
+
+ PR python/23669
+ * gdb.python/python.exp: Test gdb.execute("show commands").
+
2018-09-16 Tom Tromey <tom@tromey.com>
* gdb.base/new-ui.exp (do_execution_tests): Update.
diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp
index 1d7ea5b..a37113c 100644
--- a/gdb/testsuite/gdb.python/python.exp
+++ b/gdb/testsuite/gdb.python/python.exp
@@ -497,3 +497,7 @@ gdb_test "python print(gdb.convenience_variable('cvar3'))" "None" \
"print reset convenience variable from python"
gdb_test "print \$cvar3" "= void" \
"print reset convenience variable from CLI"
+
+# Test PR 23669, the following would invoke the "commands" command instead of
+# "show commands".
+gdb_test "python gdb.execute(\"show commands\")" "$decimal print \\\$cvar3.*"
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index bb5a850..6d964c1 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -3977,6 +3977,9 @@ static const struct internalvar_funcs sdata_funcs =
NULL
};
+/* See tracepoint.h. */
+cmd_list_element *while_stepping_cmd_element = nullptr;
+
/* module initialization */
void
_initialize_tracepoint (void)
@@ -4088,7 +4091,8 @@ Entering \"end\" on a line by itself is the normal way to terminate\n\
such a list.\n\n\
Note: the \"end\" command cannot be used at the gdb prompt."));
- add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
+ while_stepping_cmd_element = add_com ("while-stepping", class_trace,
+ while_stepping_pseudocommand, _("\
Specify single-stepping behavior at a tracepoint.\n\
Argument is number of instructions to trace in single-step mode\n\
following the tracepoint. This command is normally followed by\n\
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
index c185672..b43fbd7 100644
--- a/gdb/tracepoint.h
+++ b/gdb/tracepoint.h
@@ -436,4 +436,7 @@ extern struct traceframe_info *get_traceframe_info (void);
extern struct bp_location *get_traceframe_location (int *stepping_frame_p);
+/* Command element for the 'while-stepping' command. */
+extern cmd_list_element *while_stepping_cmd_element;
+
#endif /* TRACEPOINT_H */