6f937416b9
This is sort of a continuation of Keith's parse_exp_1 constification patch. It started out by undoing these bits: @@ -754,9 +754,12 @@ validate_actionline (char **line, struct tmp_p = p; for (loc = t->base.loc; loc; loc = loc->next) { - p = tmp_p; - exp = parse_exp_1 (&p, loc->address, + const char *q; + + q = tmp_p; + exp = parse_exp_1 (&q, loc->address, block_for_pc (loc->address), 1); + p = (char *) q; and progressively making more things const upwards, fixing fallout, rinse repeat, until GDB built again (--enable-targets=all). That ended up constifying lookup_cmd/add_cmd and (lots of) friends, and the completers. I didn't try to constify the command hooks themselves, because I know upfront there are commands that write to the command string argument, and I think I managed to stop at a nice non-hacky split point already. I think the only non-really-super-obvious changes are tracepoint.c:validate_actionline, and tracepoint.c:trace_dump_actions. The rest is just mostly about 'char *' => 'const char *', 'char **'=> 'const char **', and the occasional (e.g., deprecated_cmd_warning) case of 'char **'=> 'const char *', where/when I noticed that nothing actually cares about the pointer to pointer output. Tested on x86_64 Fedora 17, native and gdbserver. gdb/ 2013-03-13 Pedro Alves <palves@redhat.com> * ada-lang.c (struct add_partial_datum) <text, text0, word>: Make fields const. (ada_make_symbol_completion_list): Make "text0" parameter const. * ax-gdb.c (agent_eval_command_one): Make "exp" parameter const. * breakpoint.c (condition_completer): Make "text" and "word" parameters const. Adjust. (check_tracepoint_command): Adjust to validate_actionline prototype change. (catch_syscall_completer): Make "text" and "word" parameters const. * cli/cli-cmds.c (show_user): Make "comname" local const. (valid_command_p): Make "command" parameter const. (alias_command): Make "alias_prefix" and "command_prefix" locals const. * cli/cli-decode.c (add_cmd): Make "name" parameter const. (add_alias_cmd): Make "name" and "oldname" parameters const. Adjust. No longer make copy of OLDNAME. (add_prefix_cmd, add_abbrev_prefix_cmd, add_set_or_show_cmd) (add_setshow_cmd_full, add_setshow_enum_cmd) (add_setshow_auto_boolean_cmd, add_setshow_boolean_cmd) (add_setshow_filename_cmd, add_setshow_string_cmd) (add_setshow_string_noescape_cmd) (add_setshow_optional_filename_cmd, add_setshow_integer_cmd) (add_setshow_uinteger_cmd, add_setshow_zinteger_cmd) (add_setshow_zuinteger_unlimited_cmd, add_setshow_zuinteger_cmd) (delete_cmd, add_info, add_info_alias, add_com, add_com_alias): Make "name" parameter const. (help_cmd): Rename "command" parameter to "arg". New const local "command". (find_cmd): Make "command" parameter const. (lookup_cmd_1): Make "text" parameter pointer to const. Adjust to deprecated_cmd_warning prototype change. (undef_cmd_error): Make "cmdtype" parameter const. (lookup_cmd): Make "line" parameter const. (deprecated_cmd_warning): Change type of "text" parameter to pointer to const char, from pointer to pointer to char. Adjust. (lookup_cmd_composition): Make "text" parameter const. (complete_on_cmdlist, complete_on_enum): Make "text" and "word" parameters const. * cli/cli-decode.h (struct cmd_list_element) <name>: Make field const. * cli/cli-script.c (validate_comname): Make "tem" local const. (define_command): New const local "tem_c". Use it in calls to lookup_cmd. (document_command): Make "tem" and "comfull" locals const. (show_user_1): Make "prefix" and "name" parameters const. * cli-script.h (show_user_1): Make "prefix" and "name" parameters const. * command.h (add_cmd, add_alias_cmd, add_prefix_cmd) (add_abbrev_prefix_cmd, completer_ftype, lookup_cmd, lookup_cmd_1) (deprecated_cmd_warning, lookup_cmd_composition, add_com) (add_com_alias, add_info, add_info_alias, complete_on_cmdlist) (complete_on_enum, add_setshow_enum_cmd) (add_setshow_auto_boolean_cmd, add_setshow_boolean_cmd) (add_setshow_filename_cmd, add_setshow_string_cmd) (add_setshow_string_noescape_cmd) (add_setshow_optional_filename_cmd, add_setshow_integer_cmd) (add_setshow_uinteger_cmd, add_setshow_zinteger_cmd) (add_setshow_zuinteger_cmd, add_setshow_zuinteger_unlimited_cmd): Change prototypes, constifying strings. * completer.c (noop_completer, filename_completer): Make "text" and "prefix" parameters const. (location_completer, expression_completer) (complete_line_internal): Make "text" and "prefix" parameters const and adjust. (command_completer, signal_completer): Make "text" and "prefix" parameters const. * completer.h (noop_completer, filename_completer) (expression_completer, location_completer, command_completer) (signal_completer): Change prototypes. * corefile.c (complete_set_gnutarget): Make "text" and "word" parameters const. * cp-abi.c (cp_abi_completer): Likewise. * expression.h (parse_expression_for_completion): Change prototype. * f-lang.c (f_make_symbol_completion_list): Make "text" and "word" parameters const. * infcmd.c (_initialize_infcmd): Make "cmd_name" local const. * infrun.c (handle_completer): Make "text" and "word" parameters const. * interps.c (interpreter_completer): Make "text" and "word" parameters const. * language.h (struct language_defn) <la_make_symbol_completion_list>: Make "text" and "word" parameters const. * parse.c (parse_exp_1): Move const hack to parse_exp_in_context. (parse_exp_in_context): Rename to ... (parse_exp_in_context_1): ... this. (parse_exp_in_context): Reimplement, with const hack from parse_exp_1. (parse_expression_for_completion): Make "string" parameter const. * printcmd.c (decode_format): Make "string_ptr" parameter pointer to pointer to const char. Adjust. (print_command_1): Make "exp" parameter const. (output_command): Rename to ... (output_command_const): ... this. Make "exp" parameter const. (output_command): Reimplement. (x_command): Adjust. (display_command): Rename "exp" parameter to "arg". New "exp" local, const version of "arg". * python/py-auto-load.c (gdbpy_initialize_auto_load): Make "cmd_name" local const. * python/py-cmd.c (cmdpy_destroyer): Cast const away in xfree call. (cmdpy_completer): Make "text" and "word" parameters const. (gdbpy_parse_command_name): Make "prefix_text2" local const. * python/py-param.c (add_setshow_generic): Make "tmp_name" local const. * remote.c (_initialize_remote): Make "cmd_name" local const. * symtab.c (language_search_unquoted_string): Make "text" and "p" parameters const. Adjust. (completion_list_add_fields): Make "sym_text", "text" and "word" parameters const. (struct add_name_data) <sym_text, text, word>: Make fields const. (default_make_symbol_completion_list_break_on): Make "text" and "word" parameters const. Adjust locals. (default_make_symbol_completion_list) (make_symbol_completion_list, make_symbol_completion_type) (make_symbol_completion_list_fn): Make "text" and "word" parameters const. (make_file_symbol_completion_list): Make "text", "word" and "srcfile" parameters const. Adjust locals. (add_filename_to_list): Make "text" and "word" parameters const. (struct add_partial_filename_data) <text, word>: Make fields const. (make_source_files_completion_list): Make "text" and "word" parameters const. * symtab.h (default_make_symbol_completion_list_break_on) (default_make_symbol_completion_list, make_symbol_completion_list) (make_symbol_completion_type enum type_code) (make_symbol_completion_list_fn make_file_symbol_completion_list) (make_source_files_completion_list): Change prototype. * top.c (execute_command): Adjust to pass pointer to pointer to const char to lookup_cmd, and to deprecated_cmd_warning prototype change. (set_verbose): Make "cmdname" local const. * tracepoint.c (decode_agent_options): Make "exp" parameter const, and adjust. (validate_actionline): Make "line" parameter a pointer to const char, and adjust. (encode_actions_1): Make "action_exp" local const, and adjust. (encode_actions): Adjust. (replace_comma): Delete. (trace_dump_actions): Make "action_exp" and "next_comma" locals const, and adjust. Don't frob the action string while splitting it at commas. Instead, make a copy of each split substring in turn. (trace_dump_command): Adjust to validate_actionline prototype change. * tracepoint.h (decode_agent_options, decode_agent_options) (encode_actions, validate_actionline): Change prototypes. * valprint.h (output_command): Delete declaration. (output_command_const): Declare. * value.c (function_destroyer): Cast const away in xfree call.
293 lines
9 KiB
C
293 lines
9 KiB
C
/* GDB routines for supporting auto-loaded scripts.
|
||
|
||
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
||
|
||
This file is part of GDB.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||
|
||
#include "defs.h"
|
||
#include "gdb_string.h"
|
||
#include "top.h"
|
||
#include "exceptions.h"
|
||
#include "gdbcmd.h"
|
||
#include "objfiles.h"
|
||
#include "python.h"
|
||
#include "cli/cli-cmds.h"
|
||
#include "auto-load.h"
|
||
|
||
#ifdef HAVE_PYTHON
|
||
|
||
#include "python-internal.h"
|
||
|
||
/* The section to look for Python auto-loaded scripts (in file formats that
|
||
support sections).
|
||
Each entry in this section is a byte of value 1, and then the nul-terminated
|
||
name of the script. The script name may include a directory.
|
||
The leading byte is to allow upward compatible extensions. */
|
||
#define GDBPY_AUTO_SECTION_NAME ".debug_gdb_scripts"
|
||
|
||
/* User-settable option to enable/disable auto-loading of Python scripts:
|
||
set auto-load python-scripts on|off
|
||
This is true if we should auto-load associated Python scripts when an
|
||
objfile is opened, false otherwise. */
|
||
static int auto_load_python_scripts = 1;
|
||
|
||
static void gdbpy_load_auto_script_for_objfile (struct objfile *objfile,
|
||
FILE *file,
|
||
const char *filename);
|
||
|
||
/* "show" command for the auto_load_python_scripts configuration variable. */
|
||
|
||
static void
|
||
show_auto_load_python_scripts (struct ui_file *file, int from_tty,
|
||
struct cmd_list_element *c, const char *value)
|
||
{
|
||
fprintf_filtered (file, _("Auto-loading of Python scripts is %s.\n"), value);
|
||
}
|
||
|
||
/* Definition of script language for Python scripts. */
|
||
|
||
static const struct script_language script_language_python
|
||
= { GDBPY_AUTO_FILE_NAME, gdbpy_load_auto_script_for_objfile };
|
||
|
||
/* Wrapper of source_python_script_for_objfile for script_language_python. */
|
||
|
||
static void
|
||
gdbpy_load_auto_script_for_objfile (struct objfile *objfile, FILE *file,
|
||
const char *filename)
|
||
{
|
||
int is_safe;
|
||
struct auto_load_pspace_info *pspace_info;
|
||
|
||
is_safe = file_is_auto_load_safe (filename,
|
||
_("auto-load: Loading Python script \"%s\" "
|
||
"by extension for objfile \"%s\".\n"),
|
||
filename, objfile->name);
|
||
|
||
/* Add this script to the hash table too so "info auto-load python-scripts"
|
||
can print it. */
|
||
pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
|
||
maybe_add_script (pspace_info, is_safe, filename, filename,
|
||
&script_language_python);
|
||
|
||
if (is_safe)
|
||
source_python_script_for_objfile (objfile, file, filename);
|
||
}
|
||
|
||
/* Load scripts specified in OBJFILE.
|
||
START,END delimit a buffer containing a list of nul-terminated
|
||
file names.
|
||
SOURCE_NAME is used in error messages.
|
||
|
||
Scripts are found per normal "source -s" command processing.
|
||
First the script is looked for in $cwd. If not found there the
|
||
source search path is used.
|
||
|
||
The section contains a list of path names of files containing
|
||
python code to load. Each path is null-terminated. */
|
||
|
||
static void
|
||
source_section_scripts (struct objfile *objfile, const char *source_name,
|
||
const char *start, const char *end)
|
||
{
|
||
const char *p;
|
||
struct auto_load_pspace_info *pspace_info;
|
||
|
||
pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
|
||
|
||
for (p = start; p < end; ++p)
|
||
{
|
||
const char *file;
|
||
FILE *stream;
|
||
char *full_path;
|
||
int opened, in_hash_table;
|
||
struct cleanup *back_to;
|
||
|
||
if (*p != 1)
|
||
{
|
||
warning (_("Invalid entry in %s section"), GDBPY_AUTO_SECTION_NAME);
|
||
/* We could try various heuristics to find the next valid entry,
|
||
but it's safer to just punt. */
|
||
break;
|
||
}
|
||
file = ++p;
|
||
|
||
while (p < end && *p != '\0')
|
||
++p;
|
||
if (p == end)
|
||
{
|
||
char *buf = alloca (p - file + 1);
|
||
|
||
memcpy (buf, file, p - file);
|
||
buf[p - file] = '\0';
|
||
warning (_("Non-null-terminated path in %s: %s"),
|
||
source_name, buf);
|
||
/* Don't load it. */
|
||
break;
|
||
}
|
||
if (p == file)
|
||
{
|
||
warning (_("Empty path in %s"), source_name);
|
||
continue;
|
||
}
|
||
|
||
opened = find_and_open_script (file, 1 /*search_path*/,
|
||
&stream, &full_path);
|
||
|
||
back_to = make_cleanup (null_cleanup, NULL);
|
||
if (opened)
|
||
{
|
||
make_cleanup_fclose (stream);
|
||
make_cleanup (xfree, full_path);
|
||
|
||
if (!file_is_auto_load_safe (full_path,
|
||
_("auto-load: Loading Python script "
|
||
"\"%s\" from section \"%s\" of "
|
||
"objfile \"%s\".\n"),
|
||
full_path, GDBPY_AUTO_SECTION_NAME,
|
||
objfile->name))
|
||
opened = 0;
|
||
}
|
||
else
|
||
{
|
||
full_path = NULL;
|
||
|
||
/* We don't throw an error, the program is still debuggable. */
|
||
if (script_not_found_warning_print (pspace_info))
|
||
warning (_("Missing auto-load scripts referenced in section %s\n\
|
||
of file %s\n\
|
||
Use `info auto-load python [REGEXP]' to list them."),
|
||
GDBPY_AUTO_SECTION_NAME, objfile->name);
|
||
}
|
||
|
||
/* If one script isn't found it's not uncommon for more to not be
|
||
found either. We don't want to print an error message for each
|
||
script, too much noise. Instead, we print the warning once and tell
|
||
the user how to find the list of scripts that weren't loaded.
|
||
|
||
IWBN if complaints.c were more general-purpose. */
|
||
|
||
in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
|
||
&script_language_python);
|
||
|
||
/* If this file is not currently loaded, load it. */
|
||
if (opened && !in_hash_table)
|
||
source_python_script_for_objfile (objfile, stream, full_path);
|
||
|
||
do_cleanups (back_to);
|
||
}
|
||
}
|
||
|
||
/* Load scripts specified in section SECTION_NAME of OBJFILE. */
|
||
|
||
static void
|
||
auto_load_section_scripts (struct objfile *objfile, const char *section_name)
|
||
{
|
||
bfd *abfd = objfile->obfd;
|
||
asection *scripts_sect;
|
||
bfd_byte *data = NULL;
|
||
|
||
scripts_sect = bfd_get_section_by_name (abfd, section_name);
|
||
if (scripts_sect == NULL)
|
||
return;
|
||
|
||
if (!bfd_get_full_section_contents (abfd, scripts_sect, &data))
|
||
warning (_("Couldn't read %s section of %s"),
|
||
section_name, bfd_get_filename (abfd));
|
||
else
|
||
{
|
||
struct cleanup *cleanups;
|
||
char *p = (char *) data;
|
||
|
||
cleanups = make_cleanup (xfree, p);
|
||
source_section_scripts (objfile, section_name, p,
|
||
p + bfd_get_section_size (scripts_sect));
|
||
do_cleanups (cleanups);
|
||
}
|
||
}
|
||
|
||
/* Load any Python auto-loaded scripts for OBJFILE. */
|
||
|
||
void
|
||
gdbpy_load_auto_scripts_for_objfile (struct objfile *objfile)
|
||
{
|
||
if (auto_load_python_scripts)
|
||
{
|
||
auto_load_objfile_script (objfile, &script_language_python);
|
||
auto_load_section_scripts (objfile, GDBPY_AUTO_SECTION_NAME);
|
||
}
|
||
}
|
||
|
||
/* Wrapper for "info auto-load python-scripts". */
|
||
|
||
static void
|
||
info_auto_load_python_scripts (char *pattern, int from_tty)
|
||
{
|
||
auto_load_info_scripts (pattern, from_tty, &script_language_python);
|
||
}
|
||
|
||
void
|
||
gdbpy_initialize_auto_load (void)
|
||
{
|
||
struct cmd_list_element *cmd;
|
||
const char *cmd_name;
|
||
|
||
add_setshow_boolean_cmd ("python-scripts", class_support,
|
||
&auto_load_python_scripts, _("\
|
||
Set the debugger's behaviour regarding auto-loaded Python scripts."), _("\
|
||
Show the debugger's behaviour regarding auto-loaded Python scripts."), _("\
|
||
If enabled, auto-loaded Python scripts are loaded when the debugger reads\n\
|
||
an executable or shared library.\n\
|
||
This options has security implications for untrusted inferiors."),
|
||
NULL, show_auto_load_python_scripts,
|
||
auto_load_set_cmdlist_get (),
|
||
auto_load_show_cmdlist_get ());
|
||
|
||
add_setshow_boolean_cmd ("auto-load-scripts", class_support,
|
||
&auto_load_python_scripts, _("\
|
||
Set the debugger's behaviour regarding auto-loaded Python scripts, "
|
||
"deprecated."),
|
||
_("\
|
||
Show the debugger's behaviour regarding auto-loaded Python scripts, "
|
||
"deprecated."),
|
||
NULL, NULL, show_auto_load_python_scripts,
|
||
&setlist, &showlist);
|
||
cmd_name = "auto-load-scripts";
|
||
cmd = lookup_cmd (&cmd_name, setlist, "", -1, 1);
|
||
deprecate_cmd (cmd, "set auto-load python-scripts");
|
||
|
||
/* It is needed because lookup_cmd updates the CMD_NAME pointer. */
|
||
cmd_name = "auto-load-scripts";
|
||
cmd = lookup_cmd (&cmd_name, showlist, "", -1, 1);
|
||
deprecate_cmd (cmd, "show auto-load python-scripts");
|
||
|
||
add_cmd ("python-scripts", class_info, info_auto_load_python_scripts,
|
||
_("Print the list of automatically loaded Python scripts.\n\
|
||
Usage: info auto-load python-scripts [REGEXP]"),
|
||
auto_load_info_cmdlist_get ());
|
||
|
||
cmd = add_info ("auto-load-scripts", info_auto_load_python_scripts, _("\
|
||
Print the list of automatically loaded Python scripts, deprecated."));
|
||
deprecate_cmd (cmd, "info auto-load python-scripts");
|
||
}
|
||
|
||
#else /* ! HAVE_PYTHON */
|
||
|
||
void
|
||
gdbpy_load_auto_scripts_for_objfile (struct objfile *objfile)
|
||
{
|
||
}
|
||
|
||
#endif /* ! HAVE_PYTHON */
|