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.
This commit is contained in:
parent
d9c4392818
commit
5b2bf9471f
5 changed files with 278 additions and 207 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/* Return non-zero if auto-loading Python scripts is enabled. */
|
||||
|
||||
static int
|
||||
auto_load_python_scripts_enabled (void)
|
||||
{
|
||||
return auto_load_python_scripts;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
static const struct script_language script_language_python =
|
||||
{
|
||||
int is_safe;
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
"python",
|
||||
GDBPY_AUTO_FILE_NAME,
|
||||
auto_load_python_scripts_enabled,
|
||||
source_python_script_for_objfile
|
||||
};
|
||||
|
||||
is_safe = file_is_auto_load_safe (filename,
|
||||
_("auto-load: Loading Python script \"%s\" "
|
||||
"by extension for objfile \"%s\".\n"),
|
||||
filename, objfile_name (objfile));
|
||||
/* Return the Python script language definition. */
|
||||
|
||||
/* 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 struct script_language *
|
||||
gdbpy_script_language_defn (void)
|
||||
{
|
||||
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. */
|
||||
|
||||
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);
|
||||
}
|
||||
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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue