* [RFA]: Add misc_obstack to object files.
@ 2001-05-29 10:31 Daniel Berlin
2001-06-25 13:59 ` Elena Zannoni
0 siblings, 1 reply; 8+ messages in thread
From: Daniel Berlin @ 2001-05-29 10:31 UTC (permalink / raw)
To: gdb-patches
This way, we stop putting things in the psymbol_obstack that don't
belong.
2001-05-27 Daniel Berlin <dan@cgsoftware.com>
* symfile.c (default_symfile_offsets): Allocate in misc_obstack.
(reread_symbols): Handle misc_obstack too, and use it where
psymbol_obstack didn't belong.
(allocate_psymtab): Ditto.
* objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack.
(build_objfile_section_table): Ditto.
(free_objfile): Free the misc_obstack.
(allocate_objfile): Setup misc_obstack too.
* objfiles.h: Add misc_obstack to object file.
Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.32
diff -c -3 -p -w -B -b -r1.32 symfile.c
*** symfile.c 2001/05/10 15:33:21 1.32
--- symfile.c 2001/05/29 17:27:51
*************** default_symfile_offsets (struct objfile
*** 500,506 ****
objfile->num_sections = SECT_OFF_MAX;
objfile->section_offsets = (struct section_offsets *)
! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS);
/* Now calculate offsets for section that were specified by the
--- 500,506 ----
objfile->num_sections = SECT_OFF_MAX;
objfile->section_offsets = (struct section_offsets *)
! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS);
memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS);
/* Now calculate offsets for section that were specified by the
*************** reread_symbols (void)
*** 1679,1684 ****
--- 1679,1685 ----
/* Free the obstacks for non-reusable objfiles */
free_bcache (&objfile->psymbol_cache);
+ obstack_free (&objfile->misc_obstack, 0);
obstack_free (&objfile->psymbol_obstack, 0);
obstack_free (&objfile->symbol_obstack, 0);
obstack_free (&objfile->type_obstack, 0);
*************** reread_symbols (void)
*** 1704,1709 ****
--- 1705,1712 ----
it is empty. */
obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0,
xmalloc, xfree);
+ obstack_specify_allocation (&objfile->misc_obstack, 0, 0,
+ xmalloc, xfree);
obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0,
xmalloc, xfree);
obstack_specify_allocation (&objfile->symbol_obstack, 0, 0,
*************** reread_symbols (void)
*** 1719,1725 ****
/* We use the same section offsets as from last time. I'm not
sure whether that is always correct for shared libraries. */
objfile->section_offsets = (struct section_offsets *)
! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS);
objfile->num_sections = num_offsets;
--- 1722,1728 ----
/* We use the same section offsets as from last time. I'm not
sure whether that is always correct for shared libraries. */
objfile->section_offsets = (struct section_offsets *)
! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS);
memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS);
objfile->num_sections = num_offsets;
*************** allocate_psymtab (char *filename, struct
*** 1981,1993 ****
objfile->free_psymtabs = psymtab->next;
}
else
! psymtab = (struct partial_symtab *)
! obstack_alloc (&objfile->psymbol_obstack,
! sizeof (struct partial_symtab));
memset (psymtab, 0, sizeof (struct partial_symtab));
! psymtab->filename = obsavestring (filename, strlen (filename),
! &objfile->psymbol_obstack);
psymtab->symtab = NULL;
/* Prepend it to the psymtab list for the objfile it belongs to.
--- 1984,1993 ----
objfile->free_psymtabs = psymtab->next;
}
else
! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab));
memset (psymtab, 0, sizeof (struct partial_symtab));
! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack);
psymtab->symtab = NULL;
/* Prepend it to the psymtab list for the objfile it belongs to.
Index: objfiles.c
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.c,v
retrieving revision 1.15
diff -c -3 -p -w -B -b -r1.15 objfiles.c
*** objfiles.c 2001/03/06 08:21:11 1.15
--- objfiles.c 2001/05/29 17:27:57
*************** add_to_objfile_sections (bfd *abfd, sec_
*** 96,102 ****
section.ovly_mapped = 0;
section.addr = bfd_section_vma (abfd, asect);
section.endaddr = section.addr + bfd_section_size (abfd, asect);
! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section));
objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1);
}
--- 96,102 ----
section.ovly_mapped = 0;
section.addr = bfd_section_vma (abfd, asect);
section.endaddr = section.addr + bfd_section_size (abfd, asect);
! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section));
objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1);
}
*************** build_objfile_section_table (struct objf
*** 121,134 ****
{
/* objfile->sections can be already set when reading a mapped symbol
file. I believe that we do need to rebuild the section table in
! this case (we rebuild other things derived from the bfd), but we
! can't free the old one (it's in the psymbol_obstack). So we just
! waste some memory. */
objfile->sections_end = 0;
bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile);
objfile->sections = (struct obj_section *)
! obstack_finish (&objfile->psymbol_obstack);
objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
return (0);
}
--- 121,137 ----
{
/* objfile->sections can be already set when reading a mapped symbol
file. I believe that we do need to rebuild the section table in
! this case (we rebuild other things derived from the bfd).
! DJB - 05-27-2001
! It's in the misc_obstack now, feel free to do what you need to.
! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which
! I think is all the stuff you want to blow away anyway.
! */
objfile->sections_end = 0;
bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile);
objfile->sections = (struct obj_section *)
! obstack_finish (&objfile->misc_obstack);
objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
return (0);
}
*************** allocate_objfile (bfd *abfd, int flags)
*** 188,193 ****
--- 191,198 ----
/* Update pointers to functions to *our* copies */
obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc);
obstack_freefun (&objfile->psymbol_cache.cache, mfree);
+ obstack_chunkfun (&objfile->misc_obstack, xmmalloc);
+ obstack_freefun (&objfile->misc_obstack, mfree);
obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc);
obstack_freefun (&objfile->psymbol_obstack, mfree);
obstack_chunkfun (&objfile->symbol_obstack, xmmalloc);
*************** allocate_objfile (bfd *abfd, int flags)
*** 218,223 ****
--- 223,231 ----
obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache,
0, 0, xmmalloc, mfree,
objfile->md);
+ obstack_specify_allocation_with_arg (&objfile->misc_obstack,
+ 0, 0, xmmalloc, mfree,
+ objfile->md);
obstack_specify_allocation_with_arg (&objfile->psymbol_obstack,
0, 0, xmmalloc, mfree,
objfile->md);
*************** allocate_objfile (bfd *abfd, int flags)
*** 264,269 ****
--- 272,279 ----
objfile->md = NULL;
obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0,
xmalloc, xfree);
+ obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc,
+ xfree);
obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc,
xfree);
obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc,
*************** free_objfile (struct objfile *objfile)
*** 475,480 ****
--- 485,491 ----
mfree (objfile->md, objfile->static_psymbols.list);
/* Free the obstacks for non-reusable objfiles */
free_bcache (&objfile->psymbol_cache);
+ obstack_free (&objfile->misc_obstack, 0);
obstack_free (&objfile->psymbol_obstack, 0);
obstack_free (&objfile->symbol_obstack, 0);
obstack_free (&objfile->type_obstack, 0);
Index: objfiles.h
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.h,v
retrieving revision 1.8
diff -c -3 -p -w -B -b -r1.8 objfiles.h
*** objfiles.h 2001/03/06 08:21:11 1.8
--- objfiles.h 2001/05/29 17:28:00
*************** struct objfile
*** 269,274 ****
--- 269,275 ----
/* Obstacks to hold objects that should be freed when we load a new symbol
table from this object file. */
+ struct obstack misc_obstack; /* Misc stuff */
struct obstack psymbol_obstack; /* Partial symbols */
struct obstack symbol_obstack; /* Full symbols */
struct obstack type_obstack; /* Types */
--
"I used to be a narrator for bad mimes.
"-Steven Wright
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFA]: Add misc_obstack to object files. 2001-05-29 10:31 [RFA]: Add misc_obstack to object files Daniel Berlin @ 2001-06-25 13:59 ` Elena Zannoni 2001-06-25 19:07 ` Daniel Berlin 0 siblings, 1 reply; 8+ messages in thread From: Elena Zannoni @ 2001-06-25 13:59 UTC (permalink / raw) To: Daniel Berlin; +Cc: gdb-patches Daniel Berlin writes: > > This way, we stop putting things in the psymbol_obstack that don't > belong. > Dan, can you elaborate a bit on why we need this? Why are you removing the partial symbol table from the psymbol_objstack? Was this intended? There are several other things that get allocated on the psymbol_objstack, for instance look in xcoffread.c, somread.c, etc. Why just remove the section offset stuff? If your intent was to change the allocation of the section offset information, from psymbol_obstack to misc_obstack, why not modify also the same allocations done in xcoffread.c, elfread.c, somread.c? Thanks Elena > 2001-05-27 Daniel Berlin <dan@cgsoftware.com> > > * symfile.c (default_symfile_offsets): Allocate in misc_obstack. > (reread_symbols): Handle misc_obstack too, and use it where > psymbol_obstack didn't belong. > (allocate_psymtab): Ditto. > > * objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack. > (build_objfile_section_table): Ditto. > (free_objfile): Free the misc_obstack. > (allocate_objfile): Setup misc_obstack too. > > * objfiles.h: Add misc_obstack to object file. > > Index: symfile.c > =================================================================== > RCS file: /cvs/src/src/gdb/symfile.c,v > retrieving revision 1.32 > diff -c -3 -p -w -B -b -r1.32 symfile.c > *** symfile.c 2001/05/10 15:33:21 1.32 > --- symfile.c 2001/05/29 17:27:51 > *************** default_symfile_offsets (struct objfile > *** 500,506 **** > > objfile->num_sections = SECT_OFF_MAX; > objfile->section_offsets = (struct section_offsets *) > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > /* Now calculate offsets for section that were specified by the > --- 500,506 ---- > > objfile->num_sections = SECT_OFF_MAX; > objfile->section_offsets = (struct section_offsets *) > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > /* Now calculate offsets for section that were specified by the > *************** reread_symbols (void) > *** 1679,1684 **** > --- 1679,1685 ---- > > /* Free the obstacks for non-reusable objfiles */ > free_bcache (&objfile->psymbol_cache); > + obstack_free (&objfile->misc_obstack, 0); > obstack_free (&objfile->psymbol_obstack, 0); > obstack_free (&objfile->symbol_obstack, 0); > obstack_free (&objfile->type_obstack, 0); > *************** reread_symbols (void) > *** 1704,1709 **** > --- 1705,1712 ---- > it is empty. */ > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > xmalloc, xfree); > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, > + xmalloc, xfree); > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, > xmalloc, xfree); > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, > *************** reread_symbols (void) > *** 1719,1725 **** > /* We use the same section offsets as from last time. I'm not > sure whether that is always correct for shared libraries. */ > objfile->section_offsets = (struct section_offsets *) > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > objfile->num_sections = num_offsets; > > --- 1722,1728 ---- > /* We use the same section offsets as from last time. I'm not > sure whether that is always correct for shared libraries. */ > objfile->section_offsets = (struct section_offsets *) > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > objfile->num_sections = num_offsets; > > *************** allocate_psymtab (char *filename, struct > *** 1981,1993 **** > objfile->free_psymtabs = psymtab->next; > } > else > ! psymtab = (struct partial_symtab *) > ! obstack_alloc (&objfile->psymbol_obstack, > ! sizeof (struct partial_symtab)); > > memset (psymtab, 0, sizeof (struct partial_symtab)); > ! psymtab->filename = obsavestring (filename, strlen (filename), > ! &objfile->psymbol_obstack); > psymtab->symtab = NULL; > > /* Prepend it to the psymtab list for the objfile it belongs to. > --- 1984,1993 ---- > objfile->free_psymtabs = psymtab->next; > } > else > ! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab)); > > memset (psymtab, 0, sizeof (struct partial_symtab)); > ! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack); > psymtab->symtab = NULL; > > /* Prepend it to the psymtab list for the objfile it belongs to. > Index: objfiles.c > =================================================================== > RCS file: /cvs/src/src/gdb/objfiles.c,v > retrieving revision 1.15 > diff -c -3 -p -w -B -b -r1.15 objfiles.c > *** objfiles.c 2001/03/06 08:21:11 1.15 > --- objfiles.c 2001/05/29 17:27:57 > *************** add_to_objfile_sections (bfd *abfd, sec_ > *** 96,102 **** > section.ovly_mapped = 0; > section.addr = bfd_section_vma (abfd, asect); > section.endaddr = section.addr + bfd_section_size (abfd, asect); > ! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section)); > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > } > > --- 96,102 ---- > section.ovly_mapped = 0; > section.addr = bfd_section_vma (abfd, asect); > section.endaddr = section.addr + bfd_section_size (abfd, asect); > ! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section)); > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > } > > *************** build_objfile_section_table (struct objf > *** 121,134 **** > { > /* objfile->sections can be already set when reading a mapped symbol > file. I believe that we do need to rebuild the section table in > ! this case (we rebuild other things derived from the bfd), but we > ! can't free the old one (it's in the psymbol_obstack). So we just > ! waste some memory. */ > > objfile->sections_end = 0; > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > objfile->sections = (struct obj_section *) > ! obstack_finish (&objfile->psymbol_obstack); > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > return (0); > } > --- 121,137 ---- > { > /* objfile->sections can be already set when reading a mapped symbol > file. I believe that we do need to rebuild the section table in > ! this case (we rebuild other things derived from the bfd). > ! DJB - 05-27-2001 > ! It's in the misc_obstack now, feel free to do what you need to. > ! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which > ! I think is all the stuff you want to blow away anyway. > ! */ > > objfile->sections_end = 0; > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > objfile->sections = (struct obj_section *) > ! obstack_finish (&objfile->misc_obstack); > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > return (0); > } > *************** allocate_objfile (bfd *abfd, int flags) > *** 188,193 **** > --- 191,198 ---- > /* Update pointers to functions to *our* copies */ > obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); > obstack_freefun (&objfile->psymbol_cache.cache, mfree); > + obstack_chunkfun (&objfile->misc_obstack, xmmalloc); > + obstack_freefun (&objfile->misc_obstack, mfree); > obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); > obstack_freefun (&objfile->psymbol_obstack, mfree); > obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); > *************** allocate_objfile (bfd *abfd, int flags) > *** 218,223 **** > --- 223,231 ---- > obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, > 0, 0, xmmalloc, mfree, > objfile->md); > + obstack_specify_allocation_with_arg (&objfile->misc_obstack, > + 0, 0, xmmalloc, mfree, > + objfile->md); > obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, > 0, 0, xmmalloc, mfree, > objfile->md); > *************** allocate_objfile (bfd *abfd, int flags) > *** 264,269 **** > --- 272,279 ---- > objfile->md = NULL; > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > xmalloc, xfree); > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc, > + xfree); > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc, > xfree); > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc, > *************** free_objfile (struct objfile *objfile) > *** 475,480 **** > --- 485,491 ---- > mfree (objfile->md, objfile->static_psymbols.list); > /* Free the obstacks for non-reusable objfiles */ > free_bcache (&objfile->psymbol_cache); > + obstack_free (&objfile->misc_obstack, 0); > obstack_free (&objfile->psymbol_obstack, 0); > obstack_free (&objfile->symbol_obstack, 0); > obstack_free (&objfile->type_obstack, 0); > Index: objfiles.h > =================================================================== > RCS file: /cvs/src/src/gdb/objfiles.h,v > retrieving revision 1.8 > diff -c -3 -p -w -B -b -r1.8 objfiles.h > *** objfiles.h 2001/03/06 08:21:11 1.8 > --- objfiles.h 2001/05/29 17:28:00 > *************** struct objfile > *** 269,274 **** > --- 269,275 ---- > /* Obstacks to hold objects that should be freed when we load a new symbol > table from this object file. */ > > + struct obstack misc_obstack; /* Misc stuff */ > struct obstack psymbol_obstack; /* Partial symbols */ > struct obstack symbol_obstack; /* Full symbols */ > struct obstack type_obstack; /* Types */ > > -- > "I used to be a narrator for bad mimes. > "-Steven Wright > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. 2001-06-25 13:59 ` Elena Zannoni @ 2001-06-25 19:07 ` Daniel Berlin 2001-06-25 20:49 ` Elena Zannoni 0 siblings, 1 reply; 8+ messages in thread From: Daniel Berlin @ 2001-06-25 19:07 UTC (permalink / raw) To: Elena Zannoni; +Cc: Daniel Berlin, gdb-patches Elena Zannoni <ezannoni@cygnus.com> writes: > Daniel Berlin writes: > > > > This way, we stop putting things in the psymbol_obstack that don't > > belong. > > > > Dan, can you elaborate a bit on why we need this? Because these things don't belong in the psymbol obstack. They are section offsets, not partial symbols. > Why are you removing > the partial symbol table from the psymbol_objstack? I'm not. At all in fact. I'm specifically trying to make it so *all* that is in the psymbol_obstack is the partial symbol table. we've been stuffing random stuff like section offsets into the psymbol_obstack, because it was handy. This is wrong. If we need a misc place to put info like section offsets, that isn't large enough to deserve it's own obstack on it's own, then all the misc stuff together should go in a misc_obstack. > Was this intended? > There are several other things that get allocated on the > psymbol_objstack, for instance look in xcoffread.c, somread.c, > etc. Why just remove the section offset stuff? Because I haven't gotten to the others yet. And there is no harm in taking time to make sure it gets done right. > > If your intent was to change the allocation of the section offset > information, from psymbol_obstack to misc_obstack, why not modify also > the same allocations done in xcoffread.c, elfread.c, somread.c? Because i haven't gotten there yet. :) I did it as I saw them. In actuality, what i was doing was freeing the psymbol obstack when we were completely done with partial symbols, and seeing what broke. They never broke, so i never noticed them. When i submit a large patch that does all this in one fell swoop, someone would say to break it down. So consider this a first step, rather than a done deal. > > Thanks > Elena > > > > 2001-05-27 Daniel Berlin <dan@cgsoftware.com> > > > > * symfile.c (default_symfile_offsets): Allocate in misc_obstack. > > (reread_symbols): Handle misc_obstack too, and use it where > > psymbol_obstack didn't belong. > > (allocate_psymtab): Ditto. > > > > * objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack. > > (build_objfile_section_table): Ditto. > > (free_objfile): Free the misc_obstack. > > (allocate_objfile): Setup misc_obstack too. > > > > * objfiles.h: Add misc_obstack to object file. > > > > Index: symfile.c > > =================================================================== > > RCS file: /cvs/src/src/gdb/symfile.c,v > > retrieving revision 1.32 > > diff -c -3 -p -w -B -b -r1.32 symfile.c > > *** symfile.c 2001/05/10 15:33:21 1.32 > > --- symfile.c 2001/05/29 17:27:51 > > *************** default_symfile_offsets (struct objfile > > *** 500,506 **** > > > > objfile->num_sections = SECT_OFF_MAX; > > objfile->section_offsets = (struct section_offsets *) > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > /* Now calculate offsets for section that were specified by the > > --- 500,506 ---- > > > > objfile->num_sections = SECT_OFF_MAX; > > objfile->section_offsets = (struct section_offsets *) > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > /* Now calculate offsets for section that were specified by the > > *************** reread_symbols (void) > > *** 1679,1684 **** > > --- 1679,1685 ---- > > > > /* Free the obstacks for non-reusable objfiles */ > > free_bcache (&objfile->psymbol_cache); > > + obstack_free (&objfile->misc_obstack, 0); > > obstack_free (&objfile->psymbol_obstack, 0); > > obstack_free (&objfile->symbol_obstack, 0); > > obstack_free (&objfile->type_obstack, 0); > > *************** reread_symbols (void) > > *** 1704,1709 **** > > --- 1705,1712 ---- > > it is empty. */ > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > xmalloc, xfree); > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, > > + xmalloc, xfree); > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, > > xmalloc, xfree); > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, > > *************** reread_symbols (void) > > *** 1719,1725 **** > > /* We use the same section offsets as from last time. I'm not > > sure whether that is always correct for shared libraries. */ > > objfile->section_offsets = (struct section_offsets *) > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > objfile->num_sections = num_offsets; > > > > --- 1722,1728 ---- > > /* We use the same section offsets as from last time. I'm not > > sure whether that is always correct for shared libraries. */ > > objfile->section_offsets = (struct section_offsets *) > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > objfile->num_sections = num_offsets; > > > > *************** allocate_psymtab (char *filename, struct > > *** 1981,1993 **** > > objfile->free_psymtabs = psymtab->next; > > } > > else > > ! psymtab = (struct partial_symtab *) > > ! obstack_alloc (&objfile->psymbol_obstack, > > ! sizeof (struct partial_symtab)); > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > ! psymtab->filename = obsavestring (filename, strlen (filename), > > ! &objfile->psymbol_obstack); > > psymtab->symtab = NULL; > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > --- 1984,1993 ---- > > objfile->free_psymtabs = psymtab->next; > > } > > else > > ! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab)); > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > ! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack); > > psymtab->symtab = NULL; > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > Index: objfiles.c > > =================================================================== > > RCS file: /cvs/src/src/gdb/objfiles.c,v > > retrieving revision 1.15 > > diff -c -3 -p -w -B -b -r1.15 objfiles.c > > *** objfiles.c 2001/03/06 08:21:11 1.15 > > --- objfiles.c 2001/05/29 17:27:57 > > *************** add_to_objfile_sections (bfd *abfd, sec_ > > *** 96,102 **** > > section.ovly_mapped = 0; > > section.addr = bfd_section_vma (abfd, asect); > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > ! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section)); > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > } > > > > --- 96,102 ---- > > section.ovly_mapped = 0; > > section.addr = bfd_section_vma (abfd, asect); > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > ! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section)); > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > } > > > > *************** build_objfile_section_table (struct objf > > *** 121,134 **** > > { > > /* objfile->sections can be already set when reading a mapped symbol > > file. I believe that we do need to rebuild the section table in > > ! this case (we rebuild other things derived from the bfd), but we > > ! can't free the old one (it's in the psymbol_obstack). So we just > > ! waste some memory. */ > > > > objfile->sections_end = 0; > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > objfile->sections = (struct obj_section *) > > ! obstack_finish (&objfile->psymbol_obstack); > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > return (0); > > } > > --- 121,137 ---- > > { > > /* objfile->sections can be already set when reading a mapped symbol > > file. I believe that we do need to rebuild the section table in > > ! this case (we rebuild other things derived from the bfd). > > ! DJB - 05-27-2001 > > ! It's in the misc_obstack now, feel free to do what you need to. > > ! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which > > ! I think is all the stuff you want to blow away anyway. > > ! */ > > > > objfile->sections_end = 0; > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > objfile->sections = (struct obj_section *) > > ! obstack_finish (&objfile->misc_obstack); > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > return (0); > > } > > *************** allocate_objfile (bfd *abfd, int flags) > > *** 188,193 **** > > --- 191,198 ---- > > /* Update pointers to functions to *our* copies */ > > obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); > > obstack_freefun (&objfile->psymbol_cache.cache, mfree); > > + obstack_chunkfun (&objfile->misc_obstack, xmmalloc); > > + obstack_freefun (&objfile->misc_obstack, mfree); > > obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); > > obstack_freefun (&objfile->psymbol_obstack, mfree); > > obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); > > *************** allocate_objfile (bfd *abfd, int flags) > > *** 218,223 **** > > --- 223,231 ---- > > obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, > > 0, 0, xmmalloc, mfree, > > objfile->md); > > + obstack_specify_allocation_with_arg (&objfile->misc_obstack, > > + 0, 0, xmmalloc, mfree, > > + objfile->md); > > obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, > > 0, 0, xmmalloc, mfree, > > objfile->md); > > *************** allocate_objfile (bfd *abfd, int flags) > > *** 264,269 **** > > --- 272,279 ---- > > objfile->md = NULL; > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > xmalloc, xfree); > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc, > > + xfree); > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc, > > xfree); > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc, > > *************** free_objfile (struct objfile *objfile) > > *** 475,480 **** > > --- 485,491 ---- > > mfree (objfile->md, objfile->static_psymbols.list); > > /* Free the obstacks for non-reusable objfiles */ > > free_bcache (&objfile->psymbol_cache); > > + obstack_free (&objfile->misc_obstack, 0); > > obstack_free (&objfile->psymbol_obstack, 0); > > obstack_free (&objfile->symbol_obstack, 0); > > obstack_free (&objfile->type_obstack, 0); > > Index: objfiles.h > > =================================================================== > > RCS file: /cvs/src/src/gdb/objfiles.h,v > > retrieving revision 1.8 > > diff -c -3 -p -w -B -b -r1.8 objfiles.h > > *** objfiles.h 2001/03/06 08:21:11 1.8 > > --- objfiles.h 2001/05/29 17:28:00 > > *************** struct objfile > > *** 269,274 **** > > --- 269,275 ---- > > /* Obstacks to hold objects that should be freed when we load a new symbol > > table from this object file. */ > > > > + struct obstack misc_obstack; /* Misc stuff */ > > struct obstack psymbol_obstack; /* Partial symbols */ > > struct obstack symbol_obstack; /* Full symbols */ > > struct obstack type_obstack; /* Types */ > > > > -- > > "I used to be a narrator for bad mimes. > > "-Steven Wright > > -- "I went into a clothes store the other day and a salesman walked up to me and said, "Can I help you?" and I said "Yeah, do you got anything I like?" He said, "What do you mean do we have anything you like?" I said, "You started this." "-Steven Wright ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. 2001-06-25 19:07 ` Daniel Berlin @ 2001-06-25 20:49 ` Elena Zannoni 2001-06-25 21:12 ` Daniel Berlin 0 siblings, 1 reply; 8+ messages in thread From: Elena Zannoni @ 2001-06-25 20:49 UTC (permalink / raw) To: Daniel Berlin; +Cc: Elena Zannoni, gdb-patches Daniel Berlin writes: > Elena Zannoni <ezannoni@cygnus.com> writes: > > > Daniel Berlin writes: > > > > > > This way, we stop putting things in the psymbol_obstack that don't > > > belong. > > > > > > > Dan, can you elaborate a bit on why we need this? > Because these things don't belong in the psymbol obstack. > They are section offsets, not partial symbols. > Dan, I am really sorry, but still I cannot see a real reason for this change emerging from your mail. You are doing this in response to some bug you saw, I assume, but what that bug is has not been explained. Quoting src/gdb/CONTRIBUTE: o Submitting Patches Every patch must have several pieces of information before we can properly evaluate it. A description of the bug and how your patch fixes this bug. A reference to a testsuite failure is very helpful. For new features a description of the feature and your implementation. [....] Supplemental information for GDB: o Please try to run the relevant testsuite before and after committing a patch If the contributor doesn't do it then the maintainer will. A contributor might include before/after test results in their contribution. o For bug fixes, please try to include a way of demonstrating that the patch actually fixes something. The best way of doing this is to ensure that the testsuite contains one or more test cases that fail without the fix but pass with the fix. People are encouraged to submit patches that extend the testsuite. o Please read your patch before submitting it. A patch containing several unrelated changes or arbitrary reformats will be returned with a request to re-formatting / split it. > > Why are you removing > > the partial symbol table from the psymbol_objstack? > I'm not. At all in fact. > I'm specifically trying to make it so *all* that is in the > psymbol_obstack is the partial symbol table. > we've been stuffing random stuff like section offsets into the > psymbol_obstack, because it was handy. > This is wrong. > If we need a misc place to put info like section offsets, that isn't > large enough to deserve it's own obstack on it's own, then all the > misc stuff together should go in a misc_obstack. Then your patch includes a diff that is unrelated. > > > Was this intended? > > There are several other things that get allocated on the > > psymbol_objstack, for instance look in xcoffread.c, somread.c, > > etc. Why just remove the section offset stuff? > Because I haven't gotten to the others yet. > And there is no harm in taking time to make sure it gets done right. > If you have a roadmap in mind, you should explain it when you submit the patch. > > > > If your intent was to change the allocation of the section offset > > information, from psymbol_obstack to misc_obstack, why not modify also > > the same allocations done in xcoffread.c, elfread.c, somread.c? > Because i haven't gotten there yet. > :) > I did it as I saw them. > > In actuality, what i was doing was freeing the psymbol obstack when we > were completely done with partial symbols, and seeing what broke. > They never broke, so i never noticed them. > > When i submit a large patch that does all this in one fell swoop, > someone would say to break it down. > So consider this a first step, rather than a done deal. > I am encouraging you to resubmit the patch accompanied by coherent explanation and rationale. Elena > > > > Thanks > > Elena > > > > > > > 2001-05-27 Daniel Berlin <dan@cgsoftware.com> > > > > > > * symfile.c (default_symfile_offsets): Allocate in misc_obstack. > > > (reread_symbols): Handle misc_obstack too, and use it where > > > psymbol_obstack didn't belong. > > > (allocate_psymtab): Ditto. > > > > > > * objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack. > > > (build_objfile_section_table): Ditto. > > > (free_objfile): Free the misc_obstack. > > > (allocate_objfile): Setup misc_obstack too. > > > > > > * objfiles.h: Add misc_obstack to object file. > > > > > > Index: symfile.c > > > =================================================================== > > > RCS file: /cvs/src/src/gdb/symfile.c,v > > > retrieving revision 1.32 > > > diff -c -3 -p -w -B -b -r1.32 symfile.c > > > *** symfile.c 2001/05/10 15:33:21 1.32 > > > --- symfile.c 2001/05/29 17:27:51 > > > *************** default_symfile_offsets (struct objfile > > > *** 500,506 **** > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > objfile->section_offsets = (struct section_offsets *) > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > /* Now calculate offsets for section that were specified by the > > > --- 500,506 ---- > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > objfile->section_offsets = (struct section_offsets *) > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > /* Now calculate offsets for section that were specified by the > > > *************** reread_symbols (void) > > > *** 1679,1684 **** > > > --- 1679,1685 ---- > > > > > > /* Free the obstacks for non-reusable objfiles */ > > > free_bcache (&objfile->psymbol_cache); > > > + obstack_free (&objfile->misc_obstack, 0); > > > obstack_free (&objfile->psymbol_obstack, 0); > > > obstack_free (&objfile->symbol_obstack, 0); > > > obstack_free (&objfile->type_obstack, 0); > > > *************** reread_symbols (void) > > > *** 1704,1709 **** > > > --- 1705,1712 ---- > > > it is empty. */ > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > xmalloc, xfree); > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, > > > + xmalloc, xfree); > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, > > > xmalloc, xfree); > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, > > > *************** reread_symbols (void) > > > *** 1719,1725 **** > > > /* We use the same section offsets as from last time. I'm not > > > sure whether that is always correct for shared libraries. */ > > > objfile->section_offsets = (struct section_offsets *) > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > objfile->num_sections = num_offsets; > > > > > > --- 1722,1728 ---- > > > /* We use the same section offsets as from last time. I'm not > > > sure whether that is always correct for shared libraries. */ > > > objfile->section_offsets = (struct section_offsets *) > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > objfile->num_sections = num_offsets; > > > > > > *************** allocate_psymtab (char *filename, struct > > > *** 1981,1993 **** > > > objfile->free_psymtabs = psymtab->next; > > > } > > > else > > > ! psymtab = (struct partial_symtab *) > > > ! obstack_alloc (&objfile->psymbol_obstack, > > > ! sizeof (struct partial_symtab)); > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > ! psymtab->filename = obsavestring (filename, strlen (filename), > > > ! &objfile->psymbol_obstack); > > > psymtab->symtab = NULL; > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > --- 1984,1993 ---- > > > objfile->free_psymtabs = psymtab->next; > > > } > > > else > > > ! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab)); > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > ! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack); > > > psymtab->symtab = NULL; > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > Index: objfiles.c > > > =================================================================== > > > RCS file: /cvs/src/src/gdb/objfiles.c,v > > > retrieving revision 1.15 > > > diff -c -3 -p -w -B -b -r1.15 objfiles.c > > > *** objfiles.c 2001/03/06 08:21:11 1.15 > > > --- objfiles.c 2001/05/29 17:27:57 > > > *************** add_to_objfile_sections (bfd *abfd, sec_ > > > *** 96,102 **** > > > section.ovly_mapped = 0; > > > section.addr = bfd_section_vma (abfd, asect); > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > ! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section)); > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > } > > > > > > --- 96,102 ---- > > > section.ovly_mapped = 0; > > > section.addr = bfd_section_vma (abfd, asect); > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > ! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section)); > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > } > > > > > > *************** build_objfile_section_table (struct objf > > > *** 121,134 **** > > > { > > > /* objfile->sections can be already set when reading a mapped symbol > > > file. I believe that we do need to rebuild the section table in > > > ! this case (we rebuild other things derived from the bfd), but we > > > ! can't free the old one (it's in the psymbol_obstack). So we just > > > ! waste some memory. */ > > > > > > objfile->sections_end = 0; > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > objfile->sections = (struct obj_section *) > > > ! obstack_finish (&objfile->psymbol_obstack); > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > return (0); > > > } > > > --- 121,137 ---- > > > { > > > /* objfile->sections can be already set when reading a mapped symbol > > > file. I believe that we do need to rebuild the section table in > > > ! this case (we rebuild other things derived from the bfd). > > > ! DJB - 05-27-2001 > > > ! It's in the misc_obstack now, feel free to do what you need to. > > > ! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which > > > ! I think is all the stuff you want to blow away anyway. > > > ! */ > > > > > > objfile->sections_end = 0; > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > objfile->sections = (struct obj_section *) > > > ! obstack_finish (&objfile->misc_obstack); > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > return (0); > > > } > > > *************** allocate_objfile (bfd *abfd, int flags) > > > *** 188,193 **** > > > --- 191,198 ---- > > > /* Update pointers to functions to *our* copies */ > > > obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); > > > obstack_freefun (&objfile->psymbol_cache.cache, mfree); > > > + obstack_chunkfun (&objfile->misc_obstack, xmmalloc); > > > + obstack_freefun (&objfile->misc_obstack, mfree); > > > obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); > > > obstack_freefun (&objfile->psymbol_obstack, mfree); > > > obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); > > > *************** allocate_objfile (bfd *abfd, int flags) > > > *** 218,223 **** > > > --- 223,231 ---- > > > obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, > > > 0, 0, xmmalloc, mfree, > > > objfile->md); > > > + obstack_specify_allocation_with_arg (&objfile->misc_obstack, > > > + 0, 0, xmmalloc, mfree, > > > + objfile->md); > > > obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, > > > 0, 0, xmmalloc, mfree, > > > objfile->md); > > > *************** allocate_objfile (bfd *abfd, int flags) > > > *** 264,269 **** > > > --- 272,279 ---- > > > objfile->md = NULL; > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > xmalloc, xfree); > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc, > > > + xfree); > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc, > > > xfree); > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc, > > > *************** free_objfile (struct objfile *objfile) > > > *** 475,480 **** > > > --- 485,491 ---- > > > mfree (objfile->md, objfile->static_psymbols.list); > > > /* Free the obstacks for non-reusable objfiles */ > > > free_bcache (&objfile->psymbol_cache); > > > + obstack_free (&objfile->misc_obstack, 0); > > > obstack_free (&objfile->psymbol_obstack, 0); > > > obstack_free (&objfile->symbol_obstack, 0); > > > obstack_free (&objfile->type_obstack, 0); > > > Index: objfiles.h > > > =================================================================== > > > RCS file: /cvs/src/src/gdb/objfiles.h,v > > > retrieving revision 1.8 > > > diff -c -3 -p -w -B -b -r1.8 objfiles.h > > > *** objfiles.h 2001/03/06 08:21:11 1.8 > > > --- objfiles.h 2001/05/29 17:28:00 > > > *************** struct objfile > > > *** 269,274 **** > > > --- 269,275 ---- > > > /* Obstacks to hold objects that should be freed when we load a new symbol > > > table from this object file. */ > > > > > > + struct obstack misc_obstack; /* Misc stuff */ > > > struct obstack psymbol_obstack; /* Partial symbols */ > > > struct obstack symbol_obstack; /* Full symbols */ > > > struct obstack type_obstack; /* Types */ > > > > > > -- > > > "I used to be a narrator for bad mimes. > > > "-Steven Wright > > > > > -- > "I went into a clothes store the other day and a salesman walked > up to me and said, "Can I help you?" and I said "Yeah, do you > got anything I like?" He said, "What do you mean do we have > anything you like?" I said, "You started this." > "-Steven Wright > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. 2001-06-25 20:49 ` Elena Zannoni @ 2001-06-25 21:12 ` Daniel Berlin 2001-06-25 22:34 ` Elena Zannoni 0 siblings, 1 reply; 8+ messages in thread From: Daniel Berlin @ 2001-06-25 21:12 UTC (permalink / raw) To: Elena Zannoni; +Cc: Daniel Berlin, gdb-patches Elena Zannoni <ezannoni@cygnus.com> writes: > Daniel Berlin writes: > > Elena Zannoni <ezannoni@cygnus.com> writes: > > > > > Daniel Berlin writes: > > > > > > > > This way, we stop putting things in the psymbol_obstack that don't > > > > belong. > > > > > > > > > > Dan, can you elaborate a bit on why we need this? > > Because these things don't belong in the psymbol obstack. > > They are section offsets, not partial symbols. > > > > Dan, I am really sorry, but still I cannot see a real reason for this > change emerging from your mail. Um. Okay. According to objfiles.h: struct obstack psymbol_obstack; /* Partial symbols */ struct obstack symbol_obstack; /* Full symbols */ struct obstack type_obstack; /* Types */ Notice it doesn't say that section offsets, or other random junk, should be on the psymbol_obstack. It says "Partial symbols". Now, if you want to remove the partial symbols, for that object file, theoretically, you just remove the psymbol_obstack. However, because we allocate other random things, like section offset tables, etc, which have zip to do with partial symbols, on that obstack, we won't remove just the partial symbols by removing that obstack. We'll blow away the section offset table, the psymtab structures, etc. This should not be occurring. It makes as much sense as allocating object file section offsets on the type_obstack, which is for types only. That is to say, none. It's the equivalent of having a trash bin marked "white paper only", and having people knowing throw all kinds of colored paper in there, for lack of a better place to throw colored paper. They don't belong. Not only that, but if you later wanted to remove the white paper, you'd have to sort out the colored paper, and do something with it, first. I'm just adding a bin for colored paper, so people will put that stuff in there instead in the first place, and it will be plainly clear that they are supposed to be doing so. > You are doing this in response to some bug you saw, I assume, but what that > bug is has not been explained. No, i'm doing it because partial symbols belong on the psymbol obstack, but section offsets, and other random things don't. In practice, we've not followed this, because nobody bothered to create somewhere *else* to put them. I'm attempting to bring us to doing what we should have been doing in the first place, by creating this place to put them. Had I been trying to fix a bug, i would explain what the bug was, and where it showed up. This is not a bug, in that nothing is specifically *broken*. It's perfectly okay to allocate these structures on that obstack, given that gdb never frees the obstack, it's just not in line with what the comments say, and the purpose of the psymbol obstack. > > > > > Why are you removing > > > the partial symbol table from the psymbol_objstack? > > I'm not. At all in fact. > > I'm specifically trying to make it so *all* that is in the > > psymbol_obstack is the partial symbol table. > > we've been stuffing random stuff like section offsets into the > > psymbol_obstack, because it was handy. > > This is wrong. > > If we need a misc place to put info like section offsets, that isn't > > large enough to deserve it's own obstack on it's own, then all the > > misc stuff together should go in a misc_obstack. > > Then your patch includes a diff that is unrelated. Um, how so? Please point out the portion of the diff unrelated. The only thing even related to psymtabs there is the fact that they psymtab structure itself is allocated on the misc obstack, since it isn't a partial symbol either. It's a partial symbol table structure, containing pointers to partial symbols. The actual partial symbols that fill that table are still allocated on the psymbol_obstack. As they should be. > > > > > > Was this intended? > > > There are several other things that get allocated on the > > > psymbol_objstack, for instance look in xcoffread.c, somread.c, > > > etc. Why just remove the section offset stuff? > > Because I haven't gotten to the others yet. > > And there is no harm in taking time to make sure it gets done right. > > > > If you have a roadmap in mind, you should explain it when you submit > the patch. I have no roadmap for when i'd be getting to that. Eventually. I could do them all now if it helps, but it'll make the patch bigger. > > > > > > > If your intent was to change the allocation of the section offset > > > information, from psymbol_obstack to misc_obstack, why not modify also > > > the same allocations done in xcoffread.c, elfread.c, somread.c? > > Because i haven't gotten there yet. > > :) > > I did it as I saw them. > > > > In actuality, what i was doing was freeing the psymbol obstack when we > > were completely done with partial symbols, and seeing what broke. > > They never broke, so i never noticed them. > > > > When i submit a large patch that does all this in one fell swoop, > > someone would say to break it down. > > So consider this a first step, rather than a done deal. > > > > I am encouraging you to resubmit the patch accompanied by coherent > explanation and rationale. I believe you are misunderstanding the purpose of the patch, and what it does, or some portion of it. Please let me know if the above doesn't clear it up. > > Elena > > > > > > > > Thanks > > > Elena > > > > > > > > > > 2001-05-27 Daniel Berlin <dan@cgsoftware.com> > > > > > > > > * symfile.c (default_symfile_offsets): Allocate in misc_obstack. > > > > (reread_symbols): Handle misc_obstack too, and use it where > > > > psymbol_obstack didn't belong. > > > > (allocate_psymtab): Ditto. > > > > > > > > * objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack. > > > > (build_objfile_section_table): Ditto. > > > > (free_objfile): Free the misc_obstack. > > > > (allocate_objfile): Setup misc_obstack too. > > > > > > > > * objfiles.h: Add misc_obstack to object file. > > > > > > > > Index: symfile.c > > > > =================================================================== > > > > RCS file: /cvs/src/src/gdb/symfile.c,v > > > > retrieving revision 1.32 > > > > diff -c -3 -p -w -B -b -r1.32 symfile.c > > > > *** symfile.c 2001/05/10 15:33:21 1.32 > > > > --- symfile.c 2001/05/29 17:27:51 > > > > *************** default_symfile_offsets (struct objfile > > > > *** 500,506 **** > > > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > > objfile->section_offsets = (struct section_offsets *) > > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > > > /* Now calculate offsets for section that were specified by the > > > > --- 500,506 ---- > > > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > > objfile->section_offsets = (struct section_offsets *) > > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > > > /* Now calculate offsets for section that were specified by the > > > > *************** reread_symbols (void) > > > > *** 1679,1684 **** > > > > --- 1679,1685 ---- > > > > > > > > /* Free the obstacks for non-reusable objfiles */ > > > > free_bcache (&objfile->psymbol_cache); > > > > + obstack_free (&objfile->misc_obstack, 0); > > > > obstack_free (&objfile->psymbol_obstack, 0); > > > > obstack_free (&objfile->symbol_obstack, 0); > > > > obstack_free (&objfile->type_obstack, 0); > > > > *************** reread_symbols (void) > > > > *** 1704,1709 **** > > > > --- 1705,1712 ---- > > > > it is empty. */ > > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > > xmalloc, xfree); > > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, > > > > + xmalloc, xfree); > > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, > > > > xmalloc, xfree); > > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, > > > > *************** reread_symbols (void) > > > > *** 1719,1725 **** > > > > /* We use the same section offsets as from last time. I'm not > > > > sure whether that is always correct for shared libraries. */ > > > > objfile->section_offsets = (struct section_offsets *) > > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > > objfile->num_sections = num_offsets; > > > > > > > > --- 1722,1728 ---- > > > > /* We use the same section offsets as from last time. I'm not > > > > sure whether that is always correct for shared libraries. */ > > > > objfile->section_offsets = (struct section_offsets *) > > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > > objfile->num_sections = num_offsets; > > > > > > > > *************** allocate_psymtab (char *filename, struct > > > > *** 1981,1993 **** > > > > objfile->free_psymtabs = psymtab->next; > > > > } > > > > else > > > > ! psymtab = (struct partial_symtab *) > > > > ! obstack_alloc (&objfile->psymbol_obstack, > > > > ! sizeof (struct partial_symtab)); > > > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > > ! psymtab->filename = obsavestring (filename, strlen (filename), > > > > ! &objfile->psymbol_obstack); > > > > psymtab->symtab = NULL; > > > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > > --- 1984,1993 ---- > > > > objfile->free_psymtabs = psymtab->next; > > > > } > > > > else > > > > ! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab)); > > > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > > ! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack); > > > > psymtab->symtab = NULL; > > > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > > Index: objfiles.c > > > > =================================================================== > > > > RCS file: /cvs/src/src/gdb/objfiles.c,v > > > > retrieving revision 1.15 > > > > diff -c -3 -p -w -B -b -r1.15 objfiles.c > > > > *** objfiles.c 2001/03/06 08:21:11 1.15 > > > > --- objfiles.c 2001/05/29 17:27:57 > > > > *************** add_to_objfile_sections (bfd *abfd, sec_ > > > > *** 96,102 **** > > > > section.ovly_mapped = 0; > > > > section.addr = bfd_section_vma (abfd, asect); > > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > > ! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section)); > > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > > } > > > > > > > > --- 96,102 ---- > > > > section.ovly_mapped = 0; > > > > section.addr = bfd_section_vma (abfd, asect); > > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > > ! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section)); > > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > > } > > > > > > > > *************** build_objfile_section_table (struct objf > > > > *** 121,134 **** > > > > { > > > > /* objfile->sections can be already set when reading a mapped symbol > > > > file. I believe that we do need to rebuild the section table in > > > > ! this case (we rebuild other things derived from the bfd), but we > > > > ! can't free the old one (it's in the psymbol_obstack). So we just > > > > ! waste some memory. */ > > > > > > > > objfile->sections_end = 0; > > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > > objfile->sections = (struct obj_section *) > > > > ! obstack_finish (&objfile->psymbol_obstack); > > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > > return (0); > > > > } > > > > --- 121,137 ---- > > > > { > > > > /* objfile->sections can be already set when reading a mapped symbol > > > > file. I believe that we do need to rebuild the section table in > > > > ! this case (we rebuild other things derived from the bfd). > > > > ! DJB - 05-27-2001 > > > > ! It's in the misc_obstack now, feel free to do what you need to. > > > > ! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which > > > > ! I think is all the stuff you want to blow away anyway. > > > > ! */ > > > > > > > > objfile->sections_end = 0; > > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > > objfile->sections = (struct obj_section *) > > > > ! obstack_finish (&objfile->misc_obstack); > > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > > return (0); > > > > } > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > *** 188,193 **** > > > > --- 191,198 ---- > > > > /* Update pointers to functions to *our* copies */ > > > > obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); > > > > obstack_freefun (&objfile->psymbol_cache.cache, mfree); > > > > + obstack_chunkfun (&objfile->misc_obstack, xmmalloc); > > > > + obstack_freefun (&objfile->misc_obstack, mfree); > > > > obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); > > > > obstack_freefun (&objfile->psymbol_obstack, mfree); > > > > obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > *** 218,223 **** > > > > --- 223,231 ---- > > > > obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, > > > > 0, 0, xmmalloc, mfree, > > > > objfile->md); > > > > + obstack_specify_allocation_with_arg (&objfile->misc_obstack, > > > > + 0, 0, xmmalloc, mfree, > > > > + objfile->md); > > > > obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, > > > > 0, 0, xmmalloc, mfree, > > > > objfile->md); > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > *** 264,269 **** > > > > --- 272,279 ---- > > > > objfile->md = NULL; > > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > > xmalloc, xfree); > > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc, > > > > + xfree); > > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc, > > > > xfree); > > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc, > > > > *************** free_objfile (struct objfile *objfile) > > > > *** 475,480 **** > > > > --- 485,491 ---- > > > > mfree (objfile->md, objfile->static_psymbols.list); > > > > /* Free the obstacks for non-reusable objfiles */ > > > > free_bcache (&objfile->psymbol_cache); > > > > + obstack_free (&objfile->misc_obstack, 0); > > > > obstack_free (&objfile->psymbol_obstack, 0); > > > > obstack_free (&objfile->symbol_obstack, 0); > > > > obstack_free (&objfile->type_obstack, 0); > > > > Index: objfiles.h > > > > =================================================================== > > > > RCS file: /cvs/src/src/gdb/objfiles.h,v > > > > retrieving revision 1.8 > > > > diff -c -3 -p -w -B -b -r1.8 objfiles.h > > > > *** objfiles.h 2001/03/06 08:21:11 1.8 > > > > --- objfiles.h 2001/05/29 17:28:00 > > > > *************** struct objfile > > > > *** 269,274 **** > > > > --- 269,275 ---- > > > > /* Obstacks to hold objects that should be freed when we load a new symbol > > > > table from this object file. */ > > > > > > > > + struct obstack misc_obstack; /* Misc stuff */ > > > > struct obstack psymbol_obstack; /* Partial symbols */ > > > > struct obstack symbol_obstack; /* Full symbols */ > > > > struct obstack type_obstack; /* Types */ > > > > > > > > -- > > > > "I used to be a narrator for bad mimes. > > > > "-Steven Wright > > > > > > > > -- > > "I went into a clothes store the other day and a salesman walked > > up to me and said, "Can I help you?" and I said "Yeah, do you > > got anything I like?" He said, "What do you mean do we have > > anything you like?" I said, "You started this." > > "-Steven Wright > > -- "So I figured I'd leave the area, because I had no ties there anyway except for this girl I was seeing. We had conflicting attitudes: I really wasn't into meditating and she wasn't really into being alive. I told her I knew when I was going to die because my birth certificate has an expiration date. "-Steven Wright ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. 2001-06-25 21:12 ` Daniel Berlin @ 2001-06-25 22:34 ` Elena Zannoni 2001-06-25 23:21 ` Daniel Berlin 0 siblings, 1 reply; 8+ messages in thread From: Elena Zannoni @ 2001-06-25 22:34 UTC (permalink / raw) To: Daniel Berlin; +Cc: Elena Zannoni, gdb-patches Daniel Berlin writes: > Elena Zannoni <ezannoni@cygnus.com> writes: > > > Daniel Berlin writes: > > > Elena Zannoni <ezannoni@cygnus.com> writes: > > > > > > > Daniel Berlin writes: > > > > > > > > > > This way, we stop putting things in the psymbol_obstack that don't > > > > > belong. > > > > > > > > > > > > > Dan, can you elaborate a bit on why we need this? > > > Because these things don't belong in the psymbol obstack. > > > They are section offsets, not partial symbols. > > > > > > > Dan, I am really sorry, but still I cannot see a real reason for this > > change emerging from your mail. > > Um. > Okay. > According to objfiles.h: > > struct obstack psymbol_obstack; /* Partial symbols */ > struct obstack symbol_obstack; /* Full symbols */ > struct obstack type_obstack; /* Types */ > > > Notice it doesn't say that section offsets, or other random junk, > should be on the psymbol_obstack. > It says "Partial symbols". > Now, if you want to remove the partial symbols, for that object file, > theoretically, you just remove the psymbol_obstack. However, because > we allocate other random things, like section offset tables, etc, > which have zip to do with partial symbols, on that obstack, we won't > remove just the partial symbols by removing that obstack. We'll blow > away the section offset table, the psymtab structures, etc. > This should not be occurring. > It makes as much sense as allocating object file section offsets on the > type_obstack, which is for types only. That is to say, none. > Yes, and this is the bug I was alluding to. You mentioned you observed that things like the section tables were freed too early. When does this occur? Did you try to move around the call to free_obstack(psymbol_obstack)? What motivated you to try and do that? That's really what I am asking. > It's the equivalent of having a trash bin marked "white paper only", > and having people knowing throw all kinds of colored paper in there, > for lack of a better place to throw colored paper. > They don't belong. > Not only that, but if you later wanted to remove the white paper, you'd have to sort out > the colored paper, and do something with it, first. > > I'm just adding a bin for colored paper, so people will put that stuff > in there instead in the first place, and it will be plainly clear that they are supposed > to be doing so. > > > > You are doing this in response to some bug you saw, I assume, but what that > > bug is has not been explained. > No, i'm doing it because partial symbols belong on the psymbol > obstack, but section offsets, and other random things don't. > In practice, we've not followed this, because nobody bothered to > create somewhere *else* to put them. I'm attempting to bring us > to doing what we should have been doing in the first place, by > creating this place to put them. > Yes, true. > Had I been trying to fix a bug, i would explain what the bug was, and > where it showed up. > > This is not a bug, in that nothing is specifically *broken*. It's > perfectly okay to allocate these structures on that obstack, given > that gdb never frees the obstack, it's just not in line with what the > comments say, and the purpose of the psymbol obstack. > Isn't the psymbol_obstack freed when you re-read symbols in? > > > > > > > > Why are you removing > > > > the partial symbol table from the psymbol_objstack? > > > I'm not. At all in fact. > > > I'm specifically trying to make it so *all* that is in the > > > psymbol_obstack is the partial symbol table. > > > we've been stuffing random stuff like section offsets into the > > > psymbol_obstack, because it was handy. > > > This is wrong. > > > If we need a misc place to put info like section offsets, that isn't > > > large enough to deserve it's own obstack on it's own, then all the > > > misc stuff together should go in a misc_obstack. > > > > Then your patch includes a diff that is unrelated. > Um, how so? > Please point out the portion of the diff unrelated. > The only thing even related to psymtabs there is the fact that they > psymtab structure itself is allocated on the misc obstack, since it > isn't a partial symbol either. It's a partial symbol table structure, > containing pointers to partial symbols. Yes, that's the one. I would think that the psymtab itself is better coupled with psymbol_objstack, than misc_obstack. I would think it safer to free both of them or none, than to risk freeing the section_offsets and also the psymbol table by mistake. > The actual partial symbols that fill that table are still allocated on > the psymbol_obstack. > As they should be. yes, but looking at the way the symbol table is allocated, it follows the same logic, symbol_obstack includes the symtab itself as well. I mean, the real problem that you are trying to address is that you need a different lifetime for psymbols vs psymtab, and for psymbols vs section_offsets. So, why is this necessary? Are you addressing a limitation that you have found while trying to do something else? Why is it a problem that section_offsets, psymbols and psymtab have the same lifetime? [I am not arguing that section offsets are logically related to psymbols] > > > > > > > > > Was this intended? > > > > There are several other things that get allocated on the > > > > psymbol_objstack, for instance look in xcoffread.c, somread.c, > > > > etc. Why just remove the section offset stuff? > > > Because I haven't gotten to the others yet. > > > And there is no harm in taking time to make sure it gets done right. > > > > > > > If you have a roadmap in mind, you should explain it when you submit > > the patch. > > I have no roadmap for when i'd be getting to that. > Eventually. > I could do them all now if it helps, but it'll make the patch bigger. > I would suggest that you put the section offsets stuff on its own separate obstack for now, but do that across the board, to avoid inconsistencies. That would be a self contained patch. Follow up patches would move other pieces. Elena > > > > > > > > > > > If your intent was to change the allocation of the section offset > > > > information, from psymbol_obstack to misc_obstack, why not modify also > > > > the same allocations done in xcoffread.c, elfread.c, somread.c? > > > Because i haven't gotten there yet. > > > :) > > > I did it as I saw them. > > > > > > In actuality, what i was doing was freeing the psymbol obstack when we > > > were completely done with partial symbols, and seeing what broke. > > > They never broke, so i never noticed them. > > > > > > When i submit a large patch that does all this in one fell swoop, > > > someone would say to break it down. > > > So consider this a first step, rather than a done deal. > > > > > > > I am encouraging you to resubmit the patch accompanied by coherent > > explanation and rationale. > I believe you are misunderstanding the purpose of the patch, and what > it does, or some portion of it. > Please let me know if the above doesn't clear it up. > > > > > > Elena > > > > > > > > > > > > Thanks > > > > Elena > > > > > > > > > > > > > 2001-05-27 Daniel Berlin <dan@cgsoftware.com> > > > > > > > > > > * symfile.c (default_symfile_offsets): Allocate in misc_obstack. > > > > > (reread_symbols): Handle misc_obstack too, and use it where > > > > > psymbol_obstack didn't belong. > > > > > (allocate_psymtab): Ditto. > > > > > > > > > > * objfiles.c (add_to_objfile_sections): Use misc_obstack, not psymbol_obstack. > > > > > (build_objfile_section_table): Ditto. > > > > > (free_objfile): Free the misc_obstack. > > > > > (allocate_objfile): Setup misc_obstack too. > > > > > > > > > > * objfiles.h: Add misc_obstack to object file. > > > > > > > > > > Index: symfile.c > > > > > =================================================================== > > > > > RCS file: /cvs/src/src/gdb/symfile.c,v > > > > > retrieving revision 1.32 > > > > > diff -c -3 -p -w -B -b -r1.32 symfile.c > > > > > *** symfile.c 2001/05/10 15:33:21 1.32 > > > > > --- symfile.c 2001/05/29 17:27:51 > > > > > *************** default_symfile_offsets (struct objfile > > > > > *** 500,506 **** > > > > > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > > > objfile->section_offsets = (struct section_offsets *) > > > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > > > > > /* Now calculate offsets for section that were specified by the > > > > > --- 500,506 ---- > > > > > > > > > > objfile->num_sections = SECT_OFF_MAX; > > > > > objfile->section_offsets = (struct section_offsets *) > > > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > > > memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS); > > > > > > > > > > /* Now calculate offsets for section that were specified by the > > > > > *************** reread_symbols (void) > > > > > *** 1679,1684 **** > > > > > --- 1679,1685 ---- > > > > > > > > > > /* Free the obstacks for non-reusable objfiles */ > > > > > free_bcache (&objfile->psymbol_cache); > > > > > + obstack_free (&objfile->misc_obstack, 0); > > > > > obstack_free (&objfile->psymbol_obstack, 0); > > > > > obstack_free (&objfile->symbol_obstack, 0); > > > > > obstack_free (&objfile->type_obstack, 0); > > > > > *************** reread_symbols (void) > > > > > *** 1704,1709 **** > > > > > --- 1705,1712 ---- > > > > > it is empty. */ > > > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > > > xmalloc, xfree); > > > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, > > > > > + xmalloc, xfree); > > > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, > > > > > xmalloc, xfree); > > > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, > > > > > *************** reread_symbols (void) > > > > > *** 1719,1725 **** > > > > > /* We use the same section offsets as from last time. I'm not > > > > > sure whether that is always correct for shared libraries. */ > > > > > objfile->section_offsets = (struct section_offsets *) > > > > > ! obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); > > > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > > > objfile->num_sections = num_offsets; > > > > > > > > > > --- 1722,1728 ---- > > > > > /* We use the same section offsets as from last time. I'm not > > > > > sure whether that is always correct for shared libraries. */ > > > > > objfile->section_offsets = (struct section_offsets *) > > > > > ! obstack_alloc (&objfile->misc_obstack, SIZEOF_SECTION_OFFSETS); > > > > > memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS); > > > > > objfile->num_sections = num_offsets; > > > > > > > > > > *************** allocate_psymtab (char *filename, struct > > > > > *** 1981,1993 **** > > > > > objfile->free_psymtabs = psymtab->next; > > > > > } > > > > > else > > > > > ! psymtab = (struct partial_symtab *) > > > > > ! obstack_alloc (&objfile->psymbol_obstack, > > > > > ! sizeof (struct partial_symtab)); > > > > > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > > > ! psymtab->filename = obsavestring (filename, strlen (filename), > > > > > ! &objfile->psymbol_obstack); > > > > > psymtab->symtab = NULL; > > > > > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > > > --- 1984,1993 ---- > > > > > objfile->free_psymtabs = psymtab->next; > > > > > } > > > > > else > > > > > ! psymtab = (struct partial_symtab *) obstack_alloc (&objfile->misc_obstack, sizeof (struct partial_symtab)); > > > > > > > > > > memset (psymtab, 0, sizeof (struct partial_symtab)); > > > > > ! psymtab->filename = obsavestring (filename, strlen(filename), &objfile->misc_obstack); > > > > > psymtab->symtab = NULL; > > > > > > > > > > /* Prepend it to the psymtab list for the objfile it belongs to. > > > > > Index: objfiles.c > > > > > =================================================================== > > > > > RCS file: /cvs/src/src/gdb/objfiles.c,v > > > > > retrieving revision 1.15 > > > > > diff -c -3 -p -w -B -b -r1.15 objfiles.c > > > > > *** objfiles.c 2001/03/06 08:21:11 1.15 > > > > > --- objfiles.c 2001/05/29 17:27:57 > > > > > *************** add_to_objfile_sections (bfd *abfd, sec_ > > > > > *** 96,102 **** > > > > > section.ovly_mapped = 0; > > > > > section.addr = bfd_section_vma (abfd, asect); > > > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > > > ! obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section)); > > > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > > > } > > > > > > > > > > --- 96,102 ---- > > > > > section.ovly_mapped = 0; > > > > > section.addr = bfd_section_vma (abfd, asect); > > > > > section.endaddr = section.addr + bfd_section_size (abfd, asect); > > > > > ! obstack_grow (&objfile->misc_obstack, (char *) §ion, sizeof (section)); > > > > > objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1); > > > > > } > > > > > > > > > > *************** build_objfile_section_table (struct objf > > > > > *** 121,134 **** > > > > > { > > > > > /* objfile->sections can be already set when reading a mapped symbol > > > > > file. I believe that we do need to rebuild the section table in > > > > > ! this case (we rebuild other things derived from the bfd), but we > > > > > ! can't free the old one (it's in the psymbol_obstack). So we just > > > > > ! waste some memory. */ > > > > > > > > > > objfile->sections_end = 0; > > > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > > > objfile->sections = (struct obj_section *) > > > > > ! obstack_finish (&objfile->psymbol_obstack); > > > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > > > return (0); > > > > > } > > > > > --- 121,137 ---- > > > > > { > > > > > /* objfile->sections can be already set when reading a mapped symbol > > > > > file. I believe that we do need to rebuild the section table in > > > > > ! this case (we rebuild other things derived from the bfd). > > > > > ! DJB - 05-27-2001 > > > > > ! It's in the misc_obstack now, feel free to do what you need to. > > > > > ! All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack, which > > > > > ! I think is all the stuff you want to blow away anyway. > > > > > ! */ > > > > > > > > > > objfile->sections_end = 0; > > > > > bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile); > > > > > objfile->sections = (struct obj_section *) > > > > > ! obstack_finish (&objfile->misc_obstack); > > > > > objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end; > > > > > return (0); > > > > > } > > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > > *** 188,193 **** > > > > > --- 191,198 ---- > > > > > /* Update pointers to functions to *our* copies */ > > > > > obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); > > > > > obstack_freefun (&objfile->psymbol_cache.cache, mfree); > > > > > + obstack_chunkfun (&objfile->misc_obstack, xmmalloc); > > > > > + obstack_freefun (&objfile->misc_obstack, mfree); > > > > > obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); > > > > > obstack_freefun (&objfile->psymbol_obstack, mfree); > > > > > obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); > > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > > *** 218,223 **** > > > > > --- 223,231 ---- > > > > > obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, > > > > > 0, 0, xmmalloc, mfree, > > > > > objfile->md); > > > > > + obstack_specify_allocation_with_arg (&objfile->misc_obstack, > > > > > + 0, 0, xmmalloc, mfree, > > > > > + objfile->md); > > > > > obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, > > > > > 0, 0, xmmalloc, mfree, > > > > > objfile->md); > > > > > *************** allocate_objfile (bfd *abfd, int flags) > > > > > *** 264,269 **** > > > > > --- 272,279 ---- > > > > > objfile->md = NULL; > > > > > obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0, > > > > > xmalloc, xfree); > > > > > + obstack_specify_allocation (&objfile->misc_obstack, 0, 0, xmalloc, > > > > > + xfree); > > > > > obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc, > > > > > xfree); > > > > > obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc, > > > > > *************** free_objfile (struct objfile *objfile) > > > > > *** 475,480 **** > > > > > --- 485,491 ---- > > > > > mfree (objfile->md, objfile->static_psymbols.list); > > > > > /* Free the obstacks for non-reusable objfiles */ > > > > > free_bcache (&objfile->psymbol_cache); > > > > > + obstack_free (&objfile->misc_obstack, 0); > > > > > obstack_free (&objfile->psymbol_obstack, 0); > > > > > obstack_free (&objfile->symbol_obstack, 0); > > > > > obstack_free (&objfile->type_obstack, 0); > > > > > Index: objfiles.h > > > > > =================================================================== > > > > > RCS file: /cvs/src/src/gdb/objfiles.h,v > > > > > retrieving revision 1.8 > > > > > diff -c -3 -p -w -B -b -r1.8 objfiles.h > > > > > *** objfiles.h 2001/03/06 08:21:11 1.8 > > > > > --- objfiles.h 2001/05/29 17:28:00 > > > > > *************** struct objfile > > > > > *** 269,274 **** > > > > > --- 269,275 ---- > > > > > /* Obstacks to hold objects that should be freed when we load a new symbol > > > > > table from this object file. */ > > > > > > > > > > + struct obstack misc_obstack; /* Misc stuff */ > > > > > struct obstack psymbol_obstack; /* Partial symbols */ > > > > > struct obstack symbol_obstack; /* Full symbols */ > > > > > struct obstack type_obstack; /* Types */ > > > > > > > > > > -- > > > > > "I used to be a narrator for bad mimes. > > > > > "-Steven Wright > > > > > > > > > > > -- > > > "I went into a clothes store the other day and a salesman walked > > > up to me and said, "Can I help you?" and I said "Yeah, do you > > > got anything I like?" He said, "What do you mean do we have > > > anything you like?" I said, "You started this." > > > "-Steven Wright > > > > > -- > "So I figured I'd leave the area, because I had no ties there > anyway except for this girl I was seeing. We had conflicting > attitudes: I really wasn't into meditating and she wasn't > really into being alive. I told her I knew when I was going to > die because my birth certificate has an expiration date. > "-Steven Wright > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. 2001-06-25 22:34 ` Elena Zannoni @ 2001-06-25 23:21 ` Daniel Berlin 0 siblings, 0 replies; 8+ messages in thread From: Daniel Berlin @ 2001-06-25 23:21 UTC (permalink / raw) To: Elena Zannoni; +Cc: Daniel Berlin, gdb-patches Elena Zannoni <ezannoni@cygnus.com> writes: > Daniel Berlin writes: > > Elena Zannoni <ezannoni@cygnus.com> writes: > > > > > Daniel Berlin writes: > > > > Elena Zannoni <ezannoni@cygnus.com> writes: > > > > > > > > > Daniel Berlin writes: > > > > > > > > > > > > This way, we stop putting things in the psymbol_obstack that don't > > > > > > belong. > > > > > > > > > > > > > > > > Dan, can you elaborate a bit on why we need this? > > > > Because these things don't belong in the psymbol obstack. > > > > They are section offsets, not partial symbols. > > > > > > > > > > Dan, I am really sorry, but still I cannot see a real reason for this > > > change emerging from your mail. > > > > Um. > > Okay. > > According to objfiles.h: > > > > struct obstack psymbol_obstack; /* Partial symbols */ > > struct obstack symbol_obstack; /* Full symbols */ > > struct obstack type_obstack; /* Types */ > > > > > > Notice it doesn't say that section offsets, or other random junk, > > should be on the psymbol_obstack. > > It says "Partial symbols". > > Now, if you want to remove the partial symbols, for that object file, > > theoretically, you just remove the psymbol_obstack. However, because > > we allocate other random things, like section offset tables, etc, > > which have zip to do with partial symbols, on that obstack, we won't > > remove just the partial symbols by removing that obstack. We'll blow > > away the section offset table, the psymtab structures, etc. > > This should not be occurring. > > It makes as much sense as allocating object file section offsets on the > > type_obstack, which is for types only. That is to say, none. > > > > Yes, and this is the bug I was alluding to. You mentioned you observed > that things like the section tables were freed too early. When does > this occur? When you attempt to free the psymbol obstack after you are done with all the psymbols for an objfile. However, gdb currently doesn't do this. This is part of the reason you can't. > Did you try to move around the call to > free_obstack(psymbol_obstack)? There are only calls to do this type of thing when we remove object files or reread symbols. It would, of course, to make sense to free the partial symbols for an objfile once we were sure all the symtabs for that objfile had been read in. This does not currently occur. The bug occurs when you attempt to do this. The actual reason it never occurs in gdb is because the stabs reader incorrectly expects partial symbols to live past the readin of full symbols (why would you want partial symbols when you have full ones?), in order to do some duplicate elimination the cheap, easy, and stabs specific, way. It does this at the expense of every other symbol reader, since if you attempt to free the psymbol obstack for stabs, even after you are done with all the partial symbols for a given objfile, you'll start seeing weird stabs reader errors. However, this I consider a seperate problem, since gdb currently doesn't ever free the psymbol obstack except when it frees objfiles. > What motivated you to try and do that? The fact that we waste effectively double the memory to read symbols for everything except stabs, because none of the other symbol readers assume the psymtabs will live past complete symtab conversion, and thus, assume they will be freed. The STABS reader happens to eliminate enough psymbols through it's cheap easy method that you don't notice the fact that it's keeping all the psymbols around, never freeing them. Besides attacking this part of problem by fixing the stabs reader, you must also make it so you can actually free the psymbol obstack when you are done with all the psymtabs for an objfile, without affecting anything else about that objfile. I.E. make it so the psymbol_obstack only contains psymbols. Otherwise, fixing the stabs reader does you no good, since you still will blow away unrelated things when trying to free the psymbols. So in order to fix the problem of keeping psymbols around until their objfile goes away, rather than until the symtabs for that objfile are all read in (Or better yet, until a given psymab is converted into a symtab), I need to start with the small things like moving the structures out of the psymbol_obstack. > That's really what I am asking. > > > It's the equivalent of having a trash bin marked "white paper only", > > and having people knowing throw all kinds of colored paper in there, > > for lack of a better place to throw colored paper. > > They don't belong. > > Not only that, but if you later wanted to remove the white paper, you'd have to sort out > > the colored paper, and do something with it, first. > > > > I'm just adding a bin for colored paper, so people will put that stuff > > in there instead in the first place, and it will be plainly clear that they are supposed > > to be doing so. > > > > > > > You are doing this in response to some bug you saw, I assume, but what that > > > bug is has not been explained. > > No, i'm doing it because partial symbols belong on the psymbol > > obstack, but section offsets, and other random things don't. > > In practice, we've not followed this, because nobody bothered to > > create somewhere *else* to put them. I'm attempting to bring us > > to doing what we should have been doing in the first place, by > > creating this place to put them. > > > > Yes, true. > > > Had I been trying to fix a bug, i would explain what the bug was, and > > where it showed up. > > > > This is not a bug, in that nothing is specifically *broken*. It's > > perfectly okay to allocate these structures on that obstack, given > > that gdb never frees the obstack, it's just not in line with what the > > comments say, and the purpose of the psymbol obstack. > > > > Isn't the psymbol_obstack freed when you re-read symbols in? Yes. And when you free objfiles. However, this is not really it's minimal lifetime. The usefulness of a psymbol_obstack for an objfile ends the second you've "converted" (i put it in quotes since conversion usually involves transforming one thing into a nother, where here we are really effectively copying, and transforming the copy, since we never remove the original) all the psymtabs into symtabs. > > > > > > > > > > > > Why are you removing > > > > > the partial symbol table from the psymbol_objstack? > > > > I'm not. At all in fact. > > > > I'm specifically trying to make it so *all* that is in the > > > > psymbol_obstack is the partial symbol table. > > > > we've been stuffing random stuff like section offsets into the > > > > psymbol_obstack, because it was handy. > > > > This is wrong. > > > > If we need a misc place to put info like section offsets, that isn't > > > > large enough to deserve it's own obstack on it's own, then all the > > > > misc stuff together should go in a misc_obstack. > > > > > > Then your patch includes a diff that is unrelated. > > Um, how so? > > Please point out the portion of the diff unrelated. > > The only thing even related to psymtabs there is the fact that they > > psymtab structure itself is allocated on the misc obstack, since it > > isn't a partial symbol either. It's a partial symbol table structure, > > containing pointers to partial symbols. > > Yes, that's the one. > > I would think that the psymtab itself is better coupled with > psymbol_objstack, than misc_obstack. Okay, that's fine. > I would think it safer to free both of them or none, than to risk > freeing the section_offsets and also the psymbol table by mistake. Sure. > > > The actual partial symbols that fill that table are still allocated on > > the psymbol_obstack. > > As they should be. > > yes, but looking at the way the symbol table is allocated, it follows > the same logic, symbol_obstack includes the symtab itself as well. Real symbols are different. Their lifetime really ends with the objfile. Partial symbols are just there until we have a need to read all the real symbols. So their lifetime is different. > > I mean, the real problem that you are trying to address is that you > need a different lifetime for psymbols vs psymtab, and for psymbols vs > section_offsets. So, why is this necessary? I think i've explained this above, but in different parts of the message so, for clarity's sake, this particular thing is necessary because: The lifetime of psymbols for an objfile is until all the symtabs for that objfile are read in (Theoretically, if you were careful, you could make the lifetime until those psymbols are converted to symbols, but it's tricky, because of how obstacks work. The whole freeing everything that came after the object you want to free stuff). Once this is done, the psymbols serve 0 purpose. Provably, no lookup that fails on the symbols could work on the psymbols, unless your reader is broken (since they are coming from the same info). > Are you addressing a > limitation that you have found while trying to do something else? Yes. This is the first step of addressing the limitation that we keep psymbols around longer than necessary. This becomes a factor for STABS when you have very large programs (IE duplicate symbol elimination doesn't save you, because you really have 500k distinct symbols and types), and for other debug formats which don't have linker support for duplicate elimination, much quicker. Even with a gdb compiled with dwarf2, where gdb isn't that large of a program in terms of psymbols (because c has few duplicates compare to C++, and because C++ programs have often have more of the things that we generate psymbols for) shows the following, after all symtabs are read in (IE when psymbols are, bye, definition, useless) (top-gdb) maintenance print statistics Statistics for '/buildspace2/dwarf2gdbtree/src/gdb/./gdbdwarf2': Number of "minimal" symbols read: 7149 Number of "partial" symbols read: 289144 Number of "full" symbols read: 445652 Number of "types" defined: 162155 Total memory used for psymbol obstack: 12389013 Total memory used for psymbol cache: 745176 Total memory used for symbol obstack: 35083179 Total memory used for type obstack: 28099722 Out of 75 meg of memory, we are wasting 1/6th on psymbols. This is probably average for C programs. For C++ programs, you tend to see a psymbol obstack equal in size to the symbol obstack. In other words, we waste double the memory on symbols. > Why > is it a problem that section_offsets, psymbols and psymtab have the > same lifetime? section_offsets logically have the lifetime of the objfile. psymbols and the associated psymtabs have a lifetime that lasts exactly until the full symbols for those psymbols are read in (IE the psymtab is converted to a symtab). Right now, the we treat them like they last until the objfile goes away. I'm working on treating them like they last until all the symbols for a given objfile are read in (which happens fairly quickly unless you have a huge, monolithic program). This is because treating them like they have the lifetime they really do would require being able to free all the psymbols for a given psymtab without touching any other psymbols. Because of how obstacks work, doing this would require not using obstacks for psymbols, or rather, making the obstack part of the psymtab (so you can free all the memory associated with the psymtab without touching anything else) Eventually, that is the goal, but that's way off. Since it is a complex change to do that anyway, and it's more of an incremental step from being able to free psymbols at *some particular* point before the objfile goes away, this actually gets us closer to being able to do that. > [I am not arguing that section offsets are logically related to psymbols] > > > > > > > > > > > > > Was this intended? > > > > > There are several other things that get allocated on the > > > > > psymbol_objstack, for instance look in xcoffread.c, somread.c, > > > > > etc. Why just remove the section offset stuff? > > > > Because I haven't gotten to the others yet. > > > > And there is no harm in taking time to make sure it gets done right. > > > > > > > > > > If you have a roadmap in mind, you should explain it when you submit > > > the patch. > > > > I have no roadmap for when i'd be getting to that. > > Eventually. > > I could do them all now if it helps, but it'll make the patch bigger. > > > > I would suggest that you put the section offsets stuff on its own > separate obstack for now, but do that across the board, to avoid > inconsistencies. That would be a self contained patch. > Follow up patches would move other pieces. Okeydokey. > > Elena -- "When I was a kid, I went to the store and asked the guy, "Do you have any toy train schedules?" "-Steven Wright ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA]: Add misc_obstack to object files. @ 2001-06-25 22:26 Michael Elizabeth Chastain 0 siblings, 0 replies; 8+ messages in thread From: Michael Elizabeth Chastain @ 2001-06-25 22:26 UTC (permalink / raw) To: dan, ezannoni; +Cc: gdb-patches I'd like to throw my hat in the ring, too. I spent a whole weekend several months ago changing the type of all the section offset tables. I wound up with a 3000 line patch that I didn't even try to get approved. (I was working on PR gdb/29, "gdb has fixed size MAX_SECTIONS"). So I care about section offset tables. > I'm just adding a bin for colored paper, so people will put that stuff > in there instead in the first place, and it will be plainly clear that > they are supposed to be doing so. So you don't have a manifestation of a bug in your hand; rather, you are cleaning up something that is broken. That's fine. I am comfortable with your rationale, now that I know what it is. I see three specific problems: . in lines 1984-1993 of symfile.c, you change the "psymtab" pointer from psymbol_obstack to misc_obstack. It's not obvious why this structure is on misc_obstack. Since it's not obvious, a comment would help. . as Elena mentioned, there are other files which allocate section offsets on the psymbol_obstack. I see somread.c in particular. Right now it's difficult to test somread.c, because even if you have access to hppa hardware, FSF gdb does not link for that configuration (PR gdb/63). If you can't test it, and you don't want to go for a blind patch to somread.c, then I think that a FIXME comment would be appropriate, to explain to the next hpux maintainer why this target allocates section_offsets on psymbol_objstack when other targets use misc_obstack. Something like: "FIXME: this should be misc_obstack, same as symfile.c, but I can't test this file so I'm leaving it as psymbol_obstack, which ought to continue working for now". . the new comment on lines 121-137 of objfiles.c is not true yet, even after applying your patch. For example, dbxread.c puts DBX_STRINGTAB on psymbol_obstack. So I challenge your claim "All the stuff in objfile that was on the psymbol obstack, but didnt' belong, is in the misc obstack ...". > The only thing even related to psymtabs there is the fact that they > psymtab structure itself is allocated on the misc obstack, since it > isn't a partial symbol either. It's a partial symbol table structure, > containing pointers to partial symbols. If you put this in a comment, that would answer my first question (which might be the same as Elena's question about an extraneous patch fragment, but I don't know what fragment Elena is referring to). > I could do them all now if it helps, but it'll make the patch bigger. I like it better this way, one structure at a time. I think that Elena's looking for some sense of whether this is a standalone patch or part of a bigger series -- not one big patch. Here are the reasons that I prefer series: . It's easier to proof-read one concept at a time. . It's easier to read the first "proof of concept" when there's only one structure in it, rather than old structures. . If something breaks in the future, and I need to binary-search old versions of gdb, this improves the granularity that I can resolve the bug too. This is important for symbol table patches as a bug can manifest subtly (e.g. lookup_symbol bug -> infinite loop in "maint" command when running on an inferior copy of gdb). Basically there are two different ideas here. First there is the idea of what should actually be in gdb. I'm comfortable with your vision there. Second there is the idea of structuring one's work so that other people can deduce that it actually implements the concept (including checking for implementation bugs). Just my two cents. I'll try not to write again, as Elena is the maintainer here. Michael ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2001-06-25 23:21 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2001-05-29 10:31 [RFA]: Add misc_obstack to object files Daniel Berlin 2001-06-25 13:59 ` Elena Zannoni 2001-06-25 19:07 ` Daniel Berlin 2001-06-25 20:49 ` Elena Zannoni 2001-06-25 21:12 ` Daniel Berlin 2001-06-25 22:34 ` Elena Zannoni 2001-06-25 23:21 ` Daniel Berlin 2001-06-25 22:26 Michael Elizabeth Chastain
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox