| Index: gdb/objfiles.h
|
| diff --git a/gdb/objfiles.h b/gdb/objfiles.h
|
| index 01c3aead713119a31a95fe410de59b377016c3d0..4920e4d6fbc524c31e0479254fc16cda0da565ca 100644
|
| --- a/gdb/objfiles.h
|
| +++ b/gdb/objfiles.h
|
| @@ -1,6 +1,6 @@
|
| /* Definitions for symbol file management in GDB.
|
|
|
| - Copyright (C) 1992-2004, 2007-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 1992-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -23,6 +23,8 @@
|
| #include "gdb_obstack.h" /* For obstack internals. */
|
| #include "symfile.h" /* For struct psymbol_allocation_list. */
|
| #include "progspace.h"
|
| +#include "registry.h"
|
| +#include "gdb_bfd.h"
|
|
|
| struct bcache;
|
| struct htab;
|
| @@ -122,7 +124,7 @@ struct obj_section
|
|
|
| /* Relocation offset applied to S. */
|
| #define obj_section_offset(s) \
|
| - (((s)->objfile->section_offsets)->offsets[(s)->the_bfd_section->index])
|
| + (((s)->objfile->section_offsets)->offsets[gdb_bfd_section_index ((s)->objfile->obfd, (s)->the_bfd_section)])
|
|
|
| /* The memory address of section S (vma + offset). */
|
| #define obj_section_addr(s) \
|
| @@ -159,6 +161,39 @@ extern void print_symbol_bcache_statistics (void);
|
| /* Number of entries in the minimal symbol hash table. */
|
| #define MINIMAL_SYMBOL_HASH_SIZE 2039
|
|
|
| +/* Some objfile data is hung off the BFD. This enables sharing of the
|
| + data across all objfiles using the BFD. The data is stored in an
|
| + instance of this structure, and associated with the BFD using the
|
| + registry system. */
|
| +
|
| +struct objfile_per_bfd_storage
|
| +{
|
| + /* The storage has an obstack of its own. */
|
| +
|
| + struct obstack storage_obstack;
|
| +
|
| + /* Byte cache for file names. */
|
| +
|
| + struct bcache *filename_cache;
|
| +
|
| + /* Byte cache for macros. */
|
| + struct bcache *macro_cache;
|
| +
|
| + /* The gdbarch associated with the BFD. Note that this gdbarch is
|
| + determined solely from BFD information, without looking at target
|
| + information. The gdbarch determined from a running target may
|
| + differ from this e.g. with respect to register types and names. */
|
| +
|
| + struct gdbarch *gdbarch;
|
| +
|
| + /* 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. */
|
| + struct htab *demangled_names_hash;
|
| +};
|
| +
|
| /* 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,
|
| @@ -177,10 +212,13 @@ struct objfile
|
|
|
| struct objfile *next;
|
|
|
| - /* The object file's name, tilde-expanded and absolute. Malloc'd; free it
|
| - if you free this struct. This pointer is never NULL. */
|
| + /* The object file's original name as specified by the user,
|
| + made absolute, and tilde-expanded. However, it is not canonicalized
|
| + (i.e., it has not been passed through gdb_realpath).
|
| + 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 *name;
|
| + char *original_name;
|
|
|
| CORE_ADDR addr_low;
|
|
|
| @@ -221,23 +259,16 @@ struct objfile
|
|
|
| bfd *obfd;
|
|
|
| - /* The gdbarch associated with the BFD. Note that this gdbarch is
|
| - determined solely from BFD information, without looking at target
|
| - information. The gdbarch determined from a running target may
|
| - differ from this e.g. with respect to register types and names. */
|
| + /* The per-BFD data. Note that this is treated specially if OBFD
|
| + is NULL. */
|
|
|
| - struct gdbarch *gdbarch;
|
| + struct objfile_per_bfd_storage *per_bfd;
|
|
|
| /* The modification timestamp of the object file, as of the last time
|
| we read its symbols. */
|
|
|
| long mtime;
|
|
|
| - /* Cached 32-bit CRC as computed by gnu_debuglink_crc32. CRC32 is valid
|
| - iff CRC32_P. */
|
| - unsigned long crc32;
|
| - int crc32_p;
|
| -
|
| /* Obstack to hold objects that should be freed when we load a new symbol
|
| table from this object file. */
|
|
|
| @@ -247,15 +278,6 @@ struct objfile
|
| will not change. */
|
|
|
| struct psymbol_bcache *psymbol_cache; /* Byte cache for partial syms. */
|
| - struct bcache *macro_cache; /* Byte cache for macros. */
|
| - struct bcache *filename_cache; /* Byte cache for file names. */
|
| -
|
| - /* 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. */
|
| - struct htab *demangled_names_hash;
|
|
|
| /* Vectors of all partial symbols read in from file. The actual data
|
| is stored in the objfile_obstack. */
|
| @@ -298,33 +320,9 @@ struct objfile
|
|
|
| struct entry_info ei;
|
|
|
| - /* Information about stabs. Will be filled in with a dbx_symfile_info
|
| - struct by those readers that need it. */
|
| - /* NOTE: cagney/2004-10-23: This has been replaced by per-objfile
|
| - data points implemented using "data" and "num_data" below. For
|
| - an example of how to use this replacement, see "objfile_data"
|
| - in "mips-tdep.c". */
|
| -
|
| - struct dbx_symfile_info *deprecated_sym_stab_info;
|
| -
|
| - /* Hook for information for use by the symbol reader (currently used
|
| - for information shared by sym_init and sym_read). It is
|
| - typically a pointer to malloc'd memory. The symbol reader's finish
|
| - function is responsible for freeing the memory thusly allocated. */
|
| - /* NOTE: cagney/2004-10-23: This has been replaced by per-objfile
|
| - data points implemented using "data" and "num_data" below. For
|
| - an example of how to use this replacement, see "objfile_data"
|
| - in "mips-tdep.c". */
|
| -
|
| - void *deprecated_sym_private;
|
| -
|
| /* Per objfile data-pointers required by other GDB modules. */
|
| - /* FIXME: kettenis/20030711: This mechanism could replace
|
| - deprecated_sym_stab_info and deprecated_sym_private
|
| - entirely. */
|
|
|
| - void **data;
|
| - unsigned num_data;
|
| + REGISTRY_FIELDS;
|
|
|
| /* Set of relocation offsets to apply to each section.
|
| The table is indexed by the_bfd_section->index, thus it is generally
|
| @@ -354,9 +352,10 @@ struct objfile
|
| among other things, is used to map pc addresses into sections.
|
| SECTIONS points to the first entry in the table, and
|
| SECTIONS_END points to the first location past the last entry
|
| - in the table. The table is stored on the objfile_obstack.
|
| - There is no particular order to the sections in this table, and it
|
| - only contains sections we care about (e.g. non-empty, SEC_ALLOC). */
|
| + in the table. The table is stored on the objfile_obstack. The
|
| + sections are indexed by the BFD section index; but the
|
| + structure data is only valid for certain sections
|
| + (e.g. non-empty, SEC_ALLOC). */
|
|
|
| struct obj_section *sections, *sections_end;
|
|
|
| @@ -432,19 +431,17 @@ struct objfile
|
|
|
| #define OBJF_MAINLINE (1 << 5)
|
|
|
| -/* The object file that contains the runtime common minimal symbols
|
| - for SunOS4. Note that this objfile has no associated BFD. */
|
| +/* ORIGINAL_NAME and OBFD->FILENAME correspond to text description unrelated to
|
| + filesystem names. It can be for example "<image in memory>". */
|
|
|
| -extern struct objfile *rt_common_objfile;
|
| +#define OBJF_NOT_FILENAME (1 << 6)
|
|
|
| /* Declarations for functions defined in objfiles.c */
|
|
|
| -extern struct objfile *allocate_objfile (bfd *, int);
|
| +extern struct objfile *allocate_objfile (bfd *, const char *name, int);
|
|
|
| extern struct gdbarch *get_objfile_arch (struct objfile *);
|
|
|
| -extern void init_entry_point_info (struct objfile *);
|
| -
|
| extern int entry_point_address_query (CORE_ADDR *entry_p);
|
|
|
| extern CORE_ADDR entry_point_address (void);
|
| @@ -458,8 +455,6 @@ extern struct objfile *objfile_separate_debug_iterate (const struct objfile *,
|
|
|
| extern void put_objfile_before (struct objfile *, struct objfile *);
|
|
|
| -extern void objfile_to_front (struct objfile *);
|
| -
|
| extern void add_separate_debug_objfile (struct objfile *, struct objfile *);
|
|
|
| extern void unlink_objfile (struct objfile *);
|
| @@ -472,7 +467,8 @@ extern struct cleanup *make_cleanup_free_objfile (struct objfile *);
|
|
|
| extern void free_all_objfiles (void);
|
|
|
| -extern void objfile_relocate (struct objfile *, struct section_offsets *);
|
| +extern void objfile_relocate (struct objfile *, const struct section_offsets *);
|
| +extern void objfile_rebase (struct objfile *, CORE_ADDR);
|
|
|
| extern int objfile_has_partial_symbols (struct objfile *objfile);
|
|
|
| @@ -484,8 +480,13 @@ extern int have_partial_symbols (void);
|
|
|
| extern int have_full_symbols (void);
|
|
|
| +extern void objfile_set_sym_fns (struct objfile *objfile,
|
| + const struct sym_fns *sf);
|
| +
|
| extern void objfiles_changed (void);
|
|
|
| +extern int is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile);
|
| +
|
| /* This operation deletes all objfile entries that represent solibs that
|
| weren't explicitly loaded by the user, via e.g., the add-symbol-file
|
| command. */
|
| @@ -499,32 +500,37 @@ extern int have_minimal_symbols (void);
|
|
|
| extern struct obj_section *find_pc_section (CORE_ADDR pc);
|
|
|
| -extern int in_plt_section (CORE_ADDR, char *);
|
| +/* Return non-zero if PC is in a section called NAME. */
|
| +extern int pc_in_section (CORE_ADDR, char *);
|
| +
|
| +/* Return non-zero if PC is in a SVR4-style procedure linkage table
|
| + section. */
|
| +
|
| +static inline int
|
| +in_plt_section (CORE_ADDR pc)
|
| +{
|
| + return pc_in_section (pc, ".plt");
|
| +}
|
|
|
| /* Keep a registry of per-objfile data-pointers required by other GDB
|
| modules. */
|
| +DECLARE_REGISTRY(objfile);
|
|
|
| -/* Allocate an entry in the per-objfile registry. */
|
| -extern const struct objfile_data *register_objfile_data (void);
|
| -
|
| -/* Allocate an entry in the per-objfile registry.
|
| - SAVE and FREE are called when clearing objfile data.
|
| - First all registered SAVE functions are called.
|
| - Then all registered FREE functions are called.
|
| - Either or both of SAVE, FREE may be NULL. */
|
| -extern const struct objfile_data *register_objfile_data_with_cleanup
|
| - (void (*save) (struct objfile *, void *),
|
| - void (*free) (struct objfile *, void *));
|
| +/* 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);
|
|
|
| -extern void clear_objfile_data (struct objfile *objfile);
|
| -extern void set_objfile_data (struct objfile *objfile,
|
| - const struct objfile_data *data, void *value);
|
| -extern void *objfile_data (struct objfile *objfile,
|
| - const struct objfile_data *data);
|
| +/* Resume automatically rebuilding the section map as required. */
|
| +extern void resume_section_map_updates (struct program_space *pspace);
|
|
|
| -extern struct bfd *gdb_bfd_ref (struct bfd *abfd);
|
| -extern void gdb_bfd_unref (struct bfd *abfd);
|
| -extern int gdb_bfd_close_or_warn (struct bfd *abfd);
|
| +/* Version of the above suitable for use as a cleanup. */
|
| +extern void resume_section_map_updates_cleanup (void *arg);
|
|
|
| extern void default_iterate_over_objfiles_in_search_order
|
| (struct gdbarch *gdbarch,
|
| @@ -539,7 +545,7 @@ extern void default_iterate_over_objfiles_in_search_order
|
| /* Traverse all object files in program space SS. */
|
|
|
| #define ALL_PSPACE_OBJFILES(ss, obj) \
|
| - for ((obj) = ss->objfiles; (obj) != NULL; (obj) = (obj)->next) \
|
| + for ((obj) = ss->objfiles; (obj) != NULL; (obj) = (obj)->next)
|
|
|
| #define ALL_PSPACE_OBJFILES_SAFE(ss, obj, nxt) \
|
| for ((obj) = ss->objfiles; \
|
| @@ -603,7 +609,12 @@ extern void default_iterate_over_objfiles_in_search_order
|
| ALL_OBJFILE_MSYMBOLS (objfile, m)
|
|
|
| #define ALL_OBJFILE_OSECTIONS(objfile, osect) \
|
| - for (osect = objfile->sections; osect < objfile->sections_end; osect++)
|
| + for (osect = objfile->sections; osect < objfile->sections_end; osect++) \
|
| + if (osect->the_bfd_section == NULL) \
|
| + { \
|
| + /* Nothing. */ \
|
| + } \
|
| + else
|
|
|
| /* Traverse all obj_sections in all objfiles in the current program
|
| space.
|
| @@ -639,9 +650,7 @@ extern void default_iterate_over_objfiles_in_search_order
|
| ? ((objfile) = (objfile)->next, \
|
| (objfile) != NULL ? (osect) = (objfile)->sections_end : 0) \
|
| : 0)) \
|
| - for ((osect) = (objfile)->sections; \
|
| - (osect) < (objfile)->sections_end; \
|
| - (osect)++)
|
| + ALL_OBJFILE_OSECTIONS (objfile, osect)
|
|
|
| #define SECT_OFF_DATA(objfile) \
|
| ((objfile->sect_index_data == -1) \
|
| @@ -670,4 +679,10 @@ extern void default_iterate_over_objfiles_in_search_order
|
|
|
| #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);
|
| +
|
| +const char *objfile_name (const struct objfile *objfile);
|
| +
|
| #endif /* !defined (OBJFILES_H) */
|
|
|