From 3d548a532dd74f9bf5f2033541f0b504d96baf04 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 30 Dec 2013 20:34:16 -0700 Subject: [PATCH] move the "main" data into the per-BFD object This adds the "main"-related data into the per-BFD. This is needed because once symbol sharing across objfiles is complete, computing the main name as a side effect of symbol reading will no longer work -- the symbols simply won't be re-read. After this change, set_main_name is only used by the main_name machinery itself, so this patch makes it static. 2014-01-15 Tom Tromey * dbxread.c (process_one_symbol): Use set_objfile_main_name. * dwarf2read.c (read_partial_die): Use set_objfile_main_name. * objfiles.c (get_objfile_bfd_data): Initialize language_of_main. (set_objfile_main_name): New function. * objfiles.h (struct objfile_per_bfd_storage) : New fields. (set_objfile_main_name): Declare. * symtab.c (find_main_name): Loop over objfiles to find the main name and language. (set_main_name): Now static. (get_main_info): Add comment. * symtab.h (set_main_name): Don't declare. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/dbxread.c | 2 +- gdb/dwarf2read.c | 2 +- gdb/objfiles.c | 15 +++++++++++++++ gdb/objfiles.h | 12 ++++++++++++ gdb/symtab.c | 25 ++++++++++++++++++++++++- gdb/symtab.h | 1 - 7 files changed, 68 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7125ca59459..82f6fc6ffc1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2014-01-15 Tom Tromey + + * dbxread.c (process_one_symbol): Use set_objfile_main_name. + * dwarf2read.c (read_partial_die): Use set_objfile_main_name. + * objfiles.c (get_objfile_bfd_data): Initialize language_of_main. + (set_objfile_main_name): New function. + * objfiles.h (struct objfile_per_bfd_storage) : New fields. + (set_objfile_main_name): Declare. + * symtab.c (find_main_name): Loop over objfiles to find the main + name and language. + (set_main_name): Now static. + (get_main_info): Add comment. + * symtab.h (set_main_name): Don't declare. + 2014-01-15 Tom Tromey * symtab.c (main_progspace_key): New global. diff --git a/gdb/dbxread.c b/gdb/dbxread.c index eab5113386d..ff56554fcb2 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -3250,7 +3250,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name, N_MAIN within a given objfile, complain() and choose arbitrarily. (kingdon) */ if (name != NULL) - set_main_name (name, language_unknown); + set_objfile_main_name (objfile, name, language_unknown); break; /* The following symbol types can be ignored. */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 0c3d16cd122..90c60cdb0d0 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -15322,7 +15322,7 @@ read_partial_die (const struct die_reader_specs *reader, practice. */ if (DW_UNSND (&attr) == DW_CC_program && cu->language == language_fortran) - set_main_name (part_die->name, language_fortran); + set_objfile_main_name (objfile, part_die->name, language_fortran); break; case DW_AT_inline: if (DW_UNSND (&attr) == DW_INL_inlined diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c3f6e186ea7..eccb44adbcb 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -152,6 +152,7 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) obstack_init (&storage->storage_obstack); storage->filename_cache = bcache_xmalloc (NULL, NULL); storage->macro_cache = bcache_xmalloc (NULL, NULL); + storage->language_of_main = language_unknown; } return storage; @@ -186,6 +187,20 @@ set_objfile_per_bfd (struct objfile *objfile) objfile->per_bfd = get_objfile_bfd_data (objfile, objfile->obfd); } +/* Set the objfile's per-BFD notion of the "main" name and + language. */ + +void +set_objfile_main_name (struct objfile *objfile, + const char *name, enum language lang) +{ + if (objfile->per_bfd->name_of_main == NULL + || strcmp (objfile->per_bfd->name_of_main, name) != 0) + objfile->per_bfd->name_of_main + = obstack_copy0 (&objfile->per_bfd->storage_obstack, name, strlen (name)); + objfile->per_bfd->language_of_main = lang; +} + /* Called via bfd_map_over_sections to build up the section table that diff --git a/gdb/objfiles.h b/gdb/objfiles.h index d448c9ef38f..2de2f8d01fe 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -203,6 +203,13 @@ struct objfile_per_bfd_storage containing the entry point, and the scope of the user's main() func. */ struct entry_info ei; + + /* The name and language of any "main" found in this objfile. The + name can be NULL, which means that the information was not + recorded. */ + + const char *name_of_main; + enum language language_of_main; }; /* Master structure for keeping track of each file from which @@ -691,4 +698,9 @@ void set_objfile_per_bfd (struct objfile *obj); const char *objfile_name (const struct objfile *objfile); +/* Set the objfile's notion of the "main" name and language. */ + +extern void set_objfile_main_name (struct objfile *objfile, + const char *name, enum language lang); + #endif /* !defined (OBJFILES_H) */ diff --git a/gdb/symtab.c b/gdb/symtab.c index 80a7dd676d5..09b2326ed52 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5028,6 +5028,12 @@ get_main_info (void) if (info == NULL) { + /* It may seem strange to store the main name in the progspace + and also in whatever objfile happens to see a main name in + its debug info. The reason for this is mainly historical: + gdb returned "main" as the name even if no function named + "main" was defined the program; and this approach lets us + keep compatibility. */ info = XCNEW (struct main_info); info->language_of_main = language_unknown; set_program_space_data (current_program_space, main_progspace_key, @@ -5050,7 +5056,7 @@ main_info_cleanup (struct program_space *pspace, void *data) xfree (info); } -void +static void set_main_name (const char *name, enum language lang) { struct main_info *info = get_main_info (); @@ -5075,6 +5081,23 @@ static void find_main_name (void) { const char *new_main_name; + struct objfile *objfile; + + /* First check the objfiles to see whether a debuginfo reader has + picked up the appropriate main name. Historically the main name + was found in a more or less random way; this approach instead + relies on the order of objfile creation -- which still isn't + guaranteed to get the correct answer, but is just probably more + accurate. */ + ALL_OBJFILES (objfile) + { + if (objfile->per_bfd->name_of_main != NULL) + { + set_main_name (objfile->per_bfd->name_of_main, + objfile->per_bfd->language_of_main); + return; + } + } /* Try to see if the main procedure is in Ada. */ /* FIXME: brobecker/2005-03-07: Another way of doing this would diff --git a/gdb/symtab.h b/gdb/symtab.h index 4a933747ed1..25ac028eee1 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1324,7 +1324,6 @@ extern struct cleanup *make_cleanup_free_search_symbols (struct symbol_search FIXME: cagney/2001-03-20: Can't make main_name() const since some of the calling code currently assumes that the string isn't const. */ -extern void set_main_name (const char *name, enum language lang); extern /*const */ char *main_name (void); extern enum language main_language (void);