diff options
author | Doug Evans <xdje42@gmail.com> | 2013-11-29 21:29:26 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2013-11-29 21:29:26 -0800 |
commit | 5b2bf9471f1499bee578fcd60c05afe85794e280 (patch) | |
tree | f0bf05b2842251a3b03bb55dca639b8903caf2e2 /gdb/python | |
parent | d9c43928180cc298ece7de1a27eafbf6c8c38de7 (diff) | |
download | gdb-5b2bf9471f1499bee578fcd60c05afe85794e280.zip gdb-5b2bf9471f1499bee578fcd60c05afe85794e280.tar.gz gdb-5b2bf9471f1499bee578fcd60c05afe85794e280.tar.bz2 |
Move .debug_gdb_script processing to auto-load.c.
Simplify handling of auto-loaded objfile scripts.
.debug_gdb_scripts was always intended to handle more than just python,
thus the rightful home for the code that processes it is not in py-foo.c.
This is just a cleanup to move the code to a better place.
This also simplifies the handling of the ${objfile}-${suffix} auto-loaded
scripts. There's no need for each of the the handlers to do is-safe-to-load
checking, or call maybe_add_script. Doing it in the caller removes the
duplication.
* auto-load.h (script_language): New members name, auto_load_enabled.
Add missing comments on struct members.
(auto_load_objfile_script): Delete.
* auto-load.c: #include "cli/cli-cmds.h".
(auto_load_gdb_scripts_enabled): New function.
(script_language_gdb): Update, add new members.
(source_gdb_script_for_objfile): Simplify, auto-load safe-checking
and call to maybe_add_script moved to caller.
(auto_load_objfile_script_1): Auto-load safe-checking and
call to maybe_add_script moved here.
(auto_load_objfile_script): Make static. Early exit if support for
scripting language hasn't been compiled in, or auto-loading has been
disabled.
(source_section_scripts): Argument "source_name" renamed to
"section_name". All uses updated. Replace uses of AUTO_SECTION_NAME
with section_name. Skip loading script if support for scripting
language hasn't been compiled in, or auto-loading has been disabled.
Call language->source_script_for_objfile instead of calling
source_python_script_for_objfile directly.
(load_auto_scripts_for_objfile): Update.
* python/py-auto-load.c: Delete #include "cli/cli-cmds.h".
(gdbpy_load_auto_script_for_objfile): Delete.
(auto_load_python_scripts_enabled): New function.
(script_language_python): Update, add new members.
(gdbpy_script_language_defn): New function.
* python/python.h (gdbpy_load_auto_scripts_for_objfile): Delete.
(gdbpy_script_language_defn): Declare.
* auto-load.c (AUTO_SECTION_NAME): Moved here and renamed from
py-auto-load.c, GDBPY_AUTO_SECTION_NAME.
(source_section_scripts): Moved here from py-auto-load.c.
(auto_load_section_scripts): Ditto.
* python/py-auto-load.c (GDBPY_AUTO_SECTION_NAME): Moved to
auto-load.c, renamed AUTO_SECTION_NAME.
(source_section_scripts, auto_load_section_scripts): Moved to
auto-load.c.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-auto-load.c | 197 | ||||
-rw-r--r-- | gdb/python/python.h | 2 |
2 files changed, 22 insertions, 177 deletions
diff --git a/gdb/python/py-auto-load.c b/gdb/python/py-auto-load.c index 827918a..d5450b3 100644 --- a/gdb/python/py-auto-load.c +++ b/gdb/python/py-auto-load.c @@ -24,30 +24,18 @@ #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 @@ -57,177 +45,30 @@ show_auto_load_python_scripts (struct ui_file *file, int from_tty, 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. */ +/* Return non-zero if auto-loading Python scripts is enabled. */ -static void -gdbpy_load_auto_script_for_objfile (struct objfile *objfile, FILE *file, - const char *filename) +static int +auto_load_python_scripts_enabled (void) { - 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 (objfile)); - - /* 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); + return auto_load_python_scripts; } -/* 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 (objfile))) - opened = 0; - } - else - { - full_path = NULL; - - /* If one script isn't found it's not uncommon for more to not be - found either. We don't want to print a 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. - We don't throw an error, the program is still debuggable. - - IWBN if complaints.c were more general-purpose. */ - - 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 (objfile)); - } - - 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. */ +/* Definition of script language for Python scripts. */ -static void -auto_load_section_scripts (struct objfile *objfile, const char *section_name) +static const struct script_language script_language_python = { - 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; + "python", + GDBPY_AUTO_FILE_NAME, + auto_load_python_scripts_enabled, + source_python_script_for_objfile +}; - 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; +/* Return the Python script language definition. */ - 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) +const struct script_language * +gdbpy_script_language_defn (void) { - if (auto_load_python_scripts) - { - auto_load_objfile_script (objfile, &script_language_python); - auto_load_section_scripts (objfile, GDBPY_AUTO_SECTION_NAME); - } + return &script_language_python; } /* Wrapper for "info auto-load python-scripts". */ @@ -287,9 +128,13 @@ Print the list of automatically loaded Python scripts, deprecated.")); #else /* ! HAVE_PYTHON */ -void -gdbpy_load_auto_scripts_for_objfile (struct objfile *objfile) +/* Return the Python script language definition. + Since support isn't compiled in, return NULL. */ + +const struct script_language * +gdbpy_script_language_defn (void) { + return NULL; } #endif /* ! HAVE_PYTHON */ diff --git a/gdb/python/python.h b/gdb/python/python.h index 047fb4c..c07b2aa 100644 --- a/gdb/python/python.h +++ b/gdb/python/python.h @@ -109,7 +109,7 @@ enum py_bt_status apply_frame_filter (struct frame_info *frame, int flags, void preserve_python_values (struct objfile *objfile, htab_t copied_types); -void gdbpy_load_auto_scripts_for_objfile (struct objfile *objfile); +const struct script_language *gdbpy_script_language_defn (void); int gdbpy_should_stop (struct gdbpy_breakpoint_object *bp_obj); |