summaryrefslogtreecommitdiff
path: root/gdb/buildsym.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2009-03-24 01:32:46 +0000
committerJoel Brobecker <brobecker@gnat.com>2009-03-24 01:32:46 +0000
commit24be086dc45e40b381af7b5c565002f47161305a (patch)
tree120950c00d62aece5ac8ac182ea9df24fe2ecfca /gdb/buildsym.c
parentcb01cfba2cd4edd8533f948d8dbf78027a6507a7 (diff)
* buildsym.c (end_symtab): If we ignore the subfiles, then
unlink the associated symtabs if they were already allocated.
Diffstat (limited to 'gdb/buildsym.c')
-rw-r--r--gdb/buildsym.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 55ace15cc2..6de817f8b9 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -1118,6 +1118,32 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
symtab->primary = 0;
}
+ else
+ {
+ if (subfile->symtab)
+ {
+ /* Since we are ignoring that subfile, we also need
+ to unlink the associated empty symtab that we created.
+ Otherwise, we can into trouble because various parts
+ such as the block-vector are uninitialized whereas
+ the rest of the code assumes that they are.
+
+ We can only unlink the symtab because it was allocated
+ on the objfile obstack. */
+ struct symtab *s;
+
+ if (objfile->symtabs == subfile->symtab)
+ objfile->symtabs = objfile->symtabs->next;
+ else
+ ALL_OBJFILE_SYMTABS (objfile, s)
+ if (s->next == subfile->symtab)
+ {
+ s->next = s->next->next;
+ break;
+ }
+ subfile->symtab = NULL;
+ }
+ }
if (subfile->name != NULL)
{
xfree ((void *) subfile->name);