/* Definitions for symbol file management in GDB.
- Copyright (C) 1992-2017 Free Software Foundation, Inc.
+ Copyright (C) 1992-2019 Free Software Foundation, Inc.
This file is part of GDB.
#include "hashtab.h"
#include "gdb_obstack.h" /* For obstack internals. */
#include "objfile-flags.h"
-#include "symfile.h" /* For struct psymbol_allocation_list. */
+#include "symfile.h"
#include "progspace.h"
#include "registry.h"
#include "gdb_bfd.h"
+#include <vector>
+#include "common/next-iterator.h"
+#include "common/safe-iterator.h"
struct bcache;
struct htab;
struct objfile_data;
+struct partial_symbol;
/* This structure maintains information on a per-objfile basis about the
"entry point" of the objfile, and the scope within which the entry point
demangled names. */
minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {};
+
+ /* All the different languages of symbols found in the demangled
+ hash table. A flat/vector-based map is more efficient than a map
+ or hash table here, since this will only usually contain zero or
+ one entries. */
+ std::vector<enum language> demangled_hash_languages;
};
/* Master structure for keeping track of each file from which
struct psymbol_bcache *psymbol_cache;
+ /* Map symbol addresses to the partial symtab that defines the
+ object at that address. */
+
+ std::vector<std::pair<CORE_ADDR, partial_symtab *>> psymbol_map;
+
/* Vectors of all partial symbols read in from file. The actual data
is stored in the objfile_obstack. */
- struct psymbol_allocation_list global_psymbols {};
- struct psymbol_allocation_list static_psymbols {};
+ std::vector<partial_symbol *> global_psymbols;
+ std::vector<partial_symbol *> static_psymbols;
/* Structure which keeps track of functions that manipulate objfile's
of the same type as this objfile. I.e. the function to read partial
extern void free_objfile_separate_debug (struct objfile *);
-extern struct cleanup *make_cleanup_free_objfile (struct objfile *);
-
extern void free_all_objfiles (void);
extern void objfile_relocate (struct objfile *, const struct section_offsets *);
/* In normal use, the section map will be rebuilt by find_pc_section
if objfiles have been added, removed or relocated since it was last
called. Calling inhibit_section_map_updates will inhibit this
- behavior until resume_section_map_updates is called. If you call
- inhibit_section_map_updates you must ensure that every call to
- find_pc_section in the inhibited region relates to a section that
- is already in the section map and has not since been removed or
- relocated. */
-extern void inhibit_section_map_updates (struct program_space *pspace);
-
-/* Resume automatically rebuilding the section map as required. */
-extern void resume_section_map_updates (struct program_space *pspace);
-
-/* Version of the above suitable for use as a cleanup. */
-extern void resume_section_map_updates_cleanup (void *arg);
+ behavior until the returned scoped_restore object is destroyed. If
+ you call inhibit_section_map_updates you must ensure that every
+ call to find_pc_section in the inhibited region relates to a
+ section that is already in the section map and has not since been
+ removed or relocated. */
+extern scoped_restore_tmpl<int> inhibit_section_map_updates
+ (struct program_space *pspace);
extern void default_iterate_over_objfiles_in_search_order
(struct gdbarch *gdbarch,
void *cb_data, struct objfile *current_objfile);
\f
-/* Traverse all object files in the current program space.
- ALL_OBJFILES_SAFE works even if you delete the objfile during the
- traversal. */
+/* An iterarable object that can be used to iterate over all
+ objfiles. The basic use is in a foreach, like:
+
+ for (objfile *objf : all_objfiles (pspace)) { ... } */
+
+class all_objfiles : public next_adapter<struct objfile>
+{
+public:
+
+ explicit all_objfiles (struct program_space *pspace)
+ : next_adapter<struct objfile> (pspace->objfiles)
+ {
+ }
+};
+
+/* An iterarable object that can be used to iterate over all
+ objfiles. The basic use is in a foreach, like:
-/* Traverse all object files in program space SS. */
+ for (objfile *objf : all_objfiles_safe (pspace)) { ... }
-#define ALL_PSPACE_OBJFILES(ss, obj) \
- for ((obj) = ss->objfiles; (obj) != NULL; (obj) = (obj)->next)
+ This variant uses a basic_safe_iterator so that objfiles can be
+ deleted during iteration. */
+
+class all_objfiles_safe
+ : public next_adapter<struct objfile,
+ basic_safe_iterator<next_iterator<objfile>>>
+{
+public:
+
+ explicit all_objfiles_safe (struct program_space *pspace)
+ : next_adapter<struct objfile,
+ basic_safe_iterator<next_iterator<objfile>>>
+ (pspace->objfiles)
+ {
+ }
+};
+
+
+/* Traverse all object files in the current program space. */
#define ALL_OBJFILES(obj) \
for ((obj) = current_program_space->objfiles; \
(obj) != NULL; \
(obj) = (obj)->next)
-#define ALL_OBJFILES_SAFE(obj,nxt) \
- for ((obj) = current_program_space->objfiles; \
- (obj) != NULL? ((nxt)=(obj)->next,1) :0; \
- (obj) = (nxt))
-
/* Traverse all symtabs in one objfile. */
#define ALL_OBJFILE_FILETABS(objfile, cu, s) \