gas init_stab_section and get_stab_string_offset
authorAlan Modra <amodra@gmail.com>
Thu, 31 Aug 2023 08:35:35 +0000 (18:05 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 31 Aug 2023 12:02:11 +0000 (21:32 +0930)
commit3bab069c29b3c9b6c7123f81d7b4cd32b6e18472
tree8e0d891e3db125cf870c84990729fb0cfafcd8ec
parent533300396936dd54adb9e76600c6b567f3fca794
gas init_stab_section and get_stab_string_offset

get_stab_string_offset currently creates the stabstr section if not
already present, in the process keeping a reference to the malloc'd
section name string.  Really, the name belongs in bfd_alloc'd memory
or some obstack so that it doesn't show as a memory leak on exit.
s_stab_generic at least does allocate the name for the stab section on
an obstack, but doesn't tidy that as well as it could.  Return paths
after issuing a warning don't release the memory, nor the memory for
the "string" copy.

This patch fixes these problems.  s_stab_generic is rearranged so that
creation of the sections occurs earlier, before any potential uses of
the note obstack during expression parsing.  That makes it possible to
always free the section name strings unless used to create new
sections.  I've also avoided get_absolute_expression_and_terminator
as I see that function might skip over end-of-line, and lack of a
--input_line_pointer might have caused the following source line to be
ignored.  (Other uses of this function in gas are OK.)

* config/obj-coff.c (obj_coff_init_stab_section): Add stabstr
param.  Pass to get_stab_string_offset rather than name of
section.
* config/obj-som.c (obj_som_init_stab_section): Likewise.
* config/obj-elf.c (obj_elf_init_stab_section): Likewise.
(elf_init_stab_section): Adjust.
* config/obj-coff.h (INIT_STAB_SECTION): Update.
(obj_coff_init_stab_section): Update prototype.
* config/obj-som.h: Similarly.
* config/obj-elf.h: Similarly.
* config/obj-multi.h (INIT_STAB_SECTION): Update.
* obj.h (struct format_ops <init_stab_section>): Update.
* read.h (get_stab_string_offset): Update prototype.
* stabs.c (cached_sec): Delete.
(stabs_begin): Adjust to suit.
(get_stab_string_offset): Add stabstr param, delete stabstr_name
and free_stabstr_secname params.  Don't make stabstr section
here.
(eat_comma): New function.
(s_stab_generic): Replace stab_secname_obstack_end param with
bool freenames.  Move creation of stab and stabstr sections
earlier, so the names can be freed earlier before possible use
of notes obstack during expression parsing.  Tidy error paths
ensuring "string" is freed.  Use get_absolute_expression in
place of get_absolute_expression_and_terminator.
(s_stab): Adjust.
(s_xstab): Use notes_concat to make stabstr section name.
gas/config/obj-coff.c
gas/config/obj-coff.h
gas/config/obj-elf.c
gas/config/obj-elf.h
gas/config/obj-multi.h
gas/config/obj-som.c
gas/config/obj-som.h
gas/obj.h
gas/read.h
gas/stabs.c