[commit 2/2] Move processing of .debug_gdb_scripts to auto-load.c

Doug Evans dje@gmail.com
Sat Nov 30 08:58:00 GMT 2013


Hi.

This is the second of two patches that does two cleanups:
1) Move processing of .debug_gdb_scripts to auto-load.c.
2) Simplify handling of ${objfile}-${suffix} scripts.
[e.g. foo-gdb.gdb, libfoo-gdb.py]

Regression tested on amd64-linux, with/without python.

2013-11-29  Doug Evans  <xdje42@gmail.com>

	* 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.

diff --git a/gdb/auto-load.h b/gdb/auto-load.h
index 6a66622..2ddebc5 100644
--- a/gdb/auto-load.h
+++ b/gdb/auto-load.h
@@ -24,8 +24,18 @@ struct program_space;
 
 struct script_language
 {
+  /* The name of the language, lowercase.  */
+  const char *name;
+
+  /* The suffix added to objfiles to get their auto-load script.
+     E.g., "-gdb.py".  */
   const char *suffix;
 
+  /* Returns non-zero if auto-loading scripts in this language is enabled.  */
+  int (*auto_load_enabled) (void);
+
+  /* Worker routine to load the script.  It has already been opened and
+     deemed safe to load.  */
   void (*source_script_for_objfile) (struct objfile *objfile, FILE *file,
 				     const char *filename);
 };
@@ -42,8 +52,6 @@ extern int maybe_add_script (struct auto_load_pspace_info *pspace_info,
 			     int loaded, const char *name,
 			     const char *full_path,
 			     const struct script_language *language);
-extern void auto_load_objfile_script (struct objfile *objfile,
-				      const struct script_language *language);
 extern void load_auto_scripts_for_objfile (struct objfile *objfile);
 extern int
   script_not_found_warning_print (struct auto_load_pspace_info *pspace_info);
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 2a74e90..02b08be 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -30,6 +30,7 @@
 #include "exceptions.h"
 #include "cli/cli-script.h"
 #include "gdbcmd.h"
+#include "cli/cli-cmds.h"
 #include "cli/cli-decode.h"
 #include "cli/cli-setshow.h"
 #include "gdb_vecs.h"
@@ -87,6 +88,14 @@ show_auto_load_gdb_scripts (struct ui_file *file, int from_tty,
 		    value);
 }
 
+/* Return non-zero if auto-loading gdb scripts is enabled.  */
+
+static int
+auto_load_gdb_scripts_enabled (void)
+{
+  return auto_load_gdb_scripts;
+}
+
 /* Internal-use flag to enable/disable auto-loading.
    This is true if we should auto-load python code when an objfile is opened,
    false otherwise.
@@ -510,31 +519,20 @@ For more information about this security protection see the\n\
 
 /* Definition of script language for GDB canned sequences of commands.  */
 
-static const struct script_language script_language_gdb
-  = { GDB_AUTO_FILE_NAME, source_gdb_script_for_objfile };
+static const struct script_language script_language_gdb =
+{
+  "gdb",
+  GDB_AUTO_FILE_NAME,
+  auto_load_gdb_scripts_enabled,
+  source_gdb_script_for_objfile
+};
 
 static void
 source_gdb_script_for_objfile (struct objfile *objfile, FILE *file,
 			       const char *filename)
 {
-  int is_safe;
-  struct auto_load_pspace_info *pspace_info;
   volatile struct gdb_exception e;
 
-  is_safe = file_is_auto_load_safe (filename, _("auto-load: Loading canned "
-						"sequences of commands script "
-						"\"%s\" for objfile \"%s\".\n"),
-				    filename, objfile_name (objfile));
-
-  /* Add this script to the hash table too so "info auto-load gdb-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_gdb);
-
-  if (!is_safe)
-    return;
-
   TRY_CATCH (e, RETURN_MASK_ALL)
     {
       script_from_file (file, filename);
@@ -788,14 +786,31 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
 
   if (input)
     {
+      int is_safe;
+      struct auto_load_pspace_info *pspace_info;
+
       make_cleanup_fclose (input);
 
+      is_safe
+	= file_is_auto_load_safe (filename,
+				  _("auto-load: Loading %s script \"%s\""
+				    " by extension for objfile \"%s\".\n"),
+				  language->name, filename,
+				  objfile_name (objfile));
+
+      /* Add this script to the hash table too so
+	 "info auto-load ${lang}-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, language);
+
       /* To preserve existing behaviour we don't check for whether the
 	 script was already in the table, and always load it.
 	 It's highly unlikely that we'd ever load it twice,
 	 and these scripts are required to be idempotent under multiple
 	 loads anyway.  */
-      language->source_script_for_objfile (objfile, input, debugfile);
+      if (is_safe)
+	language->source_script_for_objfile (objfile, input, debugfile);
 
       retval = 1;
     }
@@ -809,12 +824,21 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
 /* Look for the auto-load script in LANGUAGE associated with OBJFILE and load
    it.  */
 
-void
+static void
 auto_load_objfile_script (struct objfile *objfile,
 			  const struct script_language *language)
 {
-  char *realname = gdb_realpath (objfile_name (objfile));
-  struct cleanup *cleanups = make_cleanup (xfree, realname);
+  char *realname;
+  struct cleanup *cleanups;
+
+  /* Skip this script if support has not been compiled in or
+     auto-loading it has been disabled.  */
+  if (language == NULL
+      || !language->auto_load_enabled ())
+    return;
+
+  realname = gdb_realpath (objfile_name (objfile));
+  cleanups = make_cleanup (xfree, realname);
 
   if (!auto_load_objfile_script_1 (objfile, realname, language))
     {
@@ -842,17 +866,17 @@ auto_load_objfile_script (struct objfile *objfile,
 /* 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.
+   SECTION_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.  */
+   The section contains a list of path names of script files to load.
+   Each path is null-terminated.  */
 
 static void
-source_section_scripts (struct objfile *objfile, const char *source_name,
+source_section_scripts (struct objfile *objfile, const char *section_name,
 			const char *start, const char *end)
 {
   const char *p;
@@ -867,10 +891,13 @@ source_section_scripts (struct objfile *objfile, const char *source_name,
       char *full_path;
       int opened, in_hash_table;
       struct cleanup *back_to;
+      /* At the moment we only support python scripts in .debug_gdb_scripts,
+	 but that can change.  */
+      const struct script_language *language = gdbpy_script_language_defn ();
 
       if (*p != 1)
 	{
-	  warning (_("Invalid entry in %s section"), AUTO_SECTION_NAME);
+	  warning (_("Invalid entry in %s section"), section_name);
 	  /* We could try various heuristics to find the next valid entry,
 	     but it's safer to just punt.  */
 	  break;
@@ -886,13 +913,22 @@ source_section_scripts (struct objfile *objfile, const char *source_name,
 	  memcpy (buf, file, p - file);
 	  buf[p - file] = '\0';
 	  warning (_("Non-null-terminated path in %s: %s"),
-		   source_name, buf);
+		   section_name, buf);
 	  /* Don't load it.  */
 	  break;
 	}
       if (p == file)
 	{
-	  warning (_("Empty path in %s"), source_name);
+	  warning (_("Empty path in %s"), section_name);
+	  continue;
+	}
+
+      /* Skip this script if support has not been compiled in or
+	 auto-loading it has been disabled.  */
+      if (language == NULL
+	  || !language->auto_load_enabled ())
+	{
+	  /* No message is printed, just skip it.  */
 	  continue;
 	}
 
@@ -906,10 +942,10 @@ source_section_scripts (struct objfile *objfile, const char *source_name,
 	  make_cleanup (xfree, full_path);
 
 	  if (!file_is_auto_load_safe (full_path,
-				       _("auto-load: Loading Python script "
+				       _("auto-load: Loading %s script "
 					 "\"%s\" from section \"%s\" of "
 					 "objfile \"%s\".\n"),
-				       full_path, AUTO_SECTION_NAME,
+				       language->name, full_path, section_name,
 				       objfile_name (objfile)))
 	    opened = 0;
 	}
@@ -928,16 +964,19 @@ source_section_scripts (struct objfile *objfile, const char *source_name,
 	  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."),
-		     AUTO_SECTION_NAME, objfile_name (objfile));
+Use `info auto-load %s-scripts [REGEXP]' to list them."),
+		     section_name, objfile_name (objfile), language->name);
 	}
 
       in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
-					&script_language_python);
+					language);
 
       /* If this file is not currently loaded, load it.  */
       if (opened && !in_hash_table)
-	source_python_script_for_objfile (objfile, stream, full_path);
+	{
+	  gdb_assert (language->source_script_for_objfile != NULL);
+	  language->source_script_for_objfile (objfile, stream, full_path);
+	}
 
       do_cleanups (back_to);
     }
@@ -979,10 +1018,10 @@ load_auto_scripts_for_objfile (struct objfile *objfile)
   if (!global_auto_load || (objfile->flags & OBJF_NOT_FILENAME) != 0)
     return;
 
-  if (auto_load_gdb_scripts)
-    auto_load_objfile_script (objfile, &script_language_gdb);
+  auto_load_objfile_script (objfile, &script_language_gdb);
+  auto_load_objfile_script (objfile, gdbpy_script_language_defn ());
 
-  gdbpy_load_auto_scripts_for_objfile (objfile);
+  auto_load_section_scripts (objfile, AUTO_SECTION_NAME);
 }
 
 /* This is a new_objfile observer callback to auto-load scripts.
diff --git a/gdb/python/py-auto-load.c b/gdb/python/py-auto-load.c
index 0d498f8..d5450b3 100644
--- a/gdb/python/py-auto-load.c
+++ b/gdb/python/py-auto-load.c
@@ -24,7 +24,6 @@
 #include "gdbcmd.h"
 #include "objfiles.h"
 #include "python.h"
-#include "cli/cli-cmds.h"
 #include "auto-load.h"
 
 #ifdef HAVE_PYTHON
@@ -37,10 +36,6 @@
    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
@@ -50,45 +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.  */
+/* Return non-zero if auto-loading Python scripts is enabled.  */
 
-static const struct script_language script_language_python
-  = { GDBPY_AUTO_FILE_NAME, gdbpy_load_auto_script_for_objfile };
+static int
+auto_load_python_scripts_enabled (void)
+{
+  return auto_load_python_scripts;
+}
 
-/* Wrapper of source_python_script_for_objfile for script_language_python.  */
+/* Definition of script language for Python scripts.  */
 
-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;
-
-  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);
-}
+  "python",
+  GDBPY_AUTO_FILE_NAME,
+  auto_load_python_scripts_enabled,
+  source_python_script_for_objfile
+};
 
-/* Load any Python auto-loaded scripts for OBJFILE.  */
+/* Return the Python script language definition.  */
 
-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".  */
@@ -148,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);
 



More information about the Gdb-patches mailing list