+ /* Start recording information about a primary source file (IOW, not an
+ included source file).
+ COMP_DIR is the directory in which the compilation unit was compiled
+ (or NULL if not known). */
+
+ buildsym_compunit (struct objfile *objfile_, const char *name,
+ const char *comp_dir_, enum language language_,
+ CORE_ADDR last_addr)
+ : objfile (objfile_),
+ m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
+ comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)),
+ language (language_),
+ m_last_source_start_addr (last_addr)
+ {
+ }
+
+ ~buildsym_compunit ()
+ {
+ struct subfile *subfile, *nextsub;
+
+ if (m_pending_macros != nullptr)
+ free_macro_table (m_pending_macros);
+
+ for (subfile = subfiles;
+ subfile != NULL;
+ subfile = nextsub)
+ {
+ nextsub = subfile->next;
+ xfree (subfile->name);
+ xfree (subfile->line_vector);
+ xfree (subfile);
+ }
+ }
+
+ void set_last_source_file (const char *name)
+ {
+ char *new_name = name == NULL ? NULL : xstrdup (name);
+ m_last_source_file.reset (new_name);
+ }
+
+ struct macro_table *get_macro_table ()
+ {
+ if (m_pending_macros == nullptr)
+ m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack,
+ objfile->per_bfd->macro_cache,
+ compunit_symtab);
+ return m_pending_macros;
+ }
+
+ struct macro_table *release_macros ()
+ {
+ struct macro_table *result = m_pending_macros;
+ m_pending_macros = nullptr;
+ return result;
+ }
+