diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d34e4fb386..5a11d4664c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2003-02-03 Jim Blandy + + Use a single, consistent representation for an empty minimal + symbol table in an objfile. + * objfiles.c (terminate_minimal_symbol_table): New function. + (allocate_objfile): Call it. + * objfiles.h (terminate_minimal_symbol_table): New declaration. + (ALL_MSYMBOLS): No need to test whether (objfile)->msymbols is + non-NULL. + * minsyms.c (lookup_minimal_symbol_by_pc_section): To see whether + objfile has minimal symbols, compare minimal_symbol_count to zero, + instead of comparing msymbols with NULL. + * objfiles.c (have_minimal_symbols): Same. + * solib-sunos.c (solib_add_common_symbols): Call + terminate_minimal_symbol_table. + * symfile.c (reread_symbols): Same. + 2003-02-03 Kevin Buettner * s390-tdep.c (s390_address_class_type_flags) diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 9823c87a10..92dfa8296b 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -411,8 +411,9 @@ lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section) "null symbol". If there are no real symbols, then there is no minimal symbol table at all. */ - if ((msymbol = objfile->msymbols) != NULL) + if (objfile->minimal_symbol_count > 0) { + msymbol = objfile->msymbols; lo = 0; hi = objfile->minimal_symbol_count - 1; diff --git a/gdb/objfiles.c b/gdb/objfiles.c index d62b28f454..16d8527a7d 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -281,6 +281,8 @@ allocate_objfile (bfd *abfd, int flags) obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc, xfree); flags &= ~OBJF_MAPPED; + + terminate_minimal_symbol_table (objfile); } /* Update the per-objfile information that comes from the bfd, ensuring @@ -333,6 +335,33 @@ allocate_objfile (bfd *abfd, int flags) return (objfile); } + +/* Create the terminating entry of OBJFILE's minimal symbol table. + If OBJFILE->msymbols is zero, allocate a single entry from + OBJFILE->symbol_obstack; otherwise, just initialize + OBJFILE->msymbols[OBJFILE->minimal_symbol_count]. */ +void +terminate_minimal_symbol_table (struct objfile *objfile) +{ + if (! objfile->msymbols) + objfile->msymbols = ((struct minimal_symbol *) + obstack_alloc (&objfile->symbol_obstack, + sizeof (objfile->msymbols[0]))); + + { + struct minimal_symbol *m + = &objfile->msymbols[objfile->minimal_symbol_count]; + + memset (m, 0, sizeof (*m)); + SYMBOL_NAME (m) = NULL; + SYMBOL_VALUE_ADDRESS (m) = 0; + MSYMBOL_INFO (m) = NULL; + MSYMBOL_TYPE (m) = mst_unknown; + SYMBOL_INIT_LANGUAGE_SPECIFIC (m, language_unknown); + } +} + + /* Put one object file before a specified on in the global list. This can be used to make sure an object file is destroyed before another when using ALL_OBJFILES_SAFE to free all objfiles. */ @@ -810,7 +839,7 @@ have_minimal_symbols (void) ALL_OBJFILES (ofp) { - if (ofp->msymbols != NULL) + if (ofp->minimal_symbol_count > 0) { return 1; } diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 587e71c743..44b820187c 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -515,6 +515,8 @@ extern struct objfile *allocate_objfile (bfd *, int); extern int build_objfile_section_table (struct objfile *); +extern void terminate_minimal_symbol_table (struct objfile *objfile); + extern void put_objfile_before (struct objfile *, struct objfile *); extern void objfile_to_front (struct objfile *); @@ -595,8 +597,7 @@ extern int is_in_import_list (char *, struct objfile *); #define ALL_MSYMBOLS(objfile, m) \ ALL_OBJFILES (objfile) \ - if ((objfile)->msymbols) \ - ALL_OBJFILE_MSYMBOLS (objfile, m) + ALL_OBJFILE_MSYMBOLS (objfile, m) #define ALL_OBJFILE_OSECTIONS(objfile, osect) \ for (osect = objfile->sections; osect < objfile->sections_end; osect++) diff --git a/gdb/solib-sunos.c b/gdb/solib-sunos.c index ae115673c2..25682e02ca 100644 --- a/gdb/solib-sunos.c +++ b/gdb/solib-sunos.c @@ -184,6 +184,7 @@ solib_add_common_symbols (CORE_ADDR rtc_symp) xmalloc, xfree); rt_common_objfile->minimal_symbol_count = 0; rt_common_objfile->msymbols = NULL; + terminate_minimal_symbol_table (rt_common_objfile); } init_minimal_symbol_collection (); diff --git a/gdb/symfile.c b/gdb/symfile.c index c83c025bbf..7a53bee1b1 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2019,6 +2019,7 @@ reread_symbols (void) error ("Can't find the file sections in `%s': %s", objfile->name, bfd_errmsg (bfd_get_error ())); } + terminate_minimal_symbol_table (objfile); /* We use the same section offsets as from last time. I'm not sure whether that is always correct for shared libraries. */