X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobjfiles.h;h=2de2f8d01fef5f9fc9cc7dbcf5e87d1cd9848dfe;hb=ce6d08922f2875544f9ba461a849726ceff84528;hp=6a9a2fdfe27ebcdeb613a3209f5ccc33a187cc8c;hpb=1706c1994444728a4648cedd3b38947748b9c3bf;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 6a9a2fdfe2..2de2f8d01f 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -1,8 +1,6 @@ /* Definitions for symbol file management in GDB. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1992-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -25,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; @@ -101,11 +101,17 @@ struct objfile_data; struct entry_info { - /* The relocated value we should use for this objfile entry point. */ + /* The unrelocated value we should use for this objfile entry point. */ CORE_ADDR entry_point; + /* The index of the section in which the entry point appears. */ + int the_bfd_section_index; + /* Set to 1 iff ENTRY_POINT contains a valid value. */ unsigned entry_point_p : 1; + + /* Set to 1 iff this object was initialized. */ + unsigned initialized : 1; }; /* Sections in an objfile. The section offsets are stored in the @@ -124,7 +130,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) \ @@ -161,6 +167,51 @@ 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; + + /* The per-objfile information about the entry point, the scope (file/func) + containing the entry point, and the scope of the user's main() func. */ + + struct entry_info ei; + + /* The name and language of any "main" found in this objfile. The + name can be NULL, which means that the information was not + recorded. */ + + const char *name_of_main; + enum language language_of_main; +}; + /* 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, @@ -173,30 +224,24 @@ struct objfile { /* All struct objfile's are chained together by their next pointers. - The global variable "object_files" points to the first link in this - chain. - - FIXME: There is a problem here if the objfile is reusable, and if - multiple users are to be supported. The problem is that the objfile - list is linked through a member of the objfile struct itself, which - is only valid for one gdb process. The list implementation needs to - be changed to something like: - - struct list {struct list *next; struct objfile *objfile}; - - where the list structure is completely maintained separately within - each gdb process. */ + The program space field "objfiles" (frequently referenced via + the macro "object_files") points to the first link in this + chain. */ 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; - /* Some flag bits for this objfile. */ + /* Some flag bits for this objfile. + The values are defined by OBJF_*. */ unsigned short flags; @@ -232,12 +277,10 @@ 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. */ @@ -253,15 +296,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. */ @@ -299,47 +333,18 @@ struct objfile const struct sym_fns *sf; - /* The per-objfile information about the entry point, the scope (file/func) - containing the entry point, and the scope of the user's main() func. */ - - 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. - Currently on the objfile_obstack (which makes no sense, but I'm - not sure it's harming anything). + The table is indexed by the_bfd_section->index, thus it is generally + as large as the number of sections in the binary. + The table is stored on the objfile_obstack. These offsets indicate that all symbols (including partial and minimal symbols) which have been read have been relocated by this - much. Symbols which are yet to be read need to be relocated by - it. */ + much. Symbols which are yet to be read need to be relocated by it. */ struct section_offsets *section_offsets; int num_sections; @@ -360,12 +365,12 @@ 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. Currently the table is stored on the - objfile_obstack (which makes no sense, but I'm not sure it's - harming anything). */ + 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; + struct obj_section *sections, *sections_end; /* GDB allows to have debug symbols in separate object files. This is used by .gnu_debuglink, ELF build id note and Mach-O OSO. @@ -387,7 +392,7 @@ struct objfile struct objfile *separate_debug_objfile_link; /* Place to stash various statistics about this objfile. */ - OBJSTATS; + OBJSTATS; /* A linked list of symbols created when reading template types or function templates. These symbols are not stored in any symbol @@ -434,39 +439,27 @@ struct objfile #define OBJF_PSYMTABS_READ (1 << 4) -/* The object file that contains the runtime common minimal symbols - for SunOS4. Note that this objfile has no associated BFD. */ +/* Set if this is the main symbol file + (as opposed to symbol file for dynamically loaded code). */ -extern struct objfile *rt_common_objfile; +#define OBJF_MAINLINE (1 << 5) -/* When we need to allocate a new type, we need to know which objfile_obstack - to allocate the type on, since there is one for each objfile. The places - where types are allocated are deeply buried in function call hierarchies - which know nothing about objfiles, so rather than trying to pass a - particular objfile down to them, we just do an end run around them and - set current_objfile to be whatever objfile we expect to be using at the - time types are being allocated. For instance, when we start reading - symbols for a particular objfile, we set current_objfile to point to that - objfile, and when we are done, we set it back to NULL, to ensure that we - never put a type someplace other than where we are expecting to put it. - FIXME: Maybe we should review the entire type handling system and - see if there is a better way to avoid this problem. */ +/* ORIGINAL_NAME and OBFD->FILENAME correspond to text description unrelated to + filesystem names. It can be for example "". */ -extern struct objfile *current_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); -extern int build_objfile_section_table (struct objfile *); +extern void build_objfile_section_table (struct objfile *); extern void terminate_minimal_symbol_table (struct objfile *objfile); @@ -475,8 +468,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 *); @@ -489,7 +480,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); @@ -501,8 +493,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. */ @@ -516,32 +513,42 @@ 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. */ - -/* 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 *)); - -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); - -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); +DECLARE_REGISTRY(objfile); + +/* 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); + +extern void default_iterate_over_objfiles_in_search_order + (struct gdbarch *gdbarch, + iterate_over_objfiles_in_search_order_cb_ftype *cb, + void *cb_data, struct objfile *current_objfile); /* Traverse all object files in the current program space. @@ -551,7 +558,7 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); /* 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; \ @@ -573,6 +580,12 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); #define ALL_OBJFILE_SYMTABS(objfile, s) \ for ((s) = (objfile) -> symtabs; (s) != NULL; (s) = (s) -> next) +/* Traverse all primary symtabs in one objfile. */ + +#define ALL_OBJFILE_PRIMARY_SYMTABS(objfile, s) \ + ALL_OBJFILE_SYMTABS ((objfile), (s)) \ + if ((s)->primary) + /* Traverse all minimal symbols in one objfile. */ #define ALL_OBJFILE_MSYMBOLS(objfile, m) \ @@ -595,13 +608,11 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); #define ALL_PRIMARY_SYMTABS(objfile, s) \ ALL_OBJFILES (objfile) \ - ALL_OBJFILE_SYMTABS (objfile, s) \ - if ((s)->primary) + ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s) #define ALL_PSPACE_PRIMARY_SYMTABS(pspace, objfile, s) \ ALL_PSPACE_OBJFILES (ss, objfile) \ - ALL_OBJFILE_SYMTABS (objfile, s) \ - if ((s)->primary) + ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s) /* Traverse all minimal symbols in all objfiles in the current symbol space. */ @@ -611,7 +622,12 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); 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. @@ -647,9 +663,7 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); ? ((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) \ @@ -678,4 +692,15 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd); #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); + +/* Set the objfile's notion of the "main" name and language. */ + +extern void set_objfile_main_name (struct objfile *objfile, + const char *name, enum language lang); + #endif /* !defined (OBJFILES_H) */