aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2013-12-30 20:18:24 -0700
committerTom Tromey <tromey@redhat.com>2014-01-15 12:06:04 -0700
commit32ac0d11e648f4d5fa07c347ab109222a1162a0e (patch)
tree1f68c86d3174212cb335d3ca6bd26813462c67de /gdb/symtab.c
parent9e6c82ad4f55d0ff125721b94fa2191f1cc1000a (diff)
downloadgdb-32ac0d11e648f4d5fa07c347ab109222a1162a0e.zip
gdb-32ac0d11e648f4d5fa07c347ab109222a1162a0e.tar.gz
gdb-32ac0d11e648f4d5fa07c347ab109222a1162a0e.tar.bz2
move main name into the progspace
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.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r--gdb/symtab.c83
1 files changed, 72 insertions, 11 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c
index a8073b8..80a7dd6 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -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)
}
/* 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)