aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog17
-rw-r--r--gdb/minsyms.c3
-rw-r--r--gdb/objfiles.c31
-rw-r--r--gdb/objfiles.h5
-rw-r--r--gdb/solib-sunos.c1
-rw-r--r--gdb/symfile.c1
6 files changed, 54 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d34e4fb..5a11d46 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,20 @@
+2003-02-03 Jim Blandy <jimb@redhat.com>
+
+ 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 <kevinb@redhat.com>
* s390-tdep.c (s390_address_class_type_flags)
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index 9823c87..92dfa82 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 d62b28f..16d8527 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 587e71c..44b8201 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 ae11567..25682e0 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 c83c025..7a53bee 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. */