gdb: allocate subfile with new

Allocate struct subfile with new, initialize its fields instead of
memset-ing it to 0.  Use a unique_ptr for the window after a subfile has
been allocated but before it is linked in the buildsym_compunit's list
of subfile (and therefore owned by the buildsym_compunit.

I can't test the change in xcoffread.c, it's best-effort.  I couldn't
find where subfiles are freed in that file, I assume they were
intentionally (or not) leaked.

Change-Id: Ib3b6877de31b7e65bc466682f08dbf5840225f24
This commit is contained in:
Simon Marchi 2022-04-07 08:06:50 -04:00 committed by Simon Marchi
parent 30bf8e1ce4
commit 71bc95ed20
3 changed files with 34 additions and 35 deletions

View file

@ -97,7 +97,7 @@ buildsym_compunit::~buildsym_compunit ()
nextsub = subfile->next;
xfree (subfile->name);
xfree (subfile->line_vector);
xfree (subfile);
delete subfile;
}
struct pending *next, *next1;
@ -504,13 +504,12 @@ void
buildsym_compunit::start_subfile (const char *name)
{
const char *subfile_dirname;
struct subfile *subfile;
subfile_dirname = m_comp_dir.get ();
/* See if this subfile is already registered. */
for (subfile = m_subfiles; subfile; subfile = subfile->next)
for (subfile *subfile = m_subfiles; subfile; subfile = subfile->next)
{
char *subfile_name;
@ -537,13 +536,9 @@ buildsym_compunit::start_subfile (const char *name)
/* This subfile is not known. Add an entry for it. */
subfile = XNEW (struct subfile);
memset (subfile, 0, sizeof (struct subfile));
subfile_up subfile (new struct subfile);
subfile->next = m_subfiles;
m_subfiles = subfile;
m_current_subfile = subfile;
m_current_subfile = subfile.get ();
subfile->name = xstrdup (name);
@ -562,11 +557,8 @@ buildsym_compunit::start_subfile (const char *name)
source file. */
subfile->language = deduce_language_from_filename (subfile->name);
if (subfile->language == language_unknown
&& subfile->next != NULL)
{
subfile->language = subfile->next->language;
}
if (subfile->language == language_unknown && m_subfiles != nullptr)
subfile->language = m_subfiles->language;
/* If the filename of this subfile ends in .C, then change the
language of any pending subfiles from C to C++. We also accept
@ -586,12 +578,14 @@ buildsym_compunit::start_subfile (const char *name)
/* And patch up this file if necessary. */
if (subfile->language == language_c
&& subfile->next != NULL
&& (subfile->next->language == language_cplus
|| subfile->next->language == language_fortran))
{
subfile->language = subfile->next->language;
}
&& m_subfiles != nullptr
&& (m_subfiles->language == language_cplus
|| m_subfiles->language == language_fortran))
subfile->language = m_subfiles->language;
/* Link this subfile at the front of the subfile list. */
subfile->next = m_subfiles;
m_subfiles = subfile.release ();
}
/* For stabs readers, the first N_SO symbol is assumed to be the
@ -791,7 +785,8 @@ buildsym_compunit::watch_main_source_file_lossage ()
else
prev_mainsub_alias->next = mainsub_alias->next;
xfree (mainsub_alias->name);
xfree (mainsub_alias);
delete mainsub_alias;
}
}
}

View file

@ -45,16 +45,26 @@ struct dynamic_prop;
struct subfile
{
struct subfile *next;
subfile () = default;
/* There's nothing wrong with copying a subfile, but we don't need to, so use
this to avoid copying one by mistake. */
DISABLE_COPY_AND_ASSIGN (subfile);
struct subfile *next = nullptr;
/* Space for this is malloc'd. */
char *name;
char *name = nullptr;
/* Space for this is malloc'd. */
struct linetable *line_vector;
int line_vector_length;
enum language language;
struct symtab *symtab;
struct linetable *line_vector = nullptr;
int line_vector_length = 0;
enum language language = language_unknown;
struct symtab *symtab = nullptr;
};
using subfile_up = std::unique_ptr<subfile>;
/* Record the symbols defined for each context in a list. We don't
create a struct block for the context until we know how long to
make it. */

View file

@ -632,8 +632,6 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
if (offset == 0)
goto return_after_cleanup;
memset (&main_subfile, '\0', sizeof (main_subfile));
if (inclIndx == 0)
/* All source lines were in the main source file. None in include
files. */
@ -651,8 +649,6 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
for (ii = 0; ii < inclIndx; ++ii)
{
struct subfile *tmpSubfile;
/* If there is main file source before include file, enter it. */
if (offset < inclTable[ii].begin)
{
@ -675,14 +671,12 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
else
{
/* Have a new subfile for the include file. */
inclTable[ii].subfile = new subfile;
tmpSubfile = inclTable[ii].subfile = XNEW (struct subfile);
memset (tmpSubfile, '\0', sizeof (struct subfile));
firstLine = &(inclTable[ii].funStartLine);
/* Enter include file's lines now. */
enter_line_range (tmpSubfile, inclTable[ii].begin,
enter_line_range (inclTable[ii].subfile, inclTable[ii].begin,
inclTable[ii].end, start, 0, firstLine);
}