/* Definitions for reading symbol files into GDB.
- Copyright (C) 1990-2014 Free Software Foundation, Inc.
+ Copyright (C) 1990-2017 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"
+#include "symfile-add-flags.h"
+#include "objfile-flags.h"
+#include "gdb_bfd.h"
+#include "common/function-view.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;
+class probe;
/* 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
- malloc and grown as necessary via realloc. Each objfile typically
- has two of these, one for global symbols and one for static
- symbols. Although this adds a level of indirection for storing or
- accessing the partial symbols, it allows us to throw away duplicate
- psymbols and set all pointers to the single saved instance. */
-
-struct psymbol_allocation_list
+struct other_sections
{
+ CORE_ADDR addr;
+ char *name;
- /* Pointer to beginning of dynamically allocated array of pointers
- to partial symbols. The array is dynamically expanded as
- necessary to accommodate more pointers. */
-
- struct partial_symbol **list;
-
- /* Pointer to next available slot in which to store a pointer to a
- partial symbol. */
-
- struct partial_symbol **next;
-
- /* Number of allocated pointer slots in current dynamic array (not
- the number of bytes of storage). The "next" pointer will always
- point somewhere between list[0] and list[size], and when at
- list[size] the array will be expanded on the next attempt to
- store a pointer. */
-
- int size;
+ /* SECTINDEX must be valid for associated BFD or set to -1. */
+ int sectindex;
};
/* Define an array of addresses to accommodate non-contiguous dynamic
available. */
size_t num_sections;
/* 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];
+ struct other_sections other[1];
};
/* Callback for quick_symbol_functions->expand_symtabs_matching
to match a file name. */
-typedef int (expand_symtabs_file_matcher_ftype) (const char *filename,
- void *data, int basenames);
+typedef bool (expand_symtabs_file_matcher_ftype) (const char *filename,
+ bool basenames);
/* Callback for quick_symbol_functions->expand_symtabs_matching
to match a symbol name. */
-typedef int (expand_symtabs_symbol_matcher_ftype) (const char *name,
- void *data);
+typedef bool (expand_symtabs_symbol_matcher_ftype) (const char *name);
+
+/* Callback for quick_symbol_functions->expand_symtabs_matching
+ to be called after a symtab has been expanded. */
+
+typedef void (expand_symtabs_exp_notify_ftype) (compunit_symtab *symtab);
/* The "quick" symbol functions exist so that symbol readers can
avoiding an initial read of all the symbols. For example, symbol
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.
+ all newly-created symbol tables, passing CALLBACK 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);
+ bool (*map_symtabs_matching_filename)
+ (struct objfile *objfile, const char *name, const char *real_path,
+ gdb::function_view<bool (symtab *)> callback);
/* Check to see if the symbol is defined in a "partial" symbol table
of OBJFILE. BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
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
+ Returns the newly-expanded compunit 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 block_index, const char *name,
- domain_enum domain);
+ contains !TYPE_OPAQUE symbol prefer its compunit. If it contains
+ only TYPE_OPAQUE symbol(s), return at least that compunit. */
+ struct compunit_symtab *(*lookup_symbol) (struct objfile *objfile,
+ int block_index, 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
void (*expand_symtabs_with_fullname) (struct objfile *objfile,
const char *fullname);
- /* Find global or static symbols in all tables that are in NAMESPACE
+ /* Find global or static symbols in all tables that are in DOMAIN
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.
non-zero to indicate that the scan should be terminated. */
void (*map_matching_symbols) (struct objfile *,
- const char *name, domain_enum namespace,
+ const char *name, domain_enum domain,
int global,
int (*callback) (struct block *,
struct symbol *, void *),
void *data,
- symbol_compare_ftype *match,
+ symbol_name_match_type 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.
+ is passed to it. If the matcher returns false, the file is
+ skipped. If FILE_MATCHER is NULL the file is not skipped. If
+ BASENAMES is true the matcher should consider only file base
+ names (the passed file name is already only the lbasename'd
+ part).
- If even KIND matches, then SYMBOL_MATCHER is called for each symbol
- defined in the file. The symbol "search" name and DATA are passed
- to SYMBOL_MATCHER.
+ Otherwise, if KIND does not match, this symbol is skipped.
- If SYMBOL_MATCHER returns zero, then this symbol is skipped.
+ If even KIND matches, SYMBOL_MATCHER is called for each symbol
+ defined in the file. The symbol "search" name is passed to
+ SYMBOL_MATCHER.
- Otherwise, this symbol's symbol table is expanded.
+ If SYMBOL_MATCHER returns false, then the symbol is skipped.
- DATA is user data that is passed unmodified to the callback
- functions. */
+ Otherwise, the symbol's symbol table is expanded. */
void (*expand_symtabs_matching)
(struct objfile *objfile,
- expand_symtabs_file_matcher_ftype *file_matcher,
- expand_symtabs_symbol_matcher_ftype *symbol_matcher,
- 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
+ gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+ const lookup_name_info &lookup_name,
+ gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+ gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+ enum search_domain kind);
+
+ /* Return the comp unit from OBJFILE that contains PC and
+ SECTION. Return NULL if there is no such compunit. This
+ should return the compunit 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
+ compunit that contains a symbol whose address is closest to
PC. */
- struct symtab *(*find_pc_sect_symtab) (struct objfile *objfile,
- struct bound_minimal_symbol msymbol,
- CORE_ADDR pc,
- struct obj_section *section,
- int warn_if_readin);
+ struct compunit_symtab *(*find_pc_sect_compunit_symtab)
+ (struct objfile *objfile, struct bound_minimal_symbol msymbol,
+ CORE_ADDR pc, struct obj_section *section, int warn_if_readin);
+
+ /* Return the comp unit from OBJFILE that contains a symbol at
+ ADDRESS. Return NULL if there is no such comp unit. Unlike
+ find_pc_sect_compunit_symtab, any sort of symbol (not just text
+ symbols) can be considered, and only exact address matches are
+ considered. This pointer may be NULL. */
+ struct compunit_symtab *(*find_compunit_symtab_by_address)
+ (struct objfile *objfile, CORE_ADDR address);
/* 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
struct sym_probe_fns
{
- /* If non-NULL, return an array of probe objects.
-
- The returned value does not have to be freed and it has lifetime of the
- OBJFILE. */
- VEC (probe_p) *(*sym_get_probes) (struct objfile *);
+ /* If non-NULL, return a reference to vector of probe objects. */
+ const std::vector<probe *> &(*sym_get_probes) (struct objfile *);
};
/* Structure to keep track of symbol reading functions for various
file we are reading. SYMFILE_FLAGS are the flags passed to
symbol_file_add & co. */
- void (*sym_read) (struct objfile *, int);
+ void (*sym_read) (struct objfile *, symfile_add_flags);
/* 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
void (*sym_finish) (struct objfile *);
+
/* This function produces a file-dependent section_offsets
- structure, allocated in the objfile's storage, and based on the
- parameter. The parameter is currently a CORE_ADDR (FIXME!) for
- backward compatibility with the higher levels of GDB. It should
- probably be changed to a string, where NULL means the default,
- and others are parsed in a file dependent way. */
+ structure, allocated in the objfile's storage.
+
+ The section_addr_info structure contains the offset of loadable and
+ allocated sections, relative to the absolute offsets found in the BFD. */
void (*sym_offsets) (struct objfile *, const struct section_addr_info *);
extern bfd_byte *default_symfile_relocate (struct objfile *objfile,
asection *sectp, bfd_byte *buf);
-extern struct symtab *allocate_symtab (const char *, struct objfile *)
+extern struct symtab *allocate_symtab (struct compunit_symtab *, const char *)
ATTRIBUTE_NONNULL (1);
-extern void add_symtab_fns (enum bfd_flavour flavour, const struct sym_fns *);
-
-/* This enum encodes bit-flags passed as ADD_FLAGS parameter to
- symbol_file_add, etc. */
+extern struct compunit_symtab *allocate_compunit_symtab (struct objfile *,
+ const char *)
+ ATTRIBUTE_NONNULL (1);
-enum symfile_add_flags
- {
- /* Be chatty about what you are doing. */
- SYMFILE_VERBOSE = 1 << 1,
+extern void add_compunit_symtab_to_objfile (struct compunit_symtab *cu);
- /* This is the main symbol file (as opposed to symbol file for dynamically
- loaded code). */
- SYMFILE_MAINLINE = 1 << 2,
+extern void add_symtab_fns (enum bfd_flavour flavour, const struct sym_fns *);
- /* Do not call breakpoint_re_set when adding this symbol file. */
- SYMFILE_DEFER_BP_RESET = 1 << 3,
+extern void clear_symtab_users (symfile_add_flags add_flags);
- /* Do not immediately read symbols for this file. By default,
- symbols are read when the objfile is created. */
- SYMFILE_NO_READ = 1 << 4
- };
+extern enum language deduce_language_from_filename (const char *);
-extern void new_symfile_objfile (struct objfile *, int);
+/* Map the filename extension EXT to the language LANG. Any previous
+ association of EXT will be removed. EXT will be copied by this
+ function. */
+extern void add_filename_language (const char *ext, enum language lang);
-extern struct objfile *symbol_file_add (const char *, int,
- struct section_addr_info *, int);
+extern struct objfile *symbol_file_add (const char *, symfile_add_flags,
+ struct section_addr_info *, objfile_flags);
-extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int,
+extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, symfile_add_flags,
struct section_addr_info *,
- int, struct objfile *parent);
+ objfile_flags, struct objfile *parent);
-extern void symbol_file_add_separate (bfd *, const char *, int,
+extern void symbol_file_add_separate (bfd *, const char *, symfile_add_flags,
struct objfile *);
extern char *find_separate_debug_file_by_debuglink (struct objfile *);
extern void find_lowest_section (bfd *, asection *, void *);
-extern bfd *symfile_bfd_open (const char *);
-
-extern bfd *gdb_bfd_open_maybe_remote (const char *);
+extern gdb_bfd_ref_ptr symfile_bfd_open (const char *);
-extern int get_section_index (struct objfile *, char *);
+extern int get_section_index (struct objfile *, const char *);
extern int print_symbol_loading_p (int from_tty, int mainline, int full);
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
/* Load symbols from a file. */
-extern void symbol_file_add_main (const char *args, int from_tty);
+extern void symbol_file_add_main (const char *args,
+ symfile_add_flags add_flags);
/* Clear GDB symbol tables. */
extern void symbol_file_clear (int from_tty);
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);
+extern scoped_restore_tmpl<int> increment_reading_symtab (void);
-void expand_symtabs_matching (expand_symtabs_file_matcher_ftype *,
- expand_symtabs_symbol_matcher_ftype *,
- enum search_domain kind, void *data);
+void expand_symtabs_matching
+ (gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+ const lookup_name_info &lookup_name,
+ gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+ gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+ enum search_domain kind);
void map_symbol_filenames (symbol_filename_ftype *fun, void *data,
int need_fullname);
struct dwarf2_section_names abbrev;
struct dwarf2_section_names line;
struct dwarf2_section_names loc;
+ struct dwarf2_section_names loclists;
struct dwarf2_section_names macinfo;
struct dwarf2_section_names macro;
struct dwarf2_section_names str;
+ struct dwarf2_section_names line_str;
struct dwarf2_section_names ranges;
+ struct dwarf2_section_names rnglists;
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;
+ struct dwarf2_section_names debug_names;
+ struct dwarf2_section_names debug_aranges;
/* This field has no meaning, but exists solely to catch changes to
this structure which are not reflected in some instance. */
int sentinel;
asection **, const gdb_byte **,
bfd_size_type *);
-extern int dwarf2_initialize_objfile (struct objfile *);
+/* A DWARF names index variant. */
+enum class dw_index_kind
+{
+ /* GDB's own .gdb_index format. */
+ GDB_INDEX,
+
+ /* DWARF5 .debug_names. */
+ DEBUG_NAMES,
+};
+
+/* Initialize for reading DWARF for OBJFILE. Return false if this
+ file will use psymtabs, or true if using an index, in which case
+ *INDEX_KIND is set to the index variant in use. */
+extern bool dwarf2_initialize_objfile (struct objfile *objfile,
+ dw_index_kind *index_kind);
+
extern void dwarf2_build_psymtabs (struct objfile *);
extern void dwarf2_build_frame_info (struct objfile *);
/* From mdebugread.c */
-extern void mdebug_build_psymtabs (struct objfile *,
+extern void mdebug_build_psymtabs (minimal_symbol_reader &,
+ struct objfile *,
const struct ecoff_debug_swap *,
struct ecoff_debug_info *);
/* From minidebug.c. */
-extern bfd *find_separate_debug_file_in_section (struct objfile *);
+extern gdb_bfd_ref_ptr find_separate_debug_file_in_section (struct objfile *);
+
+/* True if we are printing debug output about separate debug info files. */
+
+extern int separate_debug_file_debug;
#endif /* !defined(SYMFILE_H) */