X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fobjfiles.h;h=34240558da3d8823fd6206c356f0b8652a2b0cc3;hb=343cc95202fce70383551053f2efab09c5e02366;hp=1fa6f3c40ab23228d3cad22d1fb90937f4cc00b4;hpb=db92718b541158d4782dbc9f48401c20f2bbad6d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 1fa6f3c40a..34240558da 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -30,10 +30,11 @@ #include "psymtab.h" #include #include -#include "common/next-iterator.h" -#include "common/safe-iterator.h" +#include "gdbsupport/next-iterator.h" +#include "gdbsupport/safe-iterator.h" +#include "bcache.h" +#include "gdbarch.h" -struct bcache; struct htab; struct objfile_data; struct partial_symbol; @@ -68,8 +69,8 @@ struct partial_symbol; testcase are broken for some targets. In this test the functions are all implemented as part of one file and the testcase is not necessarily linked with a start file (depending on the target). - What happens is, that the first frame is printed normaly and - following frames are treated as being inside the enttry file then. + What happens is, that the first frame is printed normally and + following frames are treated as being inside the entry file then. This way, only the #0 frame is printed in the backtrace output.'' Ref "frame.c" "NOTE: vinschen/2003-04-01". @@ -142,14 +143,14 @@ struct obj_section /* The memory address of section S (vma + offset). */ #define obj_section_addr(s) \ - (bfd_get_section_vma ((s)->objfile->obfd, s->the_bfd_section) \ + (bfd_section_vma (s->the_bfd_section) \ + obj_section_offset (s)) /* The one-passed-the-end memory address of section S (vma + size + offset). */ #define obj_section_endaddr(s) \ - (bfd_get_section_vma ((s)->objfile->obfd, s->the_bfd_section) \ - + bfd_get_section_size ((s)->the_bfd_section) \ + (bfd_section_vma (s->the_bfd_section) \ + + bfd_section_size ((s)->the_bfd_section) \ + obj_section_offset (s)) /* The "objstats" structure provides a place for gdb to record some @@ -243,11 +244,11 @@ struct objfile_per_bfd_storage /* Byte cache for file names. */ - struct bcache filename_cache; + gdb::bcache filename_cache; /* Byte cache for macros. */ - struct bcache macro_cache; + gdb::bcache macro_cache; /* The gdbarch associated with the BFD. Note that this gdbarch is determined solely from BFD information, without looking at target @@ -257,10 +258,10 @@ struct objfile_per_bfd_storage struct gdbarch *gdbarch = NULL; /* Hash table for mapping symbol names to demangled names. Each - entry in the hash table is actually two consecutive strings, - both null-terminated; the first one is a mangled or linkage - name, and the second is the demangled name or just a zero byte - if the name doesn't demangle. */ + entry in the hash table is a demangled_name_entry struct, storing the + language and two consecutive strings, both null-terminated; the first one + is a mangled or linkage name, and the second is the demangled name or just + a zero byte if the name doesn't demangle. */ htab_up demangled_names_hash; @@ -282,11 +283,9 @@ struct objfile_per_bfd_storage name and a zero value for the address. This makes it easy to walk through the array when passed a pointer to somewhere in the middle of it. There is also a count of the number of symbols, which does - not include the terminating null symbol. The array itself, as well - as all the data that it points to, should be allocated on the - objfile_obstack for this file. */ + not include the terminating null symbol. */ - minimal_symbol *msymbols = NULL; + gdb::unique_xmalloc_ptr msymbols; int minimal_symbol_count = 0; /* The number of minimal symbols read, before any minimal symbol @@ -306,12 +305,14 @@ struct objfile_per_bfd_storage bool minsyms_read : 1; - /* This is a hash table used to index the minimal symbols by name. */ + /* This is a hash table used to index the minimal symbols by (mangled) + name. */ minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE] {}; /* This hash table is used to index the minimal symbols by their - demangled names. */ + demangled names. Uses a language-specific hash function via + search_name_hash. */ minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {}; @@ -320,19 +321,97 @@ struct objfile_per_bfd_storage std::bitset demangled_hash_languages; }; +/* An iterator that first returns a parent objfile, and then each + separate debug objfile. */ + +class separate_debug_iterator +{ +public: + + explicit separate_debug_iterator (struct objfile *objfile) + : m_objfile (objfile), + m_parent (objfile) + { + } + + bool operator!= (const separate_debug_iterator &other) + { + return m_objfile != other.m_objfile; + } + + separate_debug_iterator &operator++ (); + + struct objfile *operator* () + { + return m_objfile; + } + +private: + + struct objfile *m_objfile; + struct objfile *m_parent; +}; + +/* A range adapter wrapping separate_debug_iterator. */ + +class separate_debug_range +{ +public: + + explicit separate_debug_range (struct objfile *objfile) + : m_objfile (objfile) + { + } + + separate_debug_iterator begin () + { + return separate_debug_iterator (m_objfile); + } + + separate_debug_iterator end () + { + return separate_debug_iterator (nullptr); + } + +private: + + struct objfile *m_objfile; +}; + /* Master structure for keeping track of each file from which gdb reads symbols. There are several ways these get allocated: 1. The main symbol file, symfile_objfile, set by the symbol-file command, 2. Additional symbol files added by the add-symbol-file command, 3. Shared library objfiles, added by ADD_SOLIB, 4. symbol files for modules that were loaded when GDB attached to a remote system - (see remote-vx.c). */ + (see remote-vx.c). + + GDB typically reads symbols twice -- first an initial scan which just + reads "partial symbols"; these are partial information for the + static/global symbols in a symbol file. When later looking up symbols, + objfile->sf->qf->lookup_symbol is used to check if we only have a partial + symbol and if so, read and expand the full compunit. */ struct objfile { +private: + + /* The only way to create an objfile is to call objfile::make. */ objfile (bfd *, const char *, objfile_flags); + + /* The only way to free an objfile is via 'unlink'. */ ~objfile (); +public: + + /* Create an objfile. */ + static objfile *make (bfd *bfd_, const char *name_, objfile_flags flags_, + objfile *parent = nullptr); + + /* Remove an objfile from the current program space, and free + it. */ + void unlink (); + DISABLE_COPY_AND_ASSIGN (objfile); /* A range adapter that makes it possible to iterate over all @@ -375,13 +454,13 @@ struct objfile minimal_symbol_iterator begin () const { - return minimal_symbol_iterator (m_objfile->per_bfd->msymbols); + return minimal_symbol_iterator (m_objfile->per_bfd->msymbols.get ()); } minimal_symbol_iterator end () const { return minimal_symbol_iterator - (m_objfile->per_bfd->msymbols + (m_objfile->per_bfd->msymbols.get () + m_objfile->per_bfd->minimal_symbol_count); } @@ -398,12 +477,14 @@ struct objfile return msymbols_range (this); } + /* Return a range adapter for iterating over all the separate debug + objfiles of this objfile. */ - /* All struct objfile's are chained together by their next pointers. - The program space field "objfiles" (frequently referenced via - the macro "object_files") points to the first link in this chain. */ + separate_debug_range separate_debug_objfiles () + { + return separate_debug_range (this); + } - struct objfile *next = nullptr; /* The object file's original name as specified by the user, made absolute, and tilde-expanded. However, it is not canonicalized @@ -411,7 +492,7 @@ struct objfile This pointer is never NULL. This does not have to be freed; it is guaranteed to have a lifetime at least as long as the objfile. */ - char *original_name = nullptr; + const char *original_name = nullptr; CORE_ADDR addr_low = 0; @@ -552,9 +633,23 @@ struct objfile Very few blocks have a static link, so it's more memory efficient to store these here rather than in struct block. Static links must be allocated on the objfile's obstack. */ - htab_t static_links {}; + htab_up static_links; +}; + +/* A deleter for objfile. */ + +struct objfile_deleter +{ + void operator() (objfile *ptr) const + { + ptr->unlink (); + } }; +/* A unique pointer that holds an objfile. */ + +typedef std::unique_ptr objfile_up; + /* Declarations for functions defined in objfiles.c */ extern struct gdbarch *get_objfile_arch (const struct objfile *); @@ -565,19 +660,8 @@ extern CORE_ADDR entry_point_address (void); extern void build_objfile_section_table (struct objfile *); -extern struct objfile *objfile_separate_debug_iterate (const struct objfile *, - const struct objfile *); - -extern void put_objfile_before (struct objfile *, struct objfile *); - -extern void add_separate_debug_objfile (struct objfile *, struct objfile *); - -extern void unlink_objfile (struct objfile *); - extern void free_objfile_separate_debug (struct objfile *); -extern void free_all_objfiles (void); - extern void objfile_relocate (struct objfile *, const struct section_offsets *); extern void objfile_rebase (struct objfile *, CORE_ADDR); @@ -681,10 +765,6 @@ extern void default_iterate_over_objfiles_in_search_order uninitialized section index. */ #define SECT_OFF_BSS(objfile) (objfile)->sect_index_bss -/* Answer whether there is more than one object file loaded. */ - -#define MULTI_OBJFILE_P() (object_files && object_files->next) - /* Reset the per-BFD storage area on OBJ. */ void set_objfile_per_bfd (struct objfile *obj);