struct block *block;
};
-/* Initial sizes of data structures. These are realloc'd larger if
- needed, and realloc'd down to the size actually used, when
- completed. */
-
-#define INITIAL_LINE_VECTOR_LENGTH 1000
-\f
-
buildsym_compunit::buildsym_compunit (struct objfile *objfile_,
const char *name,
const char *comp_dir_,
subfile = nextsub)
{
nextsub = subfile->next;
- xfree (subfile->line_vector);
delete subfile;
}
m_current_subfile = subfile.get ();
- /* Initialize line-number recording for this subfile. */
- subfile->line_vector = NULL;
-
/* Default the source language to whatever can be deduced from the
filename. If nothing can be deduced (such as for a C/C++ include
file with a ".h" extension), then inherit whatever language the
buildsym_compunit::record_line (struct subfile *subfile, int line,
CORE_ADDR pc, linetable_entry_flags flags)
{
- struct linetable_entry *e;
-
- /* Make sure line vector exists and is big enough. */
- if (!subfile->line_vector)
- {
- subfile->line_vector_length = INITIAL_LINE_VECTOR_LENGTH;
- subfile->line_vector = (struct linetable *)
- xmalloc (sizeof (struct linetable)
- + subfile->line_vector_length * sizeof (struct linetable_entry));
- subfile->line_vector->nitems = 0;
- m_have_line_numbers = true;
- }
-
- if (subfile->line_vector->nitems >= subfile->line_vector_length)
- {
- subfile->line_vector_length *= 2;
- subfile->line_vector = (struct linetable *)
- xrealloc ((char *) subfile->line_vector,
- (sizeof (struct linetable)
- + (subfile->line_vector_length
- * sizeof (struct linetable_entry))));
- }
+ m_have_line_numbers = true;
/* Normally, we treat lines as unsorted. But the end of sequence
marker is special. We sort line markers at the same PC by line
anyway. */
if (line == 0)
{
- struct linetable_entry *last = nullptr;
- while (subfile->line_vector->nitems > 0)
+ gdb::optional<int> last_line;
+
+ while (!subfile->line_vector_entries.empty ())
{
- last = subfile->line_vector->item + subfile->line_vector->nitems - 1;
+ linetable_entry *last = &subfile->line_vector_entries.back ();
+ last_line = last->line;
+
if (last->pc != pc)
break;
- subfile->line_vector->nitems--;
+
+ subfile->line_vector_entries.pop_back ();
}
/* Ignore an end-of-sequence marker marking an empty sequence. */
- if (last == nullptr || last->line == 0)
+ if (!last_line.has_value () || *last_line == 0)
return;
}
- e = subfile->line_vector->item + subfile->line_vector->nitems++;
- e->line = line;
- e->is_stmt = (flags & LEF_IS_STMT) != 0;
- e->pc = pc;
- e->prologue_end = (flags & LEF_PROLOGUE_END) != 0;
+ subfile->line_vector_entries.emplace_back ();
+ linetable_entry &e = subfile->line_vector_entries.back ();
+ e.line = line;
+ e.is_stmt = (flags & LEF_IS_STMT) != 0;
+ e.pc = pc;
+ e.prologue_end = (flags & LEF_PROLOGUE_END) != 0;
}
\f
/* If the main source file doesn't have any line number or symbol
info, look for an alias in another subfile. */
- if (mainsub->line_vector == NULL
+ if (mainsub->line_vector_entries.empty ()
&& mainsub->symtab == NULL)
{
const char *mainbase = lbasename (mainsub->name.c_str ());
Copy its line_vector and symtab to the main subfile
and then discard it. */
- mainsub->line_vector = mainsub_alias->line_vector;
- mainsub->line_vector_length = mainsub_alias->line_vector_length;
+ mainsub->line_vector_entries
+ = std::move (mainsub_alias->line_vector_entries);
mainsub->symtab = mainsub_alias->symtab;
if (prev_mainsub_alias == NULL)
subfile != NULL;
subfile = subfile->next)
{
- int linetablesize = 0;
-
- if (subfile->line_vector)
+ if (!subfile->line_vector_entries.empty ())
{
- linetablesize = sizeof (struct linetable) +
- subfile->line_vector->nitems * sizeof (struct linetable_entry);
-
const auto lte_is_less_than
= [] (const linetable_entry &ln1,
const linetable_entry &ln2) -> bool
address, as this maintains the inline function caller/callee
relationships, this is why std::stable_sort is used. */
if (m_objfile->flags & OBJF_REORDERED)
- std::stable_sort (subfile->line_vector->item,
- subfile->line_vector->item
- + subfile->line_vector->nitems,
+ std::stable_sort (subfile->line_vector_entries.begin (),
+ subfile->line_vector_entries.end (),
lte_is_less_than);
}
/* Fill in its components. */
- if (subfile->line_vector)
+ if (!subfile->line_vector_entries.empty ())
{
- /* Reallocate the line table on the symbol obstack. */
+ /* Reallocate the line table on the objfile obstack. */
+ size_t n_entries = subfile->line_vector_entries.size ();
+ size_t entry_array_size = n_entries * sizeof (struct linetable_entry);
+ int linetablesize = sizeof (struct linetable) + entry_array_size;
+
symtab->set_linetable
- ((struct linetable *)
- obstack_alloc (&m_objfile->objfile_obstack, linetablesize));
- memcpy (symtab->linetable (), subfile->line_vector, linetablesize);
+ (XOBNEWVAR (&m_objfile->objfile_obstack, struct linetable,
+ linetablesize));
+
+ symtab->linetable ()->nitems = n_entries;
+ memcpy (symtab->linetable ()->item,
+ subfile->line_vector_entries.data (), entry_array_size);
}
else
symtab->set_linetable (nullptr);
static void add_stab_to_list (char *, struct pending_stabs **);
#endif
-static struct linetable *arrange_linetable (struct linetable *);
-
static void record_include_end (struct coff_symbol *);
static void process_linenos (CORE_ADDR, CORE_ADDR);
/* Given a line table with function entries are marked, arrange its
functions in ascending order and strip off function entry markers
- and return it in a newly created table. If the old one is good
- enough, return the old one. */
+ and return it in a newly created table. */
+
/* FIXME: I think all this stuff can be replaced by just passing
sort_linevec = 1 to end_compunit_symtab. */
-static struct linetable *
-arrange_linetable (struct linetable *oldLineTb)
+static void
+arrange_linetable (std::vector<linetable_entry> &old_linetable)
{
int extra_lines = 0;
std::vector<linetable_entry> fentries;
- for (int ii = 0; ii < oldLineTb->nitems; ++ii)
+ for (int ii = 0; ii < old_linetable.size (); ++ii)
{
- if (oldLineTb->item[ii].is_stmt == 0)
+ if (old_linetable[ii].is_stmt == 0)
continue;
- if (oldLineTb->item[ii].line == 0)
+ if (old_linetable[ii].line == 0)
{
/* Function entry found. */
fentries.emplace_back ();
linetable_entry &e = fentries.back ();
e.line = ii;
e.is_stmt = 1;
- e.pc = oldLineTb->item[ii].pc;
+ e.pc = old_linetable[ii].pc;
/* If the function was compiled with XLC, we may have to add an
extra line entry later. Reserve space for that. */
- if (ii + 1 < oldLineTb->nitems
- && oldLineTb->item[ii].pc != oldLineTb->item[ii + 1].pc)
+ if (ii + 1 < old_linetable.size ()
+ && old_linetable[ii].pc != old_linetable[ii + 1].pc)
extra_lines++;
}
}
if (fentries.empty ())
- return oldLineTb;
+ return;
std::sort (fentries.begin (), fentries.end (),
[] (const linetable_entry <e1, const linetable_entry& lte2)
{ return lte1.pc < lte2.pc; });
/* Allocate a new line table. */
- int new_linetable_nitems = oldLineTb->nitems - fentries.size () + extra_lines;
- linetable *new_linetable
- = XNEWVAR (linetable,
- (sizeof (struct linetable)
- + (new_linetable_nitems * sizeof (struct linetable_entry))));
+ std::vector<linetable_entry> new_linetable;
+ new_linetable.reserve (old_linetable.size ());
/* If line table does not start with a function beginning, copy up until
a function begin. */
-
- int newline = 0;
- if (oldLineTb->item[0].line != 0)
- for (newline = 0;
- newline < oldLineTb->nitems && oldLineTb->item[newline].line;
- ++newline)
- new_linetable->item[newline] = oldLineTb->item[newline];
+ for (int i = 0; i < old_linetable.size () && old_linetable[i].line != 0; ++i)
+ new_linetable.push_back (old_linetable[i]);
/* Now copy function lines one by one. */
-
for (const linetable_entry &entry : fentries)
{
/* If the function was compiled with XLC, we may have to add an
extra line to cover the function prologue. */
int jj = entry.line;
- if (jj + 1 < oldLineTb->nitems
- && oldLineTb->item[jj].pc != oldLineTb->item[jj + 1].pc)
+ if (jj + 1 < old_linetable.size ()
+ && old_linetable[jj].pc != old_linetable[jj + 1].pc)
{
- new_linetable->item[newline] = oldLineTb->item[jj];
- new_linetable->item[newline].line = oldLineTb->item[jj + 1].line;
- newline++;
+ new_linetable.push_back (old_linetable[jj]);
+ new_linetable.back ().line = old_linetable[jj + 1].line;
}
for (jj = entry.line + 1;
- jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0;
- ++jj, ++newline)
- new_linetable->item[newline] = oldLineTb->item[jj];
+ jj < old_linetable.size () && old_linetable[jj].line != 0;
+ ++jj)
+ new_linetable.push_back (old_linetable[jj]);
}
- /* The number of items in the line table must include these
- extra lines which were added in case of XLC compiled functions. */
- new_linetable->nitems = new_linetable_nitems;
- return new_linetable;
+ new_linetable.shrink_to_fit ();
+ old_linetable = std::move (new_linetable);
}
/* include file support: C_BINCL/C_EINCL pairs will be kept in the
static void
process_linenos (CORE_ADDR start, CORE_ADDR end)
{
- int offset, ii;
+ int offset;
file_ptr max_offset
= XCOFF_DATA (this_symtab_objfile)->max_lineno_offset;
coff_data (this_symtab_objfile->obfd)->local_linesz;
main_source_baseline = 0;
- for (ii = 0; ii < inclIndx; ++ii)
+ for (int ii = 0; ii < inclIndx; ++ii)
{
/* If there is main file source before include file, enter it. */
if (offset < inclTable[ii].begin)
}
/* Process main file's line numbers. */
- if (main_subfile.line_vector)
+ if (!main_subfile.line_vector_entries.empty ())
{
- struct linetable *lineTb, *lv;
-
- lv = main_subfile.line_vector;
-
/* Line numbers are not necessarily ordered. xlc compilation will
put static function to the end. */
-
- struct subfile *current_subfile = get_current_subfile ();
- lineTb = arrange_linetable (lv);
- if (lv == lineTb)
- {
- current_subfile->line_vector = (struct linetable *)
- xrealloc (lv, (sizeof (struct linetable)
- + lv->nitems * sizeof (struct linetable_entry)));
- }
- else
- {
- xfree (lv);
- current_subfile->line_vector = lineTb;
- }
-
- current_subfile->line_vector_length =
- current_subfile->line_vector->nitems;
+ arrange_linetable (main_subfile.line_vector_entries);
}
/* Now, process included files' line numbers. */
- for (ii = 0; ii < inclIndx; ++ii)
+ for (int ii = 0; ii < inclIndx; ++ii)
{
if (inclTable[ii].subfile != ((struct subfile *) &main_subfile)
- && (inclTable[ii].subfile)->line_vector) /* Useless if!!!
- FIXMEmgo */
+ && !inclTable[ii].subfile->line_vector_entries.empty ())
{
- struct linetable *lineTb, *lv;
-
- lv = (inclTable[ii].subfile)->line_vector;
-
/* Line numbers are not necessarily ordered. xlc compilation will
put static function to the end. */
-
- lineTb = arrange_linetable (lv);
+ arrange_linetable (inclTable[ii].subfile->line_vector_entries);
push_subfile ();
current_subfile->name = inclTable[ii].name;
#endif
- if (lv == lineTb)
- {
- current_subfile->line_vector =
- (struct linetable *) xrealloc
- (lv, (sizeof (struct linetable)
- + lv->nitems * sizeof (struct linetable_entry)));
-
- }
- else
- {
- xfree (lv);
- current_subfile->line_vector = lineTb;
- }
-
- current_subfile->line_vector_length =
- current_subfile->line_vector->nitems;
start_subfile (pop_subfile ());
}
}