#include "filenames.h"
#include "producer.h"
#include "gdbsupport/pathstuff.h"
+#include "dwarf2/line-header.h"
/* Initialize dwarf2_cu to read PER_CU, in the context of PER_OBJFILE. */
m_checked_producer = true;
}
+
+/* See dwarf2/cu.h. */
+
+void
+dwarf2_cu::create_subfiles_and_symtabs ()
+{
+ buildsym_compunit *builder = this->get_builder ();
+ compunit_symtab *cust = builder->get_compunit_symtab ();
+
+ for (file_entry &fe : this->line_header->file_names ())
+ {
+ dwarf2_start_subfile (*this, fe);
+ subfile *sf = builder->get_current_subfile ();
+
+ if (sf->symtab == nullptr)
+ sf->symtab = allocate_symtab (cust, sf->name.c_str (),
+ sf->name_for_id.c_str ());
+
+ fe.symtab = sf->symtab;
+ }
+}
const char *comp_dir,
CORE_ADDR low_pc);
+ /* Create a subfile and symtab for every entry in the line_header. */
+ void create_subfiles_and_symtabs ();
+
/* Reset the builder. */
void reset_builder () { m_builder.reset (); }
/* Make sure a symtab is created for every file, even files
which contain only variables (i.e. no code with associated
line numbers). */
- buildsym_compunit *builder = cu->get_builder ();
- struct compunit_symtab *cust = builder->get_compunit_symtab ();
-
- for (file_entry &fe : cu->line_header->file_names ())
- {
- dwarf2_start_subfile (*cu, fe);
- subfile *sf = builder->get_current_subfile ();
-
- if (sf->symtab == nullptr)
- sf->symtab = allocate_symtab (cust, sf->name.c_str (),
- sf->name_for_id.c_str ());
-
- fe.symtab = sf->symtab;
- }
+ cu->create_subfiles_and_symtabs ();
}
= XOBNEWVEC (&cust->objfile ()->objfile_obstack,
struct symtab *, line_header->file_names_size ());
+ this->create_subfiles_and_symtabs ();
+
auto &file_names = line_header->file_names ();
for (i = 0; i < file_names.size (); ++i)
{
file_entry &fe = file_names[i];
- dwarf2_start_subfile (*this, fe);
- buildsym_compunit *b = get_builder ();
- subfile *sf = b->get_current_subfile ();
-
- if (sf->symtab == nullptr)
- {
- /* NOTE: start_subfile will recognize when it's been
- passed a file it has already seen. So we can't
- assume there's a simple mapping from
- cu->line_header->file_names to subfiles, plus
- cu->line_header->file_names may contain dups. */
- const char *name = sf->name.c_str ();
- const char *name_for_id = sf->name_for_id.c_str ();
- sf->symtab = allocate_symtab (cust, name, name_for_id);
- }
-
- fe.symtab = b->get_current_subfile ()->symtab;
+ gdb_assert (fe.symtab != nullptr);
tug_unshare->symtabs[i] = fe.symtab;
}
}