/* Definitions for reading symbol files into GDB.
- Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 1990-2014 Free Software Foundation, Inc.
This file is part of GDB.
/* This file requires that you first include "bfd.h". */
#include "symtab.h"
+#include "probe.h"
/* Opaque declarations. */
struct target_section;
struct obj_section;
struct obstack;
struct block;
+struct probe;
+struct value;
+struct frame_info;
+struct agent_expr;
+struct axs_value;
+
+/* Comparison function for symbol look ups. */
+
+typedef int (symbol_compare_ftype) (const char *string1,
+ const char *string2);
/* Partial symbols are stored in the psymbol_cache and pointers to
them are kept in a dynamically grown array that is obtained from
/* The number of sections for which address information is
available. */
size_t num_sections;
- /* Sections whose names are file format dependent. */
+ /* Sections whose names are file format dependent. */
struct other_sections
{
CORE_ADDR addr;
char *name;
+
+ /* SECTINDEX must be valid for associated BFD or set to -1. */
int sectindex;
} other[1];
};
int *segment_info;
};
-/* Structure to keep track of symbol reading functions for various
- object file types. */
+/* Callback for quick_symbol_functions->map_symbol_filenames. */
-struct sym_fns
+typedef void (symbol_filename_ftype) (const char *filename,
+ const char *fullname, void *data);
+
+/* 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);
+
+ /* Expand and iterate over each "partial" symbol table in OBJFILE
+ where the source file is named NAME.
+
+ If NAME is not absolute, a match after a '/' in the symbol table's
+ file name will also work, REAL_PATH is NULL then. If NAME is
+ absolute then REAL_PATH is non-NULL absolute file name as resolved
+ via gdb_realpath from NAME.
+
+ If a match is found, the "partial" symbol table is expanded.
+ Then, this calls iterate_over_some_symtabs (or equivalent) over
+ all newly-created symbol tables, passing CALLBACK and DATA to it.
+ The result of this call is returned. */
+ int (*map_symtabs_matching_filename) (struct objfile *objfile,
+ const char *name,
+ const char *real_path,
+ int (*callback) (struct symtab *,
+ void *),
+ void *data);
+
+ /* 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. If OBJFILE
+ contains !TYPE_OPAQUE symbol prefer its symtab. If it contains
+ only TYPE_OPAQUE symbol(s), return at least that symtab. */
+ 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,
+ const struct section_offsets *new_offsets,
+ const 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
+ symtab_to_fullname equal to FULLNAME.
+ This is for the purposes of examining code only, e.g., expand_line_sal.
+ The routine may ignore debug info that is known to not be useful with
+ code, e.g., DW_TAG_type_unit for dwarf debug info. */
+ void (*expand_symtabs_with_fullname) (struct objfile *objfile,
+ const char *fullname);
+
+ /* Find global or static symbols in all tables that are in NAMESPACE
+ and for which MATCH (symbol name, NAME) == 0, passing each to
+ CALLBACK, reading in partial symbol tables as needed. Look
+ through global symbols if GLOBAL and otherwise static symbols.
+ Passes NAME, NAMESPACE, and DATA to CALLBACK with each symbol
+ found. After each block is processed, passes NULL to CALLBACK.
+ MATCH must be weaker than strcmp_iw_ordered in the sense that
+ strcmp_iw_ordered(x,y) == 0 --> MATCH(x,y) == 0. ORDERED_COMPARE,
+ if non-null, must be an ordering relation compatible with
+ strcmp_iw_ordered in the sense that
+ strcmp_iw_ordered(x,y) == 0 --> ORDERED_COMPARE(x,y) == 0
+ and
+ strcmp_iw_ordered(x,y) <= 0 --> ORDERED_COMPARE(x,y) <= 0
+ (allowing strcmp_iw_ordered(x,y) < 0 while ORDERED_COMPARE(x, y) == 0).
+ CALLBACK returns 0 to indicate that the scan should continue, or
+ non-zero to indicate that the scan should be terminated. */
+
+ void (*map_matching_symbols) (struct objfile *,
+ const char *name, domain_enum namespace,
+ int global,
+ int (*callback) (struct block *,
+ struct symbol *, void *),
+ void *data,
+ symbol_compare_ftype *match,
+ symbol_compare_ftype *ordered_compare);
+
+ /* 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. If FILE_MATCHER is NULL such file is not skipped.
+ If BASENAMES is non-zero the function should consider only base name of
+ DATA (passed file name is already only the lbasename part).
+
+ Otherwise, if KIND does not match this symbol is skipped.
+
+ If even KIND matches, then NAME_MATCHER is called for each symbol
+ defined in the file. The symbol "search" name and DATA are passed
+ to NAME_MATCHER.
+
+ If NAME_MATCHER returns zero, then this symbol is skipped.
+
+ Otherwise, 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 basenames),
+ int (*name_matcher) (const char *, void *),
+ enum search_domain 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 file defined in OBJFILE whose symtab is
+ not already read in. FUN is the callback. It is passed the file's
+ FILENAME, the file's FULLNAME (if need_fullname is non-zero), and
+ the DATA passed to this function. */
+ void (*map_symbol_filenames) (struct objfile *objfile,
+ symbol_filename_ftype *fun, void *data,
+ int need_fullname);
+};
+
+/* Structure of functions used for probe support. If one of these functions
+ is provided, all must be. */
+
+struct sym_probe_fns
{
+ /* If non-NULL, return an array of probe objects.
- /* BFD flavour that we handle, or (as a special kludge, see
- xcoffread.c, (enum bfd_flavour)-1 for xcoff). */
+ The returned value does not have to be freed and it has lifetime of the
+ OBJFILE. */
+ VEC (probe_p) *(*sym_get_probes) (struct objfile *);
- enum bfd_flavour sym_flavour;
+ /* Relocate the probe section of OBJFILE. */
+ void (*sym_relocate_probe) (struct objfile *objfile,
+ const struct section_offsets *new_offsets,
+ const struct section_offsets *delta);
+};
+
+/* Structure to keep track of symbol reading functions for various
+ object file types. */
+struct sym_fns
+{
/* Initializes anything that is global to the entire symbol table.
It is called during symbol_file_add, when we begin debugging an
entirely new program. */
void (*sym_init) (struct objfile *);
- /* sym_read (objfile, mainline) Reads a symbol file into a psymtab
+ /* sym_read (objfile, symfile_flags) Reads a symbol file into a psymtab
(or possibly a symtab). OBJFILE is the objfile struct for the
- file we are reading. MAINLINE is 1 if this is the main symbol
- table being read, and 0 if a secondary symbol file (e.g. shared
- library or dynamically loaded file) is being read. */
+ file we are reading. SYMFILE_FLAGS are the flags passed to
+ symbol_file_add & co. */
void (*sym_read) (struct objfile *, int);
+ /* Read the partial symbols for an objfile. This may be NULL, in which case
+ gdb has to check other ways if this objfile has any symbols. This may
+ only be non-NULL if the objfile actually does have debuginfo available.
+ */
+
+ void (*sym_read_psymbols) (struct objfile *);
+
/* Called when we are finished with an objfile. Should do all
cleanup that is specific to the object file format for the
particular objfile. */
probably be changed to a string, where NULL means the default,
and others are parsed in a file dependent way. */
- void (*sym_offsets) (struct objfile *, struct section_addr_info *);
+ void (*sym_offsets) (struct objfile *, const struct section_addr_info *);
/* This function produces a format-independent description of
the segments of ABFD. Each segment is a unit of the file
/* 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);
- /* 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
- chain. */
+ void (*sym_read_linetable) (struct objfile *);
- struct sym_fns *next;
+ /* 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);
+
+ /* If non-NULL, this objfile has probe support, and all the probe
+ functions referred to here will be non-NULL. */
+ const struct sym_probe_fns *sym_probe_fns;
+
+ /* The "quick" (aka partial) symbol functions for this symbol
+ reader. */
+ const struct quick_symbol_functions *qf;
};
+extern struct section_addr_info *
+ build_section_addr_info_from_objfile (const struct objfile *objfile);
+
+extern void relative_addr_info_to_section_offsets
+ (struct section_offsets *section_offsets, int num_sections,
+ const struct section_addr_info *addrs);
+
+extern void addr_info_make_relative (struct section_addr_info *addrs,
+ bfd *abfd);
+
/* The default version of sym_fns.sym_offsets for readers that don't
do anything special. */
extern void default_symfile_offsets (struct objfile *objfile,
- struct section_addr_info *);
+ const struct section_addr_info *);
/* The default version of sym_fns.sym_segments for readers that don't
do anything special. */
extern struct symfile_segment_data *default_symfile_segments (bfd *abfd);
-extern void extend_psymbol_list (struct psymbol_allocation_list *,
- struct objfile *);
-
-/* Add any kind of symbol to a psymbol_allocation_list. */
-
-/* #include "demangle.h" */
-
-extern const
-struct partial_symbol *add_psymbol_to_list (char *, int, domain_enum,
- enum address_class,
- struct psymbol_allocation_list *,
- long, CORE_ADDR,
- enum language, struct objfile *);
-
-extern void init_psymbol_list (struct objfile *, int);
-
-extern void sort_pst_symbols (struct partial_symtab *);
+/* The default version of sym_fns.sym_relocate for readers that don't
+ do anything special. */
-extern struct symtab *allocate_symtab (char *, struct objfile *);
+extern bfd_byte *default_symfile_relocate (struct objfile *objfile,
+ asection *sectp, bfd_byte *buf);
-extern int free_named_symtabs (char *);
+extern struct symtab *allocate_symtab (const char *, struct objfile *)
+ ATTRIBUTE_NONNULL (1);
-extern void add_symtab_fns (struct sym_fns *);
+extern void add_symtab_fns (enum bfd_flavour flavour, const struct sym_fns *);
/* This enum encodes bit-flags passed as ADD_FLAGS parameter to
- syms_from_objfile, symbol_file_add, etc. */
+ symbol_file_add, etc. */
enum symfile_add_flags
{
SYMFILE_MAINLINE = 1 << 2,
/* Do not call breakpoint_re_set when adding this symbol file. */
- SYMFILE_DEFER_BP_RESET = 1 << 3
- };
+ SYMFILE_DEFER_BP_RESET = 1 << 3,
-extern void syms_from_objfile (struct objfile *,
- struct section_addr_info *,
- struct section_offsets *, int, int);
+ /* Do not immediately read symbols for this file. By default,
+ symbols are read when the objfile is created. */
+ SYMFILE_NO_READ = 1 << 4
+ };
extern void new_symfile_objfile (struct objfile *, int);
-extern struct objfile *symbol_file_add (char *, int,
+extern struct objfile *symbol_file_add (const char *, int,
struct section_addr_info *, int);
-extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
+extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int,
struct section_addr_info *,
- int);
+ int, struct objfile *parent);
+
+extern void symbol_file_add_separate (bfd *, const char *, int,
+ struct objfile *);
+
+extern char *find_separate_debug_file_by_debuglink (struct objfile *);
/* Create a new section_addr_info, with room for NUM_SECTIONS. */
extern struct section_addr_info *alloc_section_addr_info (size_t
num_sections);
-/* Return a freshly allocated copy of ADDRS. The section names, if
- any, are also freshly allocated copies of those in ADDRS. */
-extern struct section_addr_info *(copy_section_addr_info
- (struct section_addr_info *addrs));
-
/* Build (allocate and populate) a section_addr_info struct from an
existing section table. */
extern void free_section_addr_info (struct section_addr_info *);
-extern struct partial_symtab *start_psymtab_common (struct objfile *,
- struct section_offsets *,
- char *, CORE_ADDR,
- struct partial_symbol **,
- struct partial_symbol **);
-
-/* Make a copy of the string at PTR with SIZE characters in the symbol
- obstack (and add a null character at the end in the copy). Returns
- the address of the copy. */
-
-extern char *obsavestring (const char *, int, struct obstack *);
-
-/* Concatenate strings S1, S2 and S3; return the new string. Space is
- found in the OBSTACKP */
-
-extern char *obconcat (struct obstack *obstackp, const char *, const char *,
- const char *);
-
/* Variables */
/* If non-zero, shared library symbols will be added automatically
extern int auto_solib_add;
-/* For systems that support it, a threshold size in megabytes. If
- automatically adding a new library's symbol table to those already
- known to the debugger would cause the total shared library symbol
- size to exceed this threshhold, then the shlib's symbols are not
- added. The threshold is ignored if the user explicitly asks for a
- shlib to be added, such as when using the "sharedlibrary" command. */
-
-extern int auto_solib_limit;
-
/* From symfile.c */
extern void set_initial_language (void);
-extern struct partial_symtab *allocate_psymtab (char *, struct objfile *);
-
-extern void discard_psymtab (struct partial_symtab *);
-
extern void find_lowest_section (bfd *, asection *, void *);
-extern bfd *symfile_bfd_open (char *);
+extern bfd *symfile_bfd_open (const char *);
+
+extern bfd *gdb_bfd_open_maybe_remote (const char *);
extern int get_section_index (struct objfile *, char *);
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
/* Load symbols from a file. */
-extern void symbol_file_add_main (char *args, int from_tty);
+extern void symbol_file_add_main (const char *args, int from_tty);
/* Clear GDB symbol tables. */
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 *,
+ const struct symfile_segment_data *,
struct section_offsets *,
int, const CORE_ADDR *);
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 *);
+/* Names for a dwarf2 debugging section. The field NORMAL is the normal
+ section name (usually from the DWARF standard), while the field COMPRESSED
+ is the name of compressed sections. If your object file format doesn't
+ support compressed sections, the field COMPRESSED can be NULL. Likewise,
+ the debugging section is not supported, the field NORMAL can be NULL too.
+ It doesn't make sense to have a NULL NORMAL field but a non-NULL COMPRESSED
+ field. */
+
+struct dwarf2_section_names {
+ const char *normal;
+ const char *compressed;
+};
+
+/* List of names for dward2 debugging sections. Also most object file formats
+ use the standardized (ie ELF) names, some (eg XCOFF) have customized names
+ due to restrictions.
+ The table for the standard names is defined in dwarf2read.c. Please
+ update all instances of dwarf2_debug_sections if you add a field to this
+ structure. It is always safe to use { NULL, NULL } in this case. */
+
+struct dwarf2_debug_sections {
+ struct dwarf2_section_names info;
+ struct dwarf2_section_names abbrev;
+ struct dwarf2_section_names line;
+ struct dwarf2_section_names loc;
+ struct dwarf2_section_names macinfo;
+ struct dwarf2_section_names macro;
+ struct dwarf2_section_names str;
+ struct dwarf2_section_names ranges;
+ struct dwarf2_section_names types;
+ struct dwarf2_section_names addr;
+ struct dwarf2_section_names frame;
+ struct dwarf2_section_names eh_frame;
+ struct dwarf2_section_names gdb_index;
+ /* This field has no meaning, but exists solely to catch changes to
+ this structure which are not reflected in some instance. */
+ int sentinel;
+};
+
+extern int dwarf2_has_info (struct objfile *,
+ const struct dwarf2_debug_sections *);
-extern void dwarf2_build_psymtabs (struct objfile *, int);
+/* Dwarf2 sections that can be accessed by dwarf2_get_section_info. */
+enum dwarf2_section_enum {
+ DWARF2_DEBUG_FRAME,
+ DWARF2_EH_FRAME
+};
+
+extern void dwarf2_get_section_info (struct objfile *,
+ enum dwarf2_section_enum,
+ asection **, const gdb_byte **,
+ bfd_size_type *);
+
+extern int dwarf2_initialize_objfile (struct objfile *);
+extern void dwarf2_build_psymtabs (struct objfile *);
extern void dwarf2_build_frame_info (struct objfile *);
void dwarf2_free_objfile (struct objfile *);
/* From mdebugread.c */
-/* Hack to force structures to exist before use in parameter list. */
-struct ecoff_debug_hack
-{
- struct ecoff_debug_swap *a;
- struct ecoff_debug_info *b;
-};
-
extern void mdebug_build_psymtabs (struct objfile *,
const struct ecoff_debug_swap *,
struct ecoff_debug_info *);
const struct ecoff_debug_swap *,
asection *);
+/* From minidebug.c. */
+
+extern bfd *find_separate_debug_file_in_section (struct objfile *);
+
#endif /* !defined(SYMFILE_H) */