move main name into the progspace
authorTom Tromey <tromey@redhat.com>
Tue, 31 Dec 2013 03:18:24 +0000 (20:18 -0700)
committerTom Tromey <tromey@redhat.com>
Wed, 15 Jan 2014 19:06:04 +0000 (12:06 -0700)
This moves the "main" name and language into an object attached to the
current progspace.  This prevents problems if there are multiple
inferiors tha have different ideas of "main" -- which matters at least
for unwinding, see frame.c:inside_main_func.

2014-01-15  Tom Tromey  <tromey@redhat.com>

* symtab.c (main_progspace_key): New global.
(struct main_info): New.
(name_of_main, language_of_main): Remove.
(get_main_info, main_info_cleanup): New function.
(set_main_name, main_name, main_language): Use get_main_info.
(_initialize_symtab): Initialize main_progspace_key.

gdb/ChangeLog
gdb/symtab.c

index ae6d843aca10417f6d6aee52c2cca1485f4f1b5e..7125ca59459fd8896c9506565b96e441c8a86105 100644 (file)
@@ -1,3 +1,12 @@
+2014-01-15  Tom Tromey  <tromey@redhat.com>
+
+       * symtab.c (main_progspace_key): New global.
+       (struct main_info): New.
+       (name_of_main, language_of_main): Remove.
+       (get_main_info, main_info_cleanup): New function.
+       (set_main_name, main_name, main_language): Use get_main_info.
+       (_initialize_symtab): Initialize main_progspace_key.
+
 2014-01-15  Tom Tromey  <tromey@redhat.com>
 
        * dbxread.c (process_one_symbol): Update.
index a8073b8ef7e8027566949952b9115631e33a5f5f..80a7dd676d59e0dfdcdd968364e8152268e81afc 100644 (file)
@@ -104,6 +104,23 @@ void _initialize_symtab (void);
 
 /* */
 
+/* Program space key for finding name and language of "main".  */
+
+static const struct program_space_data *main_progspace_key;
+
+/* Type of the data stored on the program space.  */
+
+struct main_info
+{
+  /* Name of "main".  */
+
+  char *name_of_main;
+
+  /* Language of "main".  */
+
+  enum language language_of_main;
+};
+
 /* When non-zero, print debugging messages related to symtab creation.  */
 unsigned int symtab_create_debug = 0;
 
@@ -4998,22 +5015,56 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
 }
 \f
 /* Track MAIN */
-static char *name_of_main;
-static enum language language_of_main = language_unknown;
+
+/* Return the "main_info" object for the current program space.  If
+   the object has not yet been created, create it and fill in some
+   default values.  */
+
+static struct main_info *
+get_main_info (void)
+{
+  struct main_info *info = program_space_data (current_program_space,
+                                              main_progspace_key);
+
+  if (info == NULL)
+    {
+      info = XCNEW (struct main_info);
+      info->language_of_main = language_unknown;
+      set_program_space_data (current_program_space, main_progspace_key,
+                             info);
+    }
+
+  return info;
+}
+
+/* A cleanup to destroy a struct main_info when a progspace is
+   destroyed.  */
+
+static void
+main_info_cleanup (struct program_space *pspace, void *data)
+{
+  struct main_info *info = data;
+
+  if (info != NULL)
+    xfree (info->name_of_main);
+  xfree (info);
+}
 
 void
 set_main_name (const char *name, enum language lang)
 {
-  if (name_of_main != NULL)
+  struct main_info *info = get_main_info ();
+
+  if (info->name_of_main != NULL)
     {
-      xfree (name_of_main);
-      name_of_main = NULL;
-      language_of_main = language_unknown;
+      xfree (info->name_of_main);
+      info->name_of_main = NULL;
+      info->language_of_main = language_unknown;
     }
   if (name != NULL)
     {
-      name_of_main = xstrdup (name);
-      language_of_main = lang;
+      info->name_of_main = xstrdup (name);
+      info->language_of_main = lang;
     }
 }
 
@@ -5070,10 +5121,12 @@ find_main_name (void)
 char *
 main_name (void)
 {
-  if (name_of_main == NULL)
+  struct main_info *info = get_main_info ();
+
+  if (info->name_of_main == NULL)
     find_main_name ();
 
-  return name_of_main;
+  return info->name_of_main;
 }
 
 /* Return the language of the main function.  If it is not known,
@@ -5082,7 +5135,12 @@ main_name (void)
 enum language
 main_language (void)
 {
-  return language_of_main;
+  struct main_info *info = get_main_info ();
+
+  if (info->name_of_main == NULL)
+    find_main_name ();
+
+  return info->language_of_main;
 }
 
 /* Handle ``executable_changed'' events for the symtab module.  */
@@ -5271,6 +5329,9 @@ _initialize_symtab (void)
 {
   initialize_ordinary_address_classes ();
 
+  main_progspace_key
+    = register_program_space_data_with_cleanup (NULL, main_info_cleanup);
+
   add_info ("variables", variables_info, _("\
 All global and static variable names, or those matching REGEXP."));
   if (dbx_commands)