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:
Doug Evans 2013-11-29 21:29:26 -08:00
parent d9c4392818
commit 5b2bf9471f
5 changed files with 278 additions and 207 deletions

View file

@ -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 */