daily update
[external/binutils.git] / gdb / symfile.h
index efa069e..a8effda 100644 (file)
@@ -80,6 +80,8 @@ struct section_addr_info
   {
     CORE_ADDR addr;
     char *name;
+
+    /* SECTINDEX must be valid for associated BFD if ADDR is not zero.  */
     int sectindex;
   } other[1];
 };
@@ -109,6 +111,165 @@ struct symfile_segment_data
   int *segment_info;
 };
 
+/* The "quick" symbol functions exist so that symbol readers can
+   avoiding an initial read of all the symbols.  For example, symbol
+   readers might choose to use the "partial symbol table" utilities,
+   which is one implementation of the quick symbol functions.
+
+   The quick symbol functions are generally opaque: the underlying
+   representation is hidden from the caller.
+
+   In general, these functions should only look at whatever special
+   index the symbol reader creates -- looking through the symbol
+   tables themselves is handled by generic code.  If a function is
+   defined as returning a "symbol table", this means that the function
+   should only return a newly-created symbol table; it should not
+   examine pre-existing ones.
+
+   The exact list of functions here was determined in an ad hoc way
+   based on gdb's history.  */
+
+struct quick_symbol_functions
+{
+  /* Return true if this objfile has any "partial" symbols
+     available.  */
+  int (*has_symbols) (struct objfile *objfile);
+
+  /* Return the symbol table for the "last" file appearing in
+     OBJFILE.  */
+  struct symtab *(*find_last_source_symtab) (struct objfile *objfile);
+
+  /* Forget all cached full file names for OBJFILE.  */
+  void (*forget_cached_source_info) (struct objfile *objfile);
+
+  /* Look up the symbol table, in OBJFILE, of a source file named
+     NAME.  If there is no '/' in the name, a match after a '/' in the
+     symbol table's file name will also work.  FULL_PATH is the
+     absolute file name, and REAL_PATH is the same, run through
+     gdb_realpath.
+
+     If no such symbol table can be found, returns 0.
+
+     Otherwise, sets *RESULT to the symbol table and returns 1.  This
+     might return 1 and set *RESULT to NULL if the requested file is
+     an include file that does not have a symtab of its own.  */
+  int (*lookup_symtab) (struct objfile *objfile,
+                       const char *name,
+                       const char *full_path,
+                       const char *real_path,
+                       struct symtab **result);
+
+  /* Check to see if the symbol is defined in a "partial" symbol table
+     of OBJFILE.  KIND should be either GLOBAL_BLOCK or STATIC_BLOCK,
+     depending on whether we want to search global symbols or static
+     symbols.  NAME is the name of the symbol to look for.  DOMAIN
+     indicates what sort of symbol to search for.
+
+     Returns the newly-expanded symbol table in which the symbol is
+     defined, or NULL if no such symbol table exists.  */
+  struct symtab *(*lookup_symbol) (struct objfile *objfile,
+                                  int kind, const char *name,
+                                  domain_enum domain);
+
+  /* Print statistics about any indices loaded for OBJFILE.  The
+     statistics should be printed to gdb_stdout.  This is used for
+     "maint print statistics".  */
+  void (*print_stats) (struct objfile *objfile);
+
+  /* Dump any indices loaded for OBJFILE.  The dump should go to
+     gdb_stdout.  This is used for "maint print objfiles".  */
+  void (*dump) (struct objfile *objfile);
+
+  /* This is called by objfile_relocate to relocate any indices loaded
+     for OBJFILE.  */
+  void (*relocate) (struct objfile *objfile,
+                   struct section_offsets *new_offsets,
+                   struct section_offsets *delta);
+
+  /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
+     the corresponding symbol tables are loaded.  */
+  void (*expand_symtabs_for_function) (struct objfile *objfile,
+                                      const char *func_name);
+
+  /* Read all symbol tables associated with OBJFILE.  */
+  void (*expand_all_symtabs) (struct objfile *objfile);
+
+  /* Read all symbol tables associated with OBJFILE which have the
+     file name FILENAME.  */
+  void (*expand_symtabs_with_filename) (struct objfile *objfile,
+                                       const char *filename);
+
+  /* Return the file name of the file holding the symbol in OBJFILE
+     named NAME.  If no such symbol exists in OBJFILE, return NULL.  */
+  char *(*find_symbol_file) (struct objfile *objfile, const char *name);
+
+  /* This method is specific to Ada.  It walks the partial symbol
+     tables of OBJFILE looking for a name match.  WILD_MATCH and
+     IS_NAME_SUFFIX are predicate functions that the implementation
+     may call to check for a match.
+
+     This function is completely ad hoc and new implementations should
+     refer to the psymtab implementation to see what to do.  */
+  void (*map_ada_symtabs) (struct objfile *objfile,
+                          int (*wild_match) (const char *, int, const char *),
+                          int (*is_name_suffix) (const char *),
+                          void (*callback) (struct objfile *,
+                                            struct symtab *, void *),
+                          const char *name, int global,
+                          domain_enum namespace, int wild,
+                          void *data);
+
+  /* Expand all symbol tables in OBJFILE matching some criteria.
+
+     FILE_MATCHER is called for each file in OBJFILE.  The file name
+     and the DATA argument are passed to it.  If it returns zero, this
+     file is skipped.
+
+     Otherwise, if the file is not skipped, then NAME_MATCHER is
+     called for each symbol defined in the file.  The symbol's
+     "natural" name and DATA are passed to NAME_MATCHER.
+
+     If NAME_MATCHER returns zero, then this symbol is skipped.
+
+     Otherwise, if this symbol is not skipped, and it matches KIND,
+     then this symbol's symbol table is expanded.
+     
+     DATA is user data that is passed unmodified to the callback
+     functions.  */
+  void (*expand_symtabs_matching) (struct objfile *objfile,
+                                  int (*file_matcher) (const char *, void *),
+                                  int (*name_matcher) (const char *, void *),
+                                  domain_enum kind,
+                                  void *data);
+
+  /* Return the symbol table from OBJFILE that contains PC and
+     SECTION.  Return NULL if there is no such symbol table.  This
+     should return the symbol table that contains a symbol whose
+     address exactly matches PC, or, if there is no exact match, the
+     symbol table that contains a symbol whose address is closest to
+     PC.  */
+  struct symtab *(*find_pc_sect_symtab) (struct objfile *objfile,
+                                        struct minimal_symbol *msymbol,
+                                        CORE_ADDR pc,
+                                        struct obj_section *section,
+                                        int warn_if_readin);
+
+  /* Call a callback for every symbol defined in OBJFILE.  FUN is the
+     callback.  It is passed the symbol's natural name, and the DATA
+     passed to this function.  */
+  void (*map_symbol_names) (struct objfile *objfile,
+                           void (*fun) (const char *, void *),
+                           void *data);
+
+  /* Call a callback for every file defined in OBJFILE.  FUN is the
+     callback.  It is passed the file's name, the file's full name,
+     and the DATA passed to this function.  */
+  void (*map_symbol_filenames) (struct objfile *objfile,
+                               void (*fun) (const char *, const char *,
+                                            void *),
+                               void *data);
+};
+
 /* Structure to keep track of symbol reading functions for various
    object file types.  */
 
@@ -163,8 +324,19 @@ struct sym_fns
   /* This function should read the linetable from the objfile when
      the line table cannot be read while processing the debugging
      information.  */
+
   void (*sym_read_linetable) (void);
 
+  /* Relocate the contents of a debug section SECTP.  The
+     contents are stored in BUF if it is non-NULL, or returned in a
+     malloc'd buffer otherwise.  */
+
+  bfd_byte *(*sym_relocate) (struct objfile *, asection *sectp, bfd_byte *buf);
+
+  /* The "quick" (aka partial) symbol functions for this symbol
+     reader.  */
+  const struct quick_symbol_functions *qf;
+
   /* Finds the next struct sym_fns.  They are allocated and
      initialized in whatever module implements the functions pointed
      to; an initializer calls add_symtab_fns to add them to the global
@@ -195,6 +367,12 @@ extern void default_symfile_offsets (struct objfile *objfile,
 
 extern struct symfile_segment_data *default_symfile_segments (bfd *abfd);
 
+/* The default version of sym_fns.sym_relocate for readers that don't
+   do anything special.  */
+
+extern bfd_byte *default_symfile_relocate (struct objfile *objfile,
+                                           asection *sectp, bfd_byte *buf);
+
 extern void extend_psymbol_list (struct psymbol_allocation_list *,
                                 struct objfile *);
 
@@ -211,8 +389,6 @@ struct partial_symbol *add_psymbol_to_list (char *, int, int, domain_enum,
 
 extern void init_psymbol_list (struct objfile *, int);
 
-extern void sort_pst_symbols (struct partial_symtab *);
-
 extern struct symtab *allocate_symtab (char *, struct objfile *);
 
 extern void add_symtab_fns (struct sym_fns *);
@@ -374,8 +550,8 @@ extern void symbol_file_clear (int from_tty);
 /* Default overlay update function.  */
 extern void simple_overlay_update (struct obj_section *);
 
-extern bfd_byte *symfile_relocate_debug_section (bfd *abfd, asection *sectp,
-                                                bfd_byte * buf);
+extern bfd_byte *symfile_relocate_debug_section (struct objfile *, asection *,
+                                                bfd_byte *);
 
 extern int symfile_map_offsets_to_segments (bfd *,
                                            struct symfile_segment_data *,
@@ -384,6 +560,8 @@ extern int symfile_map_offsets_to_segments (bfd *,
 struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
 void free_symfile_segment_data (struct symfile_segment_data *data);
 
+extern struct cleanup *increment_reading_symtab (void);
+
 /* From dwarf2read.c */
 
 extern int dwarf2_has_info (struct objfile *);