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) */ |